diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..82f1eadc26f8c92c0fca0a4badf4b3026bf92451 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.DS_Store +/node_modules/ +/dist/ +npm-debug.log diff --git a/favicons.ico b/favicons.ico new file mode 100644 index 0000000000000000000000000000000000000000..c39c8c6e4d376724a28109b622286f7302ccb328 Binary files /dev/null and b/favicons.ico differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..f6e849e9a8f171e47cc852d5de57b0e3f8e416bd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3693 @@ +{ + "name": "shopping-fe", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + }, + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000756", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browserify-aes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", + "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000756", + "electron-to-chromium": "1.3.27" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000756", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000756", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000756.tgz", + "integrity": "sha1-6TimuZFjDzDSJj3TRYvrZdNiJos=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "1.0.2", + "color-convert": "1.9.0", + "color-string": "0.3.0" + } + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "0.11.4", + "css-color-names": "0.0.4", + "has": "1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "bytes": "3.0.0", + "compressible": "2.0.12", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", + "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crypto-browserify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", + "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", + "dev": true, + "requires": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-loader": { + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", + "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.0", + "source-list-map": "2.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "1.2.3", + "source-map": "0.5.7" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" + }, + "dependencies": { + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "0.11.23", + "through": "2.3.8" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz", + "integrity": "sha1-yVvzy6rEnclvHcbgclSfu2VMzSw=", + "dev": true, + "requires": { + "async": "1.5.2", + "loader-utils": "0.2.17", + "webpack-sources": "0.1.5" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "file-loader": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", + "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hogan": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hogan/-/hogan-1.0.2.tgz", + "integrity": "sha1-2NXlf64Od4ez4B4UJW+dWIoj0fA=", + "requires": { + "hogan.js": "3.0.2" + } + }, + "hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", + "requires": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "html-comment-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "html-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.1.tgz", + "integrity": "sha512-RxokXoxcsRSWcN553Ew+K0TUo68gQfmddTuUIZ4xRD8Ax1xXzX2UYQ3FC3D5MoRPGAdL1erWKeEFihDrrdxHiA==", + "dev": true, + "requires": { + "es6-templates": "0.2.3", + "fastparse": "1.1.1", + "html-minifier": "3.5.6", + "loader-utils": "1.1.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "html-minifier": { + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", + "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.11.0", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.1.6" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.6.tgz", + "integrity": "sha512-/rseyxEKEVMBo8279lqpoJgD6C/i/CIi+9TJDvWmb+Xo6mqMKwjA8Io3IMHlcXQzj99feR6zrN8m3wqqvm/nYA==", + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.6.1" + } + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.6", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "6.0.13" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", + "dev": true + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "1.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-base64": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", + "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "macaddress": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", + "dev": true + }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-libs-browser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", + "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pbkdf2-compat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "uniqid": "4.1.1" + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.1" + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" + } + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "dev": true, + "requires": { + "postcss": "6.0.13" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.13" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "dev": true, + "requires": { + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.13" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "dev": true, + "requires": { + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.13" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "postcss": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.13.tgz", + "integrity": "sha512-nHsrD1PPTMSJDfU+osVsLtPkSP9YGeoOz4FDLN4r1DW4N5vqL1J+gACzTQHsfwIiWG/0/nV4yCzjTMo1zD8U1g==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "5.2.18" + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "1.0.1", + "postcss": "5.2.18", + "uniqs": "2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.1", + "utila": "0.4.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "ripemd160": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.3.0" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", + "dev": true + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.1.0" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.1.9" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", + "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=", + "dev": true + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "style-loader": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", + "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqid": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "requires": { + "macaddress": "0.2.8" + } + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.4.1", + "schema-utils": "0.3.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", + "dev": true, + "requires": { + "async": "0.9.2", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "webpack": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", + "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", + "dev": true, + "requires": { + "acorn": "3.3.0", + "async": "1.5.2", + "clone": "1.0.2", + "enhanced-resolve": "0.9.1", + "interpret": "0.6.6", + "loader-utils": "0.2.17", + "memory-fs": "0.3.0", + "mkdirp": "0.5.1", + "node-libs-browser": "0.7.0", + "optimist": "0.6.1", + "supports-color": "3.2.3", + "tapable": "0.1.10", + "uglify-js": "2.7.5", + "watchpack": "0.2.9", + "webpack-core": "0.6.9" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.4.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + } + } + }, + "webpack-dev-server": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.15.2.tgz", + "integrity": "sha1-0ac7jy35gxL4tSDjFqgMclkyISk=", + "dev": true, + "requires": { + "compression": "1.7.1", + "connect-history-api-fallback": "1.4.0", + "express": "4.16.2", + "http-proxy-middleware": "0.17.4", + "open": "0.0.5", + "optimist": "0.6.1", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "stream-cache": "0.0.2", + "strip-ansi": "3.0.1", + "supports-color": "3.2.3", + "webpack-dev-middleware": "1.12.0" + } + }, + "webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.5.7" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.2" + } + }, + "websocket-extensions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", + "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", + "dev": true + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..52da9bfdd4ee38cc036825a138532710c9e89ddc --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "shopping-fe", + "version": "1.0.0", + "description": "Shoppin前端代码", + "main": "index.js", + "scripts": { + "dev": "WEBPACK_ENV=dev webpack-dev-server --inline --port 8088", + "dev_win": "set WEBPACK_ENV=dev && webpack-dev-server --inline --port 8088", + "dist": "WEBPACK_ENV=online webpack -p", + "dist_win": "set WEBPACK_ENV=online && webpack -p" + }, + "author": "shizhijie", + "license": "ISC", + "repository": { + "type": "git", + "url": "git@gitee.com:ShoppingProjects/Shopping_fe.git" + }, + "devDependencies": { + "css-loader": "^0.28.7", + "extract-text-webpack-plugin": "^1.0.1", + "file-loader": "^1.1.5", + "html-loader": "^0.5.1", + "html-webpack-plugin": "^2.30.1", + "style-loader": "^0.19.0", + "url-loader": "^0.6.2", + "webpack": "^1.15.0", + "webpack-dev-server": "^1.15.2" + }, + "dependencies": { + "font-awesome": "^4.7.0", + "hogan": "^1.0.2" + } +} diff --git a/src/image/banner/banner1.jpg b/src/image/banner/banner1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09ee34ad95bc3d9335d224c212c60e6879bdb842 Binary files /dev/null and b/src/image/banner/banner1.jpg differ diff --git a/src/image/banner/banner2.jpg b/src/image/banner/banner2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d4cae3a9054ade25d4ffcfaa44a0bd00b9df719b Binary files /dev/null and b/src/image/banner/banner2.jpg differ diff --git a/src/image/banner/banner3.jpg b/src/image/banner/banner3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2b869395b0e5d247c0cff882827c90d22489715 Binary files /dev/null and b/src/image/banner/banner3.jpg differ diff --git a/src/image/banner/banner4.jpg b/src/image/banner/banner4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89edd02e3a2f282fb242a1ca0cbb9761a77684a6 Binary files /dev/null and b/src/image/banner/banner4.jpg differ diff --git a/src/image/banner/banner5.jpg b/src/image/banner/banner5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c1674654e937a7ff8664e03cf81496159b349add Binary files /dev/null and b/src/image/banner/banner5.jpg differ diff --git a/src/image/floor1-1.jpg b/src/image/floor1-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b304bfe78c9f1be26ec18ee5ea08dd186981075d Binary files /dev/null and b/src/image/floor1-1.jpg differ diff --git a/src/image/floor1-2.jpg b/src/image/floor1-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cde76db834b48c3d0b498e90075927503520d08b Binary files /dev/null and b/src/image/floor1-2.jpg differ diff --git a/src/image/floor1-3.jpg b/src/image/floor1-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68ef44d1b7b99dce173d06107dbc6c7cde130cc1 Binary files /dev/null and b/src/image/floor1-3.jpg differ diff --git a/src/image/floor1-4.jpg b/src/image/floor1-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c801f67b780fd80d861eca8e68dbb9c01bc421ac Binary files /dev/null and b/src/image/floor1-4.jpg differ diff --git a/src/image/floor1-5.jpg b/src/image/floor1-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..754dceba0c16cd960bb419852c8be8da3430a2a8 Binary files /dev/null and b/src/image/floor1-5.jpg differ diff --git a/src/image/floor2-1.jpg b/src/image/floor2-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c706fa8b135e9f81121cf6e528ea47f9d4d788e0 Binary files /dev/null and b/src/image/floor2-1.jpg differ diff --git a/src/image/floor2-2.jpg b/src/image/floor2-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d1e9aa1ec5b38ccffff0eaba7e1365880524eb4 Binary files /dev/null and b/src/image/floor2-2.jpg differ diff --git a/src/image/floor2-3.jpg b/src/image/floor2-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..314d196b99059c9fd2d82a82b78cd5540579e810 Binary files /dev/null and b/src/image/floor2-3.jpg differ diff --git a/src/image/floor2-4.jpg b/src/image/floor2-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db847169f085b1db10bddbc9983ee68ef8f0b71c Binary files /dev/null and b/src/image/floor2-4.jpg differ diff --git a/src/image/floor2-5.jpg b/src/image/floor2-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ffcb074939e9d1a4c59ac52f732beebbea5aad0 Binary files /dev/null and b/src/image/floor2-5.jpg differ diff --git a/src/image/floor3-1.jpg b/src/image/floor3-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4938c23854b8cfc7a77ae1f04f5ab09f036badc Binary files /dev/null and b/src/image/floor3-1.jpg differ diff --git a/src/image/floor3-2.jpg b/src/image/floor3-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4911bfcc9ad83e98bd562d074db7e661187f8d9e Binary files /dev/null and b/src/image/floor3-2.jpg differ diff --git a/src/image/floor3-3.jpg b/src/image/floor3-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0486de310365853e1bfc5532708274adefcdae8 Binary files /dev/null and b/src/image/floor3-3.jpg differ diff --git a/src/image/floor3-4.jpg b/src/image/floor3-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5219b5ac69203b18f7d6faa97eee258b09f32767 Binary files /dev/null and b/src/image/floor3-4.jpg differ diff --git a/src/image/floor3-5.jpg b/src/image/floor3-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f415fec3b0454f40d15228417d2c6b8df7932c3f Binary files /dev/null and b/src/image/floor3-5.jpg differ diff --git a/src/image/floor4-1.jpg b/src/image/floor4-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c82d930a7c6fe529cc07d00d293d4ab9022d5b1b Binary files /dev/null and b/src/image/floor4-1.jpg differ diff --git a/src/image/floor4-2.jpg b/src/image/floor4-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e7bfee5cc74d0c814a0bd6841e8c639508a809a Binary files /dev/null and b/src/image/floor4-2.jpg differ diff --git a/src/image/floor4-3.jpg b/src/image/floor4-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b7da3618b362eadec2b5f92415f055ff9ba1938 Binary files /dev/null and b/src/image/floor4-3.jpg differ diff --git a/src/image/floor4-4.jpg b/src/image/floor4-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c60f205d95738efbaf8e8b09638a15baefdcbf0a Binary files /dev/null and b/src/image/floor4-4.jpg differ diff --git a/src/image/floor4-5.jpg b/src/image/floor4-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a73b968ca7f12022dd87e4968594e61ea37def68 Binary files /dev/null and b/src/image/floor4-5.jpg differ diff --git a/src/image/floor5-1.jpg b/src/image/floor5-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1723fe8c7496eec2bea33006286a9ecb1316be75 Binary files /dev/null and b/src/image/floor5-1.jpg differ diff --git a/src/image/floor5-2.jpg b/src/image/floor5-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f87f578740bd60d3717427619b3697d2cddc8540 Binary files /dev/null and b/src/image/floor5-2.jpg differ diff --git a/src/image/floor5-3.jpg b/src/image/floor5-3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68cde6d59f496b70591d48f4bd10d32ab9cb10ad Binary files /dev/null and b/src/image/floor5-3.jpg differ diff --git a/src/image/floor5-4.jpg b/src/image/floor5-4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c41f5e24a03e4efdc9b36a310696290f7df0537 Binary files /dev/null and b/src/image/floor5-4.jpg differ diff --git a/src/image/floor5-5.jpg b/src/image/floor5-5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48df7cb27ca148ba18a872282d356aabb89a6d3b Binary files /dev/null and b/src/image/floor5-5.jpg differ diff --git a/src/image/loading.gif b/src/image/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..92c5c30cadc2879350d5516c859fa3f49ba8629a Binary files /dev/null and b/src/image/loading.gif differ diff --git a/src/page/about/index.js b/src/page/about/index.js new file mode 100644 index 0000000000000000000000000000000000000000..5467085853cd35559fbd6fcf59a9b1d67a67749e --- /dev/null +++ b/src/page/about/index.js @@ -0,0 +1,9 @@ +/* +* @Author: root +* @Date: 2017-12-09 16:06:09 +* @Last Modified by: root +* @Last Modified time: 2017-12-09 16:08:36 +*/ +'use strict'; +require('page/common/nav/index.js'); +require('page/common/header/index.js'); \ No newline at end of file diff --git a/src/page/cart/index.css b/src/page/cart/index.css new file mode 100644 index 0000000000000000000000000000000000000000..dc52bfa6323a7636eabde9c2c38ee902bb8a751f --- /dev/null +++ b/src/page/cart/index.css @@ -0,0 +1,123 @@ +/* +* @Author: root +* @Date: 2017-11-27 21:32:00 +* @Last Modified by: root +* @Last Modified time: 2017-11-27 22:56:00 +*/ +.cart-table{ + width: 100%; + border-collapse: collapse; + border: 1px solid #ebebeb; + margin-bottom: 10px; +} +/* header */ +.cart-header{ + background: #eee; +} +.cart-header .cart-cell{ + height: 40px; + line-height: 40px; +} +.cart-table .cell-check{ + width: 6%; + text-align: center; + padding-left: 20px; +} +.cart-table .cell-img{ + text-align: left; + width: 10%; +} +.cart-table .cell-img .p-img{ + margin:10px 0; + width: 80px; + height: 80px; + border: 1px solid #ddd; +} +.cart-table .cell-info{ + text-align: left; + width: 35%; +} +.cart-header .cell-info{ + padding-left: 106px; + width: 45%; +} +.cart-table .cell-price{ + text-align: center; + width: 10%; +} +.cart-table .cell-count{ + text-align: center; + width: 14%; +} +.cart-table .cell-total{ + text-align: center; + width: 15%; + font-weight: bold; +} +.cart-table .cell-opera{ + width: 10%; + text-align: center; +} +.cart-table .cell-count .count-input{ + width: 60px; + height: 28px; + line-height: 28px; + border: 1px solid #ddd; + text-align: center; + vertical-align: middle; + outline: none; + color: #333; +} +.cart-table .cell-count .count-btn{ + display: inline-block; + width: 20px; + height: 28px; + line-height: 28px; + border: 1px solid #ddd; + cursor: pointer; + background: #fff; + -moz-user-select:none; + -webkit-user-select:none; + user-select:none; +} +/* footer */ +.cart-footer{ + position: relative; + line-height: 50px; + background: #eee; + overflow: hidden; +} +.cart-footer .select-con{ + float: left; + padding-left: 20px; +} +.cart-footer .delete-con{ + float: left; + + margin-left:20px; +} +.cart-footer .submit-con{ + float:right; +} +.cart-footer .submit-con .submit-total{ + font-size: 18px; + color: #c60023; + font-weight: bold; + margin-right: 30px; +} +.cart-footer .submit-con .btn-submit{ + height: 50px; + width: 80px; + line-height: 50px; + text-align: center; +} +.err-tip{ + padding:0 10px; + height: 40px; + line-height: 60px; + color: #f60; + font-size: 16px; + font-weight: bold; + text-align: center; + background: #eee; +} \ No newline at end of file diff --git a/src/page/cart/index.js b/src/page/cart/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4d228a7931d31ac48156295828281e2d1c4da8bf --- /dev/null +++ b/src/page/cart/index.js @@ -0,0 +1,185 @@ +/* +* @Author: root +* @Date: 2017-11-27 21:31:52 +* @Last Modified by: root +* @Last Modified time: 2017-11-29 21:06:44 +*/ +'user strict' +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var _cart = require('service/cart-service.js'); +var templateIndex = require('./index.string'); +var nav = require('page/common/nav/index.js'); +var page = { + data : { + + }, + init : function(){ + this.onload(); + this.bindEvent(); + }, + onload : function(){ + + this.loadCart(); + }, + bindEvent : function(){ + var _this = this; + //商品的选择 /取消选择 + $(document).on('click', '.cart-select', function(){ + var $this = $(this), + productId = $this.parents('.cart-table').data('product-id'); + // 切换选中状态 + if ($this.is(':checked')) { + _cart.selectProduct(productId,function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + } + //取消选中 + else { + _cart.unselectProduct(productId,function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + } + }); + + //商品的全选 /取消全选 + $(document).on('click', '.cart-select-all', function(){ + var $this = $(this); + // 全选 + if ($this.is(':checked')) { + _cart.selectAllProduct(function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + } + //取消全选 + else { + _cart.unselectAllProduct(function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + } + }); + //商品数量的变化 + $(document).on('click', '.count-btn', function(){ + + var $this = $(this), + $pCount = $this.siblings('.count-input'), + currCount = parseInt($pCount.val()), + type = $this.hasClass('plus') ? 'plus' : 'minus', + productId = $this.parents('.cart-table').data('product-id'), + minCount = 1, + maxCount = parseInt($pCount.data('max')), + newCount = 0; + if(type === 'plus'){ + if(currCount >= maxCount){ + _utils.errorTips('该商品数量已达到上限'); + return; + } + newCount = currCount + 1; + }else if(type === 'minus'){ + if(currCount <= minCount){ + return; + } + newCount = currCount - 1; + } + //更新商品数量 + _cart.updateProduct({ + productId : productId, + count : newCount + },function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + }); + //删除单个商品 + $(document).on('click', '.cart-delete', function(){ + if (window.confirm("确定要删除商品?")) { + var productId = $(this).parents('.cart-table').data('product-id'); + _this.deleteCartProduct(productId); + }; + }); + //删除多个商品 + $(document).on('click', '.delete-selected', function(){ + + if (window.confirm("确定要删除选中商品?")) { + var arrProduIds = [], + $selecttedItem = $('.cart-select:checked'); + //循环查找选中的productIds + for(var i=0,iLength = $selecttedItem.length; i < iLength ; i++){ + arrProduIds. + push($($selecttedItem[i].parents('.vsty-table').data('product-id'))); + } + if(arrproductIds.length){ + _this.deleteCartProduct(arrproductIds.join(',')); + } + else { + _utils.errorTips('您还没有选中要删除的商品'); + } + + }; + }); + //结算 + $(document).on('click', '.btn-submit', function(){ + // 总价大于0,进行提交 + if(_this.data.carInfo && _this.data.carInfo.cartTotalPrice > 0){ + window.location.href = './order-confirm.html'; + }else{ + _utils.errorTips('请选择商品后再提交'); + } + }); + + }, + //加载购物车信息 + loadCart : function(){ + var _this = this; + _cart.getCartList(function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }); + }, + //删除指定的商品,支持批量 , productId 用逗号分隔 + deleteCartProduct : function (productIds){ + var _this = this; + _cart.deleteProduct(productIds,function(res){ + _this.renderCart(res); + },function(errMsg){ + _this.showCartError(); + }) + }, + //数据匹配 + filter : function(data){ + data.notEmpty = !!data.cartProductVoList.length; + }, + //渲染购物车 + renderCart : function(data){ + this.filter(data); + //缓存购物车信息 + this.data.carInfo = data; + //生成html + var cartHtml = _utils.renderHtml(templateIndex,data); + $('.page-wrap').html(cartHtml); + nav.loadCartCount(); + //通知导航条模块更新购物车数量 + }, + //显示错误信息 + showCartError : function(){ + $('.page-wrap').html('

哪里不对了,刷新下试试吧

'); + } + + +}; + +$(function(){ + page.init(); +}); diff --git a/src/page/cart/index.string b/src/page/cart/index.string new file mode 100644 index 0000000000000000000000000000000000000000..d1dfc952d22242f54676890bb856f1e34cae5f1a --- /dev/null +++ b/src/page/cart/index.string @@ -0,0 +1,92 @@ + {{#notEmpty}} +
+ + + + + + + + + +
+ + 商品信息单价数量合计操作
+
+
+ {{#cartProductVoList}} + + + + + + + + + + +
+ + + + {{productName}} + + + + {{productName}} + + ¥{{productPrice}}{{productTotalPrice}} + + - + + + + + 删除 +
+ {{/cartProductVoList}} +
+ +

+ 您的购物车空空如也, + 立即去购物 +

+ {{/notEmpty}} diff --git a/src/page/common/footer/index.css b/src/page/common/footer/index.css new file mode 100644 index 0000000000000000000000000000000000000000..9e834900f369b8e645e9e2846a1dd8ec9b688ac3 --- /dev/null +++ b/src/page/common/footer/index.css @@ -0,0 +1,23 @@ + + +/* +* @Author: root +* @Date: 2017-11-04 22:42:03 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 21:42:24 +*/ +.footer{ + padding-bottom: 10px; +} +.footer .links{ + text-align: center; + color: #666; + line-height: 30px; +} +.footer .links .link{ + padding:0 10px; +} +.footer .copyright{ + text-align: center; + line-height: 30px; +} \ No newline at end of file diff --git a/src/page/common/header/index.css b/src/page/common/header/index.css new file mode 100644 index 0000000000000000000000000000000000000000..ac0c407d82a7f3cb5bd119301eecd24d43b1af62 --- /dev/null +++ b/src/page/common/header/index.css @@ -0,0 +1,48 @@ +/* +* @Author: root +* @Date: 2017-11-05 13:34:24 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 22:01:53 +*/ +/*通用头部导航*/ +.header .logo{ + position: absolute; + left: 50px; + top: 33px; + display: block; + font-size: 38px; + font-weight: bolder; + color: #c60023; + text-decoration: none; +} + +.header .search-con{ + /*顺时针方向*/ + padding: 40px 0 30px 250px; +} +.header .search-con .search-input{ + width: 550px; + height:40px; + line-height: 40px; + padding-left: 10px; + font-size: 15px; + border: 2px solid #c60023; + /*去掉input输入框的样式*/ + outline: none; +} +.header .search-con .search-btn{ + position: absolute; + width: 120px; + height:44px; +} + +/*面包屑导航*/ +.crumb{ + margin-bottom: 15px; + height: 50px; + line-height: 50px; + background: #eee; + color: #888; + font-size: 14px; + border-top: 2px solid #c60023; +} \ No newline at end of file diff --git a/src/page/common/header/index.js b/src/page/common/header/index.js new file mode 100644 index 0000000000000000000000000000000000000000..b52628327ab311e7e53eee779ed4f31acf7f53e7 --- /dev/null +++ b/src/page/common/header/index.js @@ -0,0 +1,54 @@ +/* +* @Author: root +* @Date: 2017-11-05 13:34:13 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 18:10:44 +*/ +'use strict' +require('./index.css'); + +var _util = require('util/util.js'); + +// 通用页面头部 +var header = { + init : function(){ + this.onload(); + this.bindEvent(); + }, + //数据回填 + onload : function(){ + var keyword = _util.getUrlParam('keyword'); + //数据存在则回填数据 + if (keyword) { + $('#search-input').val(keyword); + } + //如果keyword为空则直接返回首页 + + } + , + //点击事件 + bindEvent : function(){ + //点击搜索按钮以后,做搜索提交 + var _this = this; + $("#search-btn").click(function(){ + _this.seachSumit(); + }); + //输入回车后做提交 + $("#search-input").keyup(function(e){ + if (e.keyCode) { + //判断是否是回车 + if (e.keyCode===13) { + _this.searchSubmit(); + } + } + }); + }, + //搜索的提交 + seachSumit : function(){ + var keyword = $.trim($('#search-input').val()); + window.location.href = './list.html?keyword='+keyword+''; + } +}; + + +header.init(); \ No newline at end of file diff --git a/src/page/common/index.js b/src/page/common/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f3da3f48d4191ff03b4b68af90b14d3ae55d50e0 --- /dev/null +++ b/src/page/common/index.js @@ -0,0 +1,12 @@ +/* +* @Author: root +* @Date: 2017-10-30 21:59:04 +* @Last Modified by: root +* @Last Modified time: 2017-11-04 22:50:43 +*/ +'use strict' +require('./layout.css'); +//图标加载 +require('node_modules/font-awesome/css/font-awesome.min.css'); + +require('./footer/index.css'); \ No newline at end of file diff --git a/src/page/common/layout.css b/src/page/common/layout.css new file mode 100644 index 0000000000000000000000000000000000000000..ab1bfc81eb5fa0e3c94474e39f81c0c9e9025866 --- /dev/null +++ b/src/page/common/layout.css @@ -0,0 +1,111 @@ +/* +* @Author: root +* @Date: 2017-11-02 22:33:47 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 22:29:57 +*/ +/* css reset*/ +*{ + margin: 0; + padding: 0; +} +body{ + background: #f6f6f6; + font: 12px/1.5 tahoma,arial,Microsoft YaHei,sans-serif; +} +li{ + list-style: none;; +} +img{ + display: block; + bottom: none ; +} +label{ + cursor: pointer; +} +input[type='checbox']{ + cursor: pointer; +} +/*定宽布局*/ +.w{ + width: 1080px; + margin: 0px auto; + position: relative; + overflow: hidden; + +} + +/* panel */ +.panel{ + padding: 10px; + margin-bottom: 10px; + background: #fff; + +} +.panel .panel-title{ + padding: 10px; + font-size: 14px; + color: #666; + font-weight: bold; + border-bottom: 1px solid #eee; + overflow: hidden; +} +.panel .panel-body{ + padding: 10px; + overflow: hidden; +} + +.large .w{ + width: 1600px; +} +/*全局通用样式*/ +.hide{ + display: none; +} +/*超链样式*/ +.link{ + color:#999; + cursor: pointer; + text-decoration:none; +} +.link:hover{ + color: #e80012; +} +.link-text{ + color: #999; + text-decoration: none; +} +/* btn */ +.btn{ + display: inline-block; + padding: 0 20px; + height: 40px; + line-height: 40px; + vertical-align: middle; + border: none; + background: #c60023; + font-size:17px; + font-weight: bold; + color: #fff; + outline:none; + cursor: pointer; + text-decoration: none; +} +.btn-mini{ + height: 25px; + line-height: 25px; + font-size: 12px; + padding: 0 10px; +} +/* loading */ +.loading{ + margin:10px auto; + display: block; + width: 100px; + height: 100px; + background:url(../../image/loading.gif) no-repeat; + /*border:1px solid #ddd;*/ + border-radius: 5px; + opacity: .6; +} + diff --git a/src/page/common/nav-side/index.css b/src/page/common/nav-side/index.css new file mode 100644 index 0000000000000000000000000000000000000000..dc66f634eaa1f4c4a365308d620091baa7036cd8 --- /dev/null +++ b/src/page/common/nav-side/index.css @@ -0,0 +1,30 @@ + +/* +* @Author: root +* @Date: 2017-11-05 16:18:28 +* @Last Modified by: root +* @Last Modified time: 2017-12-06 23:19:07 +*/ +/*导航主体*/ +.nav-side { + float: left; + width: 130px; + min-height: 100px; + +} +.nav-side .nav-item { + line-height: 25px; + font-size: 13px; +} + +.nav-side .nav-item .link{ + color: #888; +} +.nav-side .nav-item.active .link{ + color: #c60023; +} +/*右侧内容区*/ +.content.with-nav { + float: left; + width: 950px; +} diff --git a/src/page/common/nav-side/index.js b/src/page/common/nav-side/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ac5d49ede079dcdef3121b1f4566d63af75f6f48 --- /dev/null +++ b/src/page/common/nav-side/index.js @@ -0,0 +1,43 @@ +/* +* @Author: root +* @Date: 2017-11-05 16:16:48 +* @Last Modified by: root +* @Last Modified time: 2017-11-05 18:37:47 +*/ +'use strict'; +require('./index.css'); +var _util = require('util/util.js'); +var templateIndex = require('./index.string'); +// 导航 +var navSide = { + option : { + name : '', + navList : [ + {name : 'user-center', desc : '个人中心', href: './user-center.html'}, + {name : 'order-list', desc : '我的订单', href: './order-list.html'}, + {name : 'user-pass-update', desc : '修改密码', href: './user-pass-update.html'}, + {name : 'about', desc : '关于SHOP', href: './about.html'} + ] + }, + init : function(option){ + $.extend(this.option,option); + this.renderNav(); + }, + // 渲染导航菜单 + renderNav : function(){ + // 计算active数据 + for(var i = 0, iLength = this.option.navList.length; i < iLength; i++){ + if(this.option.navList[i].name === this.option.name){ + this.option.navList[i].isActive = true; + } + }; + // 渲染list数据 + var navHtml = _util.renderHtml(templateIndex, { + navList : this.option.navList + }); + // 把html放入容器 + $('.nav-side').html(navHtml); + } +}; + +module.exports = navSide; \ No newline at end of file diff --git a/src/page/common/nav-side/index.string b/src/page/common/nav-side/index.string new file mode 100644 index 0000000000000000000000000000000000000000..150f1d8ba04424e8015fe51937cb19a244a1ef6b --- /dev/null +++ b/src/page/common/nav-side/index.string @@ -0,0 +1,10 @@ +{{#navList}} +{{#isActive}} + +{{/navList}} \ No newline at end of file diff --git a/src/page/common/nav-simple/index.css b/src/page/common/nav-simple/index.css new file mode 100644 index 0000000000000000000000000000000000000000..90e8138ebf0f59a01a07900b4815ae322889c3f4 --- /dev/null +++ b/src/page/common/nav-simple/index.css @@ -0,0 +1,18 @@ +/* +* @Author: root +* @Date: 2017-11-03 17:15:55 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 20:40:17 +*/ +.nav-simple{ + height:60px; + line-height:60px; + border-bottom:1px solid #ddd; + background: #fff; +} +.nav-simple .logo{ + font-size: 26px; + font-weight: bolder; + color: #c60023; + text-decoration: none; +} diff --git a/src/page/common/nav-simple/index.js b/src/page/common/nav-simple/index.js new file mode 100644 index 0000000000000000000000000000000000000000..06c5d9e038ca9c85764b3b4df57c67ff2c047fcd --- /dev/null +++ b/src/page/common/nav-simple/index.js @@ -0,0 +1,8 @@ +/* +* @Author: root +* @Date: 2017-11-03 17:16:03 +* @Last Modified by: root +* @Last Modified time: 2017-11-03 17:16:32 +*/ +'use strict' +require('./index.css'); \ No newline at end of file diff --git a/src/page/common/nav/index.css b/src/page/common/nav/index.css new file mode 100644 index 0000000000000000000000000000000000000000..1abfa4b2322c1160e7239fc8f5cbf0b3ab5d35e9 --- /dev/null +++ b/src/page/common/nav/index.css @@ -0,0 +1,29 @@ +/* +* @Author: root +* @Date: 2017-11-04 20:51:39 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 20:39:06 +*/ +.nav{ + background:#eee; + height: 30px; + line-height: 30px; +} +/*用户部分*/ +.nav .user{ + float:left; +} +.nav .user.login{ + display: none; +} +.nav .user .link{ + margin-right: 5px; +} +/*导航部分*/ +.nav .nav-list{ + float: right; +} +.nav .nav-list .nav-item{ + margin-left: 5px; + display: inline-block; +} \ No newline at end of file diff --git a/src/page/common/nav/index.js b/src/page/common/nav/index.js new file mode 100644 index 0000000000000000000000000000000000000000..41c276b9b83f2f9ccb7a397692155e5715faf2ad --- /dev/null +++ b/src/page/common/nav/index.js @@ -0,0 +1,58 @@ +/* +* @Author: root +* @Date: 2017-11-04 20:51:32 +* @Last Modified by: root +* @Last Modified time: 2017-11-14 22:45:54 +*/ +'use strict'; +require('./index.css'); +var util = require('util/util.js'); +var _user = require('service/user-service.js'); +var _cart = require('service/cart-service.js'); +// 导航 +var nav = { + init : function(){ + this.bindEvent(); + this.loadUserInfo(); + this.loadCartCount(); + return this; + }, + bindEvent : function(){ + // 登录点击事件 + $('.js-login').click(function(){ + + window.location.href = "./user-login.html"; + }); + // 注册点击事件 + $('.js-register').click(function(){ + window.location.href = './user-register.html'; + }); + // 退出点击事件 + $('.js-logout').click(function(){ + _user.logout(function(res){ + window.location.reload(); + }, function(errMsg){ + util.errorTips(errMsg); + }); + }); + }, + // 加载用户信息 + loadUserInfo : function(){ + _user.checkLogin(function(res){ + $('.user.not-login').hide().siblings('.user.login').show() + .find('.username').text(res.username); + }, function(errMsg){ + // do nothing + }); + }, + // 加载购物车数量 + loadCartCount : function(){ + _cart.getCartCount(function(res){ + $('.nav .cart-count').text(res || 0); + }, function(errMsg){ + $('.nav .cart-count').text(0); + }); + } +}; + +module.exports = nav.init(); \ No newline at end of file diff --git a/src/page/detail/index.css b/src/page/detail/index.css new file mode 100644 index 0000000000000000000000000000000000000000..c092df7eb1b38d408f9ab2399637587908f4df5f --- /dev/null +++ b/src/page/detail/index.css @@ -0,0 +1,158 @@ +/* +* @Author: root +* @Date: 2017-11-26 19:17:48 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 23:22:13 +*/ +/*图片区*/ +.intro-wrap{ + overflow: hidden; +} +.intro-wrap .p-img-con{ + float:left; + width: 420px; +} +/*主图*/ +.intro-wrap .p-img-con .main-img-con{ + height: 400px; + border: 1px solid #ddd; +} + +.intro-wrap .p-img-con .main-img-con .main-img{ + height: 100%; + width: 100%; +} +/*缩略图*/ +.intro-wrap .p-img-con .p-img-list{ + height: 76px; + overflow: hidden; + margin-top: 5px; + margin-right: -10px; +} +.intro-wrap .p-img-con .p-img-item{ + float: left; + margin-right: 10px; + width: 72px; + height: 72px; + border: 2px solid #eee; + cursor: pointer; +} +.intro-wrap .p-img-con .p-img-item:hover{ + border: 2px solid #c60023; +} +.intro-wrap .p-img-con .p-img{ + width: 100%; + height: 100%; +} +/*商品信息*/ +.intro-wrap .p-info-con{ + float:left; + width: 640px; + margin-left: 20px; +} +.intro-wrap .p-info-con .p-name{ + font-size: 20px; + color: #333; +} +.intro-wrap .p-info-con .p-subtitle{ + font-size: 15px; + color: #c60023; + line-height: 30px; +} +.intro-wrap .p-info-con .p-info-item{ + position: relative; + padding: 0 10px; + margin-top: 20px; +} +.intro-wrap .p-info-con .p-info-item .label{ + display: inline-block; + width: 50px; + color: #999; +} +/*价格部分*/ +.intro-wrap .p-info-con .p-price-con{ + background: #eee; + padding: 10px; +} +.intro-wrap .p-info-con .p-price-con .info{ + color: #c60023; + font-size: 18px; +} +/*数量部分*/ +.intro-wrap .p-info-con .p-count-con .p-count{ + height: 36px; + line-height: 36px; + font-size: 15px; + width: 45px; + text-align: center; + outline: none; + border: 1px solid #aaa; +} +.intro-wrap .p-info-con .p-count-con .p-count-btn{ + position: absolute; + left: 115px; + display: block; + width: 20px; + height: 15px; + line-height: 15px; + text-align: center;; + font-size: 10px; + border: 1px solid #aaa; + background: #fff; + cursor: pointer; + -moz-user-select:none; + -webkit-user-select:none; + -ms-user-select:none; + user-select:none; +} +.intro-wrap .p-info-con .p-count-con .p-count-btn.plus{ + top: 0px; +} +.intro-wrap .p-info-con .p-count-con .p-count-btn.minus{ + bottom: 0px; +} +/*商品详细信息*/ +.detail-wrap{ + margin-top: 15px; +} +.detail-wrap .tab-list{ + background:#eee; + border: 1px solid #ddd; + overflow: hidden; + border-bottom: 1px solid #c60023; +} +.detail-wrap .tab-list .tab-item{ + float: left; + width: 80px; + height: 30px; + line-height: 30px; + font-size: 16px; + text-align: center; + cursor: pointer; +} +.detail-wrap .tab-list .tab-item.active{ + background: #c60023; + color: #fff; + +} +.detail-wrap .detail-con{ + padding-top:20px; + background: #fff; +} +.detail-wrap .detail-con img{ + margin: 0 auto; + display: block; +} + +/*错误信息*/ +.err-tip{ + padding:0 10px; + height: 40px; + line-height: 60px; + color: #f60; + font-size: 16px; + font-weight: bold; + text-align: center; + background: #eee; +} + diff --git a/src/page/detail/index.js b/src/page/detail/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4d721f6d1cb75eea2a3493e84706b0ea880ac8bc --- /dev/null +++ b/src/page/detail/index.js @@ -0,0 +1,91 @@ +/* +* @Author: root +* @Date: 2017-11-26 19:17:33 +* @Last Modified by: root +* @Last Modified time: 2017-11-29 00:43:00 +*/ +'user strict' +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var _product = require('service/product-service.js'); +var _cart = require('service/cart-service.js'); +var templateIndex = require('./index.string'); + +var page = { + data : { + productId : _utils.getUrlParam('productId') || '', + }, + init : function(){ + this.onload(); + this.bindEvent(); + }, + onload : function(){ + //如果没有传productId,自动跳回首页 + if(!this.data.productId){ + _utils.goHome(); + } + this.loadDetail(); + }, + bindEvent : function(){ + var _this = this; + // 图片预览 + $(document).on('mouseenter', '.p-img-item', function(){ + var imageUrl = $(this).find('.p-img').attr('src'); + $('.main-img').attr('src', imageUrl); + }); + // count的操作 + $(document).on('click', '.p-count-btn', function(){ + var type = $(this).hasClass('plus') ? 'plus' : 'minus', + $pCount = $('.p-count'), + currCount = parseInt($pCount.val()), + minCount = 1, + maxCount = _this.data.detailInfo.stock || 1; + if(type === 'plus'){ + $pCount.val(currCount < maxCount ? currCount + 1 : maxCount); + } + else if(type === 'minus'){ + $pCount.val(currCount > minCount ? currCount - 1 : minCount); + } + }); + // 加入购物车 + $(document).on('click', '.cart-add', function(){ + _cart.addToCart({ + productId : _this.data.productId, + count : $('.p-count').val() + }, function(res){ + window.location.href = './result.html?type=cart-add'; + }, function(errMsg){ + _utils.errorTips(errMsg); + }); + }); + }, + //加载商品详情信息 + loadDetail : function(){ + var _this = this, + html = ''; + $pageWrap = $('.page-wrap'); + //loading + $pageWrap.html('
'); + //请求detail信息 + _product.getProductDetail(this.data.productId,function(res){ + _this.filter(res); + _this.data.detailInfo = res; + + html = _utils.renderHtml(templateIndex,res); + + $pageWrap.html(html); + },function(errMsg){ + $('.page-wrap').html('

此商品太淘气,找不到了

'); + }); + }, + filter : function(data){ + data.subImages = data.subImages.split(','); + } + +}; + +$(function(){ + page.init(); +}); diff --git a/src/page/detail/index.string b/src/page/detail/index.string new file mode 100644 index 0000000000000000000000000000000000000000..aa2f979adff9fb016918b8e16c37df501d5f7802 --- /dev/null +++ b/src/page/detail/index.string @@ -0,0 +1,45 @@ +
+
+
+ {{name}} +
+ +
+
+

{{name}}

+

{{subtitle}}

+
+ 价格 + ¥{{price}} +
+
+ 库存 + {{stock}} +
+
+ 数量 + + + + - +
+ +
+
+
+
+ +
+
+ {{{detail}}} +
+
\ No newline at end of file diff --git a/src/page/index/banner.string b/src/page/index/banner.string new file mode 100644 index 0000000000000000000000000000000000000000..06fe3c6c5a08a974d64104d5976be6cf0201319a --- /dev/null +++ b/src/page/index/banner.string @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/src/page/index/index.css b/src/page/index/index.css new file mode 100644 index 0000000000000000000000000000000000000000..27c245c56dbe0eec7914e7f83125d0ac956ac5ef --- /dev/null +++ b/src/page/index/index.css @@ -0,0 +1,161 @@ +/* +* @Author: root +* @Date: 2017-10-30 22:03:05 +* @Last Modified by: root +* @Last Modified time: 2017-11-25 16:39:19 +*/ + +.banner ul li { float: left; +} +.keywords-list{ + float: left; + width: 240px; + padding: 10px 0; + margin-right: 10px; + background: #666; + color: #fff; + height: 350px; +} +.keywords-list .keywords-item{ + padding-left: 10px; + height: 35px; + line-height: 35px; + font-size: 14px; +} +.keywords-list .keywords-item .link{ + color: #fff; + margin-right: 8px; +} +.keywords-list .keywords-item:hover{ + background: #999; +} +.keywords-list .keywords-item .link:hover{ + color: #c60023; +} +/* banner-con */ +.banner-con{ + width: 830px; + background: #eee; + float: left; + height: 370px; +} +.banner-con .banner-img{ + width: 100%; + height: 370px; +} +.banner-con .loading{ + margin-top: 150px; +} + +/* floor */ +.floor-wrap .floor-title{ + height: 50px; + line-height: 50px; + color: #d58717; + font-weight: normal; + font-size: 20px; + border-bottom: 1px solid #d58717; +} +/*更改各楼层颜色*/ +.floor-wrap:nth-child(2) .floor-title{ + color: #3b838c; + border-bottom: 1px solid #3b838c; +} +.floor-wrap:nth-child(3) .floor-title{ + color: #a93931; + border-bottom: 1px solid #a93931; +} +.floor-wrap:nth-child(4) .floor-title{ + color: #488bad; + border-bottom: 1px solid #488bad; +} +.floor-wrap:nth-child(5) .floor-title{ + color: #642663; + border-bottom: 1px solid #642663; +} + +.floor-wrap .floor-item { + position: relative; + width: 200px; + height: 220px; + margin:15px 20px 15px 0; + float: left; + cursor: pointer; + background: #fff; +} +.floor-wrap .floor-list .floor-item:hover{ + box-shadow:1px 1px 7px #ddd; +} +.floor-wrap .floor-list{ + margin-right: -20px; + overflow: hidden; +} +.floor-wrap .floor-list .floor-item .floor-text{ + position:absolute; + top:12px; + left:20px; + font-size:16px; + color:#555; +} +.floor-wrap .floor-list .floor-item .floor-image{ + position: absolute; + right: 15px; + bottom: 10px; + width: 80%; + height: 75%; + border: none; +} +.banner .dots { + + position: absolute; + left: 53%; + right: 0; + bottom: 20px; + } +.banner .dots li { + display: inline-block; + width: 10px; + height: 10px; + margin: 0 4px; + + text-indent: -999em; + + border: 2px solid #fff; + border-radius: 6px; + + cursor: pointer; + opacity: .4; + + -webkit-transition: background .5s, opacity .5s; + -moz-transition: background .5s, opacity .5s; + transition: background .5s, opacity .5s; + } +.banner .dots li.active { +background: #fff; +opacity: 1; +} + +/*banner的前一张和后一张按钮*/ +.banner-con .banner-arrow{ + position:absolute; + top:160px; + width: 30px; + height: 50px; + line-height: 50px; + text-align: center; + font-size: 30px; + background: #ccc; + color: #fff; + background: rgba(0,0,0,.2); + cursor: pointer; +} +.banner-con .banner-arrow.prev{ + left: 250px; +} +.banner-con .banner-arrow.next{ + right: 0; +} +.banner-con .banner-arrow:hover{ + background: #aaa; + background: rgba(0,0,0,.5); +} \ No newline at end of file diff --git a/src/page/index/index.js b/src/page/index/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6708f20267c51c596299e940a836a92475c6092d --- /dev/null +++ b/src/page/index/index.js @@ -0,0 +1,37 @@ +'use strict' +require('page/common/nav-simple/index.js'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var navSide = require('page/common/nav-side/index.js'); +var templateBanner = require('./banner.string'); +require('./index.css'); +//点击到那个页面那个页面变色 +navSide.init({ + name:'about' +}); + + +require('util/slider/unslider.min.js'); +$(function() { + //寻人banner的html + var bannerHtml = _utils.renderHtml(templateBanner); + $('.banner-con').html(bannerHtml); + //初始化banner + var $slider = $('.banner').unslider({ + speed: 500, // The speed to animate each slide (in milliseconds) + delay: 3000, // The delay between slide animations (in milliseconds) + complete: function() {}, // A function that gets called after every slide animation + keys: true, // Enable keyboard (left, right) arrow shortcuts + dots: true, // Display dot navigation + fluid: false // Support responsive design. May break non-responsive designs +}); + //前一张和后一张操作的事件绑定 + + $('.banner-con .banner-arrow').click(function(){ + + var forward = $(this).hasClass('prev') ? 'prev' : 'next'; + $slider.data('unslider')[forward](); + + }); +}); diff --git a/src/page/list/index.css b/src/page/list/index.css new file mode 100644 index 0000000000000000000000000000000000000000..686dc7c406786eb8c799574816a5d78c6a69d7a8 --- /dev/null +++ b/src/page/list/index.css @@ -0,0 +1,89 @@ +/* +* @Author: root +* @Date: 2017-11-25 18:41:43 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 23:22:39 +*/ +/* 排序按钮 */ +.sort-con{ + overflow: auto; +} +.sort-con .sort-item{ + float: left; + display: inline-block; + position: relative; + padding: 0 8px; + height: 24px; + line-height: 24px; + border: 1px solid #ccc; + margin-right: -1px; + background: #fff; + color: #333; + cursor: pointer; +} +.sort-con .sort-item.active{ + background: #c60023; + border: 1px solid #c60023; + color: #fff; +} +.sort-con .sort-item .fa-sort-desc{ + position: absolute; + top: 8px; + right: 8px; +} +.sort-con .sort-item.asc .fa-sort-desc{ + opacity: .6; +} +.sort-con .sort-item.desc .fa-sort-asc{ + opacity: .6; +} +/*列表*/ +.p-list-con{ + margin-top: 15px; + margin-right: -20px; + overflow: hidden; +} +.p-list-con .p-item{ + position: relative; + width: 180px; + float: left; + padding: 10px; + margin: 0 20px 20px 0; + background: #fff; +} +.p-list-con .p-item .p-img-con{ + width: 180px; + height: 200px; +} +.p-list-con .p-item .p-img-con .p-img{ + width: 100%; + height: 100%; +} +.p-list-con .p-item .p-price-con{ + height: 30px; + line-height: 30px; +} +.p-list-con .p-item .p-price-con .p-price{ + font-size: 16px; + color: #e7380d; +} +.p-list-con .p-item .p-name-con{ + height: 40px; + overflow: hidden; +} +.p-list-con .p-item .p-name-con .p-name{ + line-height: 40px; + margin-bottom: 10px; + color: #666; + text-decoration: none; +} +.err-tip{ + padding:0 10px; + height: 40px; + line-height: 60px; + color: #f60; + font-size: 16px; + font-weight: bold; + text-align: center; + background: #eee; +} \ No newline at end of file diff --git a/src/page/list/index.js b/src/page/list/index.js new file mode 100644 index 0000000000000000000000000000000000000000..49f364703dba85e63f9b6b3f45dbeb2fb64546ea --- /dev/null +++ b/src/page/list/index.js @@ -0,0 +1,119 @@ +/* +* @Author: root +* @Date: 2017-11-25 18:41:33 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 19:22:30 +*/ +'user strict' +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var _product = require('service/product-service.js'); +var _user = require('service/user-service.js'); +var templateIndex = require('./index.string'); +var Pagination = require('util/pagination/index.js') + +var page = { + data : { + listParam :{ + keyword : _utils.getUrlParam('keyword') || '', + categoryId : _utils.getUrlParam('categoryId') || '', + orderBy : _utils.getUrlParam('orderBy') || 'default', + pageNum : _utils.getUrlParam('pageNum') || 1, + pageSize : _utils.getUrlParam('pageSize') || 10 + } + }, + init : function(){ + this.onload(); + this.bindEvent(); + }, + onload : function(){ + this.loadList(); + }, + bindEvent : function(){ + var _this = this; + // 排序的点击事件 + $('.sort-item').click(function(){ + + + var $this = $(this); + _this.data.listParam.pageNum = 1; + alert($this.data('type')); + // 点击默认排序 + + if($this.data('type') === 'default'){ + // 已经是active样式 + if($this.hasClass('active')) { + return; + } + // 其他 + else{ + $this.addClass('active').siblings('.sort-item') + .removeClass('active asc desc'); + _this.data.listParam.orderBy = 'default'; + } + } + // 点击价格排序 + else if($this.data('type') === 'price'){ + // active class 的处理 + $this.addClass('active').siblings('.sort-item') + .removeClass('active asc desc'); + // 升序、降序的处理 + if(!$this.hasClass('asc')){ + $this.addClass('asc').removeClass('desc'); + _this.data.listParam.orderBy = 'price_asc'; + }else{ + $this.addClass('desc').removeClass('asc'); + _this.data.listParam.orderBy = 'price_desc'; + } + } + // 重新加载列表 + _this.loadList(); + }); + }, + //加载list数据 + loadList : function(){ + var _this = this, + listHtml = '', + listParam = this.data.listParam, + $pListCon = $('.p-list-con'); + $pListCon.html('
'); + //删除参数中不必要的字段 + listParam.categoryId ? + (delete listParam.keyword) : (delete listParam.categoryId); + //请求接口 + _product.getProductList(listParam,function(res){ + listHtml = _utils.renderHtml(templateIndex,{ + list : res.list + }); + $pListCon.html(listHtml); + _this.loadPagination({ + hasPreviousPage : res.hasPreviousPage, + prePage : res.prePage, + hasNextPage : res.hasNextPage, + nextPage : res.nextPage, + pageNum : res.pageNum, + pages : res.pages + }); + },function(errMsg){ + _utils.errorTips(errMsg); + }); + }, + //加载分页信息 + loadPagination : function(pageInfo){ + var _this = this; + this.pagination ? '' : (this.pagination = new Pagination()); + this.pagination.render($.extend({}, pageInfo, { + container : $('.pagination'), + onSelectPage : function(pageNum){ + _this.data.listParam.pageNum = pageNum; + _this.loadList(); + } + })) + } +}; + +$(function(){ + page.init(); +}); diff --git a/src/page/list/index.string b/src/page/list/index.string new file mode 100644 index 0000000000000000000000000000000000000000..b5eba10fe16af9929f2060e390569e8c42cf1766 --- /dev/null +++ b/src/page/list/index.string @@ -0,0 +1,17 @@ +{{#list}} +
  • +
    + + {{name}} + +
    +
    + ¥{{price}}
    +
    + {{name}} +
    +
  • +{{/list}} +{{^list}} +

    很抱歉,实在找不到您要的商品。

    +{{/list}} \ No newline at end of file diff --git a/src/page/module.js b/src/page/module.js new file mode 100644 index 0000000000000000000000000000000000000000..d971ee013eac1ab40c7edccbad8700864e006034 --- /dev/null +++ b/src/page/module.js @@ -0,0 +1,10 @@ + /* +* @Author: root +* @Date: 2017-10-30 21:55:15 +* @Last Modified by: root +* @Last Modified time: 2017-11-05 13:41:56 +*/ +'use strict'; +module.exports = { + test:1234 +} \ No newline at end of file diff --git a/src/page/order-confirm/address-list.string b/src/page/order-confirm/address-list.string new file mode 100644 index 0000000000000000000000000000000000000000..606829ae5b7ac2439e977f5598761ee80428b98b --- /dev/null +++ b/src/page/order-confirm/address-list.string @@ -0,0 +1,25 @@ +{{#list}} +{{#isActive}} +
    +{{/isActive}} +{{^isActive}} +
    +{{/isActive}} +
    + {{receiverCity}} {{receiverProvince}} ({{receiverName}}收) +
    +
    + {{receiverAddress}} {{receiverPhone}} +
    +
    + 编辑 + 删除 +
    +
    +{{/list}} +
    +
    + +
    使用新地址
    +
    +
    \ No newline at end of file diff --git a/src/page/order-confirm/address-modal.js b/src/page/order-confirm/address-modal.js new file mode 100644 index 0000000000000000000000000000000000000000..c4df2e78ccbcd4ac3fa5b8f07a004e8084483097 --- /dev/null +++ b/src/page/order-confirm/address-modal.js @@ -0,0 +1,162 @@ +/* +* @Author: root +* @Date: 2017-12-03 21:48:51 +* @Last Modified by: root +* @Last Modified time: 2017-12-04 21:30:29 +*/ +'use strict'; + +var _utils = require('util/util.js'); +var _order = require('service/order-service.js'); +var _address = require('service/address-service.js'); +var templateAddressModal = require('./address-modal.string'); +var _cities = require('util/cities/index.js'); +var addressModal = { + + show : function(option){ + + //option的绑定 + this.option = option; + + this.option.data = option.data || {}, + + this.$modalWrap = $('.modal-wrap'); + //渲染页面 + this.loadModal(); + //绑定事件 + this.bindEvent(); + }, + bindEvent : function(){ + var _this = this; + //省份和城市的二级联动 + this.$modalWrap.find('#receiver-province').change(function(){ + var selectedProvince = $(this).val(); + _this.loadCities(selectedProvince); + }); + //提交收货地址 + this.$modalWrap.find('.address-btn').click(function(){ + var receiverInfo = _this.getReceiverInfo(), + isUpdate = _this.option.isUpdate; + //使用新地址,且验证通过 + if(!isUpdate && receiverInfo.status){ + _address.save(receiverInfo.data,function(res){ + _utils.successTips('地址添加成功'); + _this.hide(); + typeof _this.option.onSuccess === 'function' + && _this.option.onSuccess(res); + },function(errMsg){ + _utils.errorTips(errMsg); + }); + } + //更新收件人地址,并且验证通过 + else if(isUpdate && receiverInfo.status){ + _address.update(receiverInfo.data,function(){ + _utils.successTips('地址更新成功!'); + _this.hide(); + typeof _this.option.onSuccess === 'function' + && _this.option.onSuccess(res); + },function(errMsg){ + _utils.errorTips(errMsg); + }) + } + // 验证不通过 + else { + _utils.errorTips(receiverInfo.errMsg || '好像哪里不对了'); + } + + }); + //为了保证点击modal内容区的时候,不关闭弹窗 + this.$modalWrap.find('.modal-container').click(function(e){ + e.stopPropagation(); + }) + //点击或者蒙版去关闭弹窗 + this.$modalWrap.find('.close').click(function(){ + _this.hide(); + }) + }, + + + getReceiverInfo : function(){ + var receiverInfo = {}, + result ={ + status : false + }; + receiverInfo.receiverName = $.trim(this.$modalWrap.find('#receiver-name').val()); + receiverInfo.receiverProvince = this.$modalWrap.find('#receiver-province').val(); + receiverInfo.receiverCity = this.$modalWrap.find('#receiver-city').val(); + receiverInfo.receiverAddress = $.trim(this.$modalWrap.find('#receiver-address').val()); + receiverInfo.receiverPhone = $.trim(this.$modalWrap.find('#receiver-phone').val()); + receiverInfo.receiverZip = $.trim(this.$modalWrap.find('#receiver-zip').val()); + if(this.option.isUpdate){ + receiverInfo.id = this.$modalWrap.find('#receiver-id').val(); + + } + //表单验证 + if(!receiverInfo.receiverName){ + result.errMsg = '请输入收件人姓名'; + }else if(!receiverInfo.receiverProvince) { + result.errMsg = '请选择收件人所在省份'; + }else if(!receiverInfo.receiverCity) { + result.errMsg = '请选择收件人所在城市'; + }else if(!receiverInfo.receiverPhone) { + result.errMsg = '请输入收件人手机号'; + }else if(!receiverInfo.receiverAddress) { + result.errMsg = '请写收件人详细地址'; + } + //所有验证都通过了 + else { + result.status = true; + result.data = receiverInfo; + } + return result; + }, + loadModal : function(){ + var addressModalHtml = _utils.renderHtml(templateAddressModal,{ + isUpdate : this.option.isUpdate, + data : this.option.data + }); + this.$modalWrap.html(addressModalHtml); + //加载省份 + this.loadProvince(); + //加载城市 + + }, + //省份信息 + loadProvince : function(){ + var proviness = _cities.getProvinces() || [], + $provinceSelect = this.$modalWrap.find('#receiver-province'); + $provinceSelect.html(this.getSelectOption(proviness)); + //如果更新地址,并且有省份信息,做省份的回填 + if(this.option.isUpdate && this.option.data.receiverProvince){ + $provinceSelect.val(this.option.data.receiverProvince); + this.loadCities(this.option.data.receiverProvince); + } + }, + //获取select框的选项,输入array,输出:html + getSelectOption : function(optionArray){ + var html = ''; + //优化for循环 + for(var i=0,length = optionArray.length;i'+ optionArray[i] +''; + } + return html; + }, + //加载城市信息 + loadCities : function(provinceName){ + var cities = _cities.getCities(provinceName) || [], + $citySelect = this.$modalWrap.find('#receiver-city'); + $citySelect.html(this.getSelectOption(cities)); + //如果更新地址,并且有城市信息,做省份的回填 + if(this.option.isUpdate && this.option.data.receiverCity){ + $citySelect.val(this.option.data.receiverCity); + } + }, + //关闭弹窗 + hide : function(){ + this.$modalWrap.empty(); + } + + +}; +module.exports = addressModal; diff --git a/src/page/order-confirm/address-modal.string b/src/page/order-confirm/address-modal.string new file mode 100644 index 0000000000000000000000000000000000000000..fc38e20446e6323bd485e875aa6551a97d90844d --- /dev/null +++ b/src/page/order-confirm/address-modal.string @@ -0,0 +1,57 @@ + \ No newline at end of file diff --git a/src/page/order-confirm/index.css b/src/page/order-confirm/index.css new file mode 100644 index 0000000000000000000000000000000000000000..f936726a302b36d7d161a907d948e82447047116 --- /dev/null +++ b/src/page/order-confirm/index.css @@ -0,0 +1,204 @@ +/* +* @Author: root +* @Date: 2017-11-29 21:07:39 +* @Last Modified by: root +* @Last Modified time: 2017-12-03 23:22:15 +*/ +/* 地址部分的样式 */ +.address-item, +.address-add { + margin: 20px 20px 0 0; + width: 200px; + padding: 5px 8px; + float: left; + border: 3px dashed #cccccc; + cursor: pointer; +} +.address-item.active { + border: 3px dashed #c60023; +} +.address-item:hover, +.address-add:hover { + background: #fafafa; +} + + +.address-item .address-title { + padding-bottom: 3px; + border-bottom: 1px solid #dddddd; + color: #666666; + height: 20px; + line-height: 20px; + overflow: hidden; +} + +.address-item .address-detail { + margin-top: 5px; + height: 40px; + line-height: 20px; + overflow: hidden; + color: #666666; +} + +.address-item .address-opera { + text-align: right; + visibility: hidden; +} +.address-item:hover .address-opera { + visibility: visible; +} + + +.address-item .address-opera .link { + margin-right: 5px; +} + +.address-add .address-new { + text-align: center; + color: #cccccc; + padding: 8px 0; +} + +.address-add .address-new .fa { + font-size: 50px; + line-height: 50px; + +} + +.address-add .address-new .text { + font-size: 12px; +} + +/* 商品清单部分 */ +.product-table { + width: 100%; + margin: 10px 0; + border-collapse: collapse; +} +.product-table th, +.product-table td { + border: 1px dotted #dddddd; +} +.product-table .cell-img { + padding: 10px; + width: 10%; + text-align: center; +} +.product-table .cell-img .p-img { + width: 80px; + height: 80px; + border: 1px solid #dddddd; +} +.product-table .cell-info { + width: 30%; + text-align: left; +} +.product-table .cell-price { + width: 20%; + text-align: center; +} +.product-table .cell-count { + width: 20%; + text-align: center; +} +.product-table .cell-total { + width: 20%; + text-align: center; +} + + +/*订单提交*/ +.submit-con { + background: #eeeeee; + text-align: right; +} + +.submit-con .submit-total { + margin-right: 20px; + font-size: 18px; + color: #c60023; + font-weight: bold; + vertical-align: middle; +} +.submit-con .order-submit { + height: 50px; + line-height: 50px; + width: 100px; +} + + +/*modal部分*/ +.modal { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: #eeeeee; + background: rgba(0,0,0, .4); + z-index: 1000; + overflow-x: hidden; + overflow-y: auto; +} + +.modal .modal-container { + width: 700px; + margin: 50px auto; + background: #ffffff; + border-radius: 2px; +} +.modal .modal-container .modal-header { + position: relative; + padding: 15px; + border-bottom: 1px solid #cccccc; +} + +.modal .modal-container .modal-header .modal-title { + font-size: 14px; +} +.modal .modal-container .modal-header .close { + position: absolute; + padding: 10px; + right: 20px; + top: 20px; + cursor: pointer; +} + +.modal .modal-container .modal-body { + padding: 15px; +} + +.form .form-line { + margin: 5px 0; + overflow: hidden; +} +.form .form-line .label { + display: block; + float: left; + width: 85px; + text-align: right; + height: 30px; + line-height: 30px; + margin-right: 10px; + cursor: pointer; +} +.form .form-line .form-item { + padding: 0 5px; + height: 30px; + line-height: 30px; + outline: none; + margin-right: 10px; +} + +.form .form-line .btn { + margin-left: 95px; + height: 30px; + line-height:30px; + font-size: 13px; +} + +.form .form-line .label .required { + color: red; +} + + diff --git a/src/page/order-confirm/index.js b/src/page/order-confirm/index.js new file mode 100644 index 0000000000000000000000000000000000000000..986f8d613c984f29b8bfc3b62b027e9111cabf53 --- /dev/null +++ b/src/page/order-confirm/index.js @@ -0,0 +1,136 @@ +/* +* @Author: root +* @Date: 2017-11-29 21:07:33 +* @Last Modified by: root +* @Last Modified time: 2017-12-04 22:08:12 +*/ +'use strict' +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var _order = require('service/order-service.js'); +var _address = require('service/address-service.js'); +var templateProduct = require('./product-list.string'); +var templateAddress = require('./address-list.string'); +var addressModal = require('./address-modal.js'); +var nav = require('page/common/nav/index.js'); +var page = { + data : { + selectAddressId : null + }, + init : function(){ + this.onload(); + this.bindEvent(); + }, + onload : function(){ + this.loadAddressList(); + this.loadProductList(); + }, + bindEvent : function(){ + var _this = this; + //地址的选择 + $(document).on('click','.address-item',function(){ + $(this).addClass('active'). + siblings('.address-item').removeClass('active'); + _this.data.selectedAddressId = $(this).data('id'); + }); + // 订单的提交 + $(document).on('click','.order-submit',function(){ + var shippingId = _this.data.selectedAddressId; + if(shippingId){ + _order.createOrder({ + shippingId : shippingId + },function(res){ + window.location.href = './payment.html?orderNumber='+res.orderNo; + },function(errMsg){ + _utils.errorTips(errMsg); + }); + }else { + _utils.errorTips('请选择地址后再提交'); + } + }); + //地址的添加 + $(document).on('click','.address-add',function(){ + addressModal.show({ + isUpdate : false, + onSuccess : function(){ + _this.loadAddressList(); + } + }) + }); + //地址的编辑 + $(document).on('click','.address-update',function(e){ + e.stopPropagation(); + var shippingId = $(this).parents('.address-item').data('id'); + _address.getAddress(shippingId,function(res){ + addressModal.show({ + isUpdate : true, + data : res, + onSuccess : function(){ + _this.loadAddressList(); + } + }) + },function(errMsg){ + _utils.errorTips(errMsg); + }); + }); + //地址的删除 + $(document).on('click','.address-delete',function(e){ + e.stopPropagation(); + var id = $(this).parents('.address-item').data('id'); + if(window.confirm('确认要删除该地址么?')){ + _address.deleteAddress(id,function(res){ + _this.loadAddressList(); + },function(errMsg){ + _utils.errorTips(errMsg); + }) + } + }); + + }, + //加载地址 + loadAddressList : function(){ + var _this = this; + $('.address-con').html('
    '); + //获取地址列表 + _address.getAddressList(function(res){ + _this.addressFilter(res); + var addressListHtml = _utils.renderHtml(templateAddress,res); + $('.address-con').html(addressListHtml); + },function(errMsg){ + $('.address-con').html('

    地址加载失败,请刷新后重新

    '); + }); + }, + //加载商品清单 + loadProductList : function(){ + var _this = this; + $('.product-con').html('
    '); + //获取地址列表 + _order.getProductList(function(res){ + var productListHtml = _utils.renderHtml(templateProduct,res); + $('.product-con').html(productListHtml); + },function(errMsg){ + $('.product-con').html('

    商品信息加载失败,请刷新后重新

    '); + }); + }, + //处理地址列表选中状态 + addressFilter : function(){ + if(this.data.selectAddressId){ + var selectAddressFlag = false; + for(var i=0,length = data.list.length;i + +   + 商品描述 + 价格 + 数量 + 小计 + + {{#orderItemVoList}} + + + + {{productName}} + + + + {{productName}} + + ¥{{currentUnitPrice}} + {{quantity}} + ¥{{totalPrice}} + + {{/orderItemVoList}} + +
    + 订单总价: + ¥{{productTotalPrice}} + 提交订单 +
    \ No newline at end of file diff --git a/src/page/order-detail/index.css b/src/page/order-detail/index.css new file mode 100644 index 0000000000000000000000000000000000000000..ecbd9b399957e69bbc5407ef4a8a11efb0b45daf --- /dev/null +++ b/src/page/order-detail/index.css @@ -0,0 +1,102 @@ +/* +* @Author: root +* @Date: 2017-12-06 23:23:12 +* @Last Modified by: root +* @Last Modified time: 2017-12-07 23:17:00 +*/ +/*订单信息*/ +.text-line{ + height: 30px; + line-height: 40px; +} +.order-info .text-line .text{ + margin-right: 30px; +} +.order-info .btn{ + width: 80px; + padding: 0px; + height: 30px; + line-height: 30px; + font-size: 12px; + margin-right: 10px; + text-align: center; +} + +/*商品清单*/ +.product-table{ + width: 100%; + border-collapse: collapse; +} +.product-table .cell-th{ + background: #eee; +} +.product-table .cell{ + border-bottom: 1px dashed #eee; + background: #fafafa; +} +.product-table.header { + background: #eeeeee; +} + +.product-table .order-info { + background: #eeeeee; + padding: 10px; + color: #999999; +} + +.product-table .order-info .order-text { + margin-right: 25px; +} + +.product-table .order-info .order-num { + font-weight: bold; +} + +.product-table .order-info .order-total { + font-weight: bold; + color: #c60023; +} +.product-table .order-info .order-detail { + float: right; +} + + +.product-table .cell-img { + padding: 10px; + width: 10%; + text-align: center; +} +.product-table .cell-img .p-img { + width: 80px; + height: 80px; + border: 1px solid #dddddd; +} +.product-table .cell-info { + width: 45%; + text-align: left; +} +.product-table .cell-price { + width: 15%; + text-align: center; +} +.product-table .cell-count { + width: 15%; + text-align: center; +} +.product-table .cell-total { + width: 15%; + text-align: center; +} +/*总价*/ +.total{ + text-align: right; + font-size: 14px; + height: 40px; + line-height: 40px; + margin-top: 10px; + margin-right: 20px; +} +.total .total-price{ + font-weight: bold; + color: #c60023; +} \ No newline at end of file diff --git a/src/page/order-detail/index.js b/src/page/order-detail/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a150d00ae6d650be07ae764b1afd2355aecda5c9 --- /dev/null +++ b/src/page/order-detail/index.js @@ -0,0 +1,71 @@ +/* +* @Author: root +* @Date: 2017-12-06 23:23:05 +* @Last Modified by: root +* @Last Modified time: 2017-12-07 23:48:13 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var navSide = require('page/common/nav-side/index.js'); +var _utils = require('util/util.js'); +var _order = require('service/order-service.js'); +var templateIndex = require('./index.string'); + +var page = { + data : { + orderNumber : _utils.getUrlParam('orderNumber') + }, + init : function(){ + this.onload(); + this.binEvent(); + }, + onload : function(){ + //初始化左侧菜单 + navSide.init({ + name:'order-list' + }); + //加载detail数据 + this.loadDetail(); + }, + binEvent : function(){ + var _this = this; + $(document).on('click','.order-cancel',function(){ + if(window.confirm("确实要取消该订单么")){ + _order.cancelOrder(_this.data.orderNumber,function(res){ + _utils.successTips("该订单取消成功"); + _this.loadDetail(); + },function(errMsg){ + _utils.errorTips(errMsg); + }); + } + + }) + }, + //加载订单列表 + loadDetail : function(){ + var orderDetailHtml = '', + _this = this, + $content = $('.content'); + $content.html('
    '); + _order.getOrderDetail(this.data.orderNumber,function(res){ + _this.dataFilter(res); + orderDetailHtml = _utils.renderHtml(templateIndex,res); + //渲染html + $content.html(orderDetailHtml); + + },function(errMsg){ + $content.html('

    '+errMsg+'

    '); + }); + },//数据的适配 + dataFilter : function(data){ + data.needPay = data.status == 10; + data.isCancelable = data.status == 10; + + } + +}; +$(function(){ + page.init(); +}); \ No newline at end of file diff --git a/src/page/order-detail/index.string b/src/page/order-detail/index.string new file mode 100644 index 0000000000000000000000000000000000000000..df8f72d0e9b8cbf781df5728a4cff4e8c6468f98 --- /dev/null +++ b/src/page/order-detail/index.string @@ -0,0 +1,70 @@ +
    +
    订单信息
    +
    +
    +
    + 订单号:{{orderNo}} + 创建时间:{{createTime}} +
    +
    + + 收件人:{{receiverName}} + {{shippingVo.receiverProvince}} + {{shippingVo.receiver}} + {{shippingVo.receiverAddress}} + {{shippingVo.receiverMobile}} + +
    +
    + 订单状态:{{statusDesc}} +
    +
    + 支付方式:{{paymentTypeDesc}} +
    +
    + {{#needPay}} + 去支付 + {{/needPay}} + {{#isCancelable}} + 取消订单 + {{/isCancelable}} +
    +
    +
    +
    +
    +
    商品清单
    +
    + + + + + + + + + + + + {{#orderItemVoList}} + + + + + + + + {{/orderItemVoList}} +
     商品信息单价数量小计
    + + {{productName}} + + + {{productName}} + ¥{{currentUnitPrice}}{{quantity}}¥{{totalPrice}}
    +

    + 订单总价: + ¥{{payment}} +

    +
    +
    \ No newline at end of file diff --git a/src/page/order-list/index.css b/src/page/order-list/index.css new file mode 100644 index 0000000000000000000000000000000000000000..3446814b0f89540b3b11674ffa36a921746df07b --- /dev/null +++ b/src/page/order-list/index.css @@ -0,0 +1,72 @@ +/* +* @Author: root +* @Date: 2017-12-05 00:02:21 +* @Last Modified by: root +* @Last Modified time: 2017-12-06 13:59:48 +*/ +.order-list-table { + width: 100%; + background: #fafafa; + border-collapse: collapse; + margin-bottom: 20px; +} + +.order-list-table .cell { + padding: 10px 0; + color: #666666; + border-bottom: 1px solid #eeeeee; +} + +.order-list-table.header { + background: #eeeeee; +} + +.order-list-table .order-info { + background: #eeeeee; + padding: 10px; + color: #999999; +} + +.order-list-table .order-info .order-text { + margin-right: 25px; +} + +.order-list-table .order-info .order-num { + font-weight: bold; +} + +.order-list-table .order-info .order-total { + font-weight: bold; + color: #c60023; +} +.order-list-table .order-info .order-detail { + float: right; +} + + +.order-list-table .cell-img { + padding: 10px; + width: 10%; + text-align: center; +} +.order-list-table .cell-img .p-img { + width: 80px; + height: 80px; + border: 1px solid #dddddd; +} +.order-list-table .cell-info { + width: 45%; + text-align: left; +} +.order-list-table .cell-price { + width: 15%; + text-align: center; +} +.order-list-table .cell-count { + width: 15%; + text-align: center; +} +.order-list-table .cell-total { + width: 15%; + text-align: center; +} diff --git a/src/page/order-list/index.js b/src/page/order-list/index.js new file mode 100644 index 0000000000000000000000000000000000000000..43fc8d0ac4d15e60e1bbc75dda93ac8f6f87e28b --- /dev/null +++ b/src/page/order-list/index.js @@ -0,0 +1,71 @@ +/* +* @Author: root +* @Date: 2017-12-05 00:02:14 +* @Last Modified by: root +* @Last Modified time: 2017-12-06 23:05:58 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var navSide = require('page/common/nav-side/index.js'); +var _utils = require('util/util.js'); +var _order = require('service/order-service.js'); +var templateIndex = require('./index.string'); +var Pagination = require('util/pagination/index.js'); +var page = { + data : { + listParam : { + pageNum : 1, + pageSize : 10 + } + }, + init : function(){ + this.onload(); + this.loadOrderList(); + }, + onload : function(){ + //初始化左侧菜单 + navSide.init({ + name:'order-list' + }); + }, + //加载订单列表 + loadOrderList : function(){ + var orderListHtml = '', + _this = this, + $listCon = $('.order-list-con'); + $listCon.html('
    '); + _order.getOrderList(this.data.listParam,function(res){ + orderListHtml = _utils.renderHtml(templateIndex,res); + //渲染html + $listCon.html(orderListHtml); + _this.loadPagination({ + hasPreviousPage: res.hasPreviousPage, + prePage: res.prePage, + hasNextPage: res.hasNextPage, + nextPage: res.nextPage, + pageNum: res.pageNum, + pages: res.pages + }); + },function(errMsg){ + $listCon.html('

    加载订单失败,请刷新后看看

    '); + }); + }, + //加载分页信息 + loadPagination : function(pageInfo){ + var _this = this; + this.pagination ? '' : (this.pagination = new Pagination()); + this.pagination.render($.extend({}, pageInfo, { + container: $('.pagination'), + onSelectPage: function (pageNum) { + _this.data.listParam.pageNum = pageNum; + _this.loadOrderList(); + } + })); + } + +}; +$(function(){ + page.init(); +}); \ No newline at end of file diff --git a/src/page/order-list/index.string b/src/page/order-list/index.string new file mode 100644 index 0000000000000000000000000000000000000000..4a8eb46b460ed699875b6f2dbc975552e3e81206 --- /dev/null +++ b/src/page/order-list/index.string @@ -0,0 +1,54 @@ + + + + + + + + +
     商品信息单价数量小计
    +{{#list}} + + + + + {{#orderItemVoList}} + + + + + + + + {{/orderItemVoList}} +
    + + 订单号 + + {{orderNo}} + + + {{createTime}} + 收件人:{{receiverName}} + + 订单状态:{{statusDesc}} + + + 订单总价: + ¥{{payment}} + + + 查看详情 + + +
    + + {{productName}} + + + {{productName}} + ¥{{currentUnitPrice}}{{quantity}}¥{{totalPrice}}
    +{{/list}} +{{^list}} +

    您暂时还没有订单

    +{{/list}} diff --git a/src/page/payment/index.css b/src/page/payment/index.css new file mode 100644 index 0000000000000000000000000000000000000000..edf35dcfb461477f078b12db99d814c3fbdc87e3 --- /dev/null +++ b/src/page/payment/index.css @@ -0,0 +1,32 @@ +/* +* @Author: root +* @Date: 2017-12-09 13:21:46 +* @Last Modified by: root +* @Last Modified time: 2017-12-09 13:40:22 +*/ +.page-wrap{ + background: #fff; + pading:10px 0 25px 0; +} +.payment-tips{ + height: 40px; + line-height:40px; + font-size: 18px; + font-weight: bold; + color: #666; + text-align: center; +} +.payment-tips.enhance{ + color: #c60023; +} +.img-con{ + margin:0 auto; + width: 300px; + height: 300px; + background: #fff; + border:1px solid #ddd; +} +.img-con .qr-code{ + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/src/page/payment/index.js b/src/page/payment/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0ec025373ecc0b3e933be5502c01ef122d97eaed --- /dev/null +++ b/src/page/payment/index.js @@ -0,0 +1,60 @@ +/* +* @Author: root +* @Date: 2017-12-09 13:21:38 +* @Last Modified by: root +* @Last Modified time: 2017-12-09 14:20:16 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var _utils = require('util/util.js'); +var _payment = require('service/payment-service.js'); +var templateIndex = require('./index.string'); + +var page = { + data : { + orderNumber : _utils.getUrlParam('orderNumber') + }, + init : function(){ + this.onload(); + + }, + onload : function(){ + + //加载loadPaymentInfo数据 + this.loadPaymentInfo(); + }, + //加载订单列表 + loadPaymentInfo : function(){ + var paymentHtml = '', + _this = this, + $pageWrap = $('.page-wrap'); + //$pageWrap.html('
    '); + _payment.getPaymentInfo(this.data.orderNumber,function(res){ + + paymentHtml = _utils.renderHtml(templateIndex,res); + //渲染html + $pageWrap.html(paymentHtml); + _this.listenOrderStatus(); + },function(errMsg){ + $pageWrap.html('

    '+errMsg+'

    '); + }); + }, + //监听订单状态 + listenOrderStatus : function(){ + var _this = this; + this.paymentTimer = window.setInterval(function(){ + _payment.getPaymentStatus(_this.data.orderNumber,function(res){ + if(res == true){ + window.location.href + = './result.html?type=payment&orderNumber='+_this.data.orderNumber; + } + }); + },5e3) + } + +}; +$(function(){ + page.init(); +}); diff --git a/src/page/payment/index.string b/src/page/payment/index.string new file mode 100644 index 0000000000000000000000000000000000000000..e9f69dce85addc7f0a11cac96d1a52f91a5887a3 --- /dev/null +++ b/src/page/payment/index.string @@ -0,0 +1,6 @@ +

    订单提交成功,请尽快支付!定单号:{{orderNo}}

    +

    请使用支付宝App扫描如下二维码进行支付:

    +
    + 支付二维码 +
    +
    \ No newline at end of file diff --git a/src/page/result/index.css b/src/page/result/index.css new file mode 100644 index 0000000000000000000000000000000000000000..3d09f6950eba9c43b1091bd46f980f5d004bc69c --- /dev/null +++ b/src/page/result/index.css @@ -0,0 +1,26 @@ +/* +* @Author: root +* @Date: 2017-11-05 19:27:32 +* @Last Modified by: root +* @Last Modified time: 2017-11-05 20:26:02 +*/ +.page-wrap{ + text-align:center; + padding: 30px 0; + background:#fff; + margin-top: 20px; +} +.result-con{ + display: none; +} +.result-con .result-title{ + color: #555; +} +.result-con .result-content{ + margin-top:20px; +} +.result-con .result-content .link{ + padding: 5px 10px; + border:1px solid #ccc; + margin:0 5px; +} \ No newline at end of file diff --git a/src/page/result/index.js b/src/page/result/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a83ba7d55f6accb91a2096fea40b7ad9b657d659 --- /dev/null +++ b/src/page/result/index.js @@ -0,0 +1,22 @@ +/* +* @Author: root +* @Date: 2017-11-05 19:27:16 +* @Last Modified by: root +* @Last Modified time: 2017-12-09 14:41:08 +*/ +'user strict' +require('./index.css'); +require('page/common/nav-simple/index.js'); +var _utils = require('util/util.js'); + +$(function(){ + var type = _utils.getUrlParam('type') || 'default', + $element = $('.' + type + '-success'); + if(type === 'payment'){ + var orderNumber = _utils.getUrlParam('orderNumber'); + var $orderNumber = $element.find('.order-number'); + $element.find('.order-number').attr('href',$orderNumber.attr('href') + orderNumber); + } + + $element.show(); +}) \ No newline at end of file diff --git a/src/page/user-center-update/index.css b/src/page/user-center-update/index.css new file mode 100644 index 0000000000000000000000000000000000000000..f915d448fd4c7172fd45fe005a6337641757c4ef --- /dev/null +++ b/src/page/user-center-update/index.css @@ -0,0 +1,24 @@ +/* +* @Author: root +* @Date: 2017-11-16 20:21:24 +* @Last Modified by: root +* @Last Modified time: 2017-11-17 13:36:24 +*/ +.form-line{ + height: 30px; + line-height: 30px; + font-size: 14px; + margin-bottom: 10px; +} +.form-line .label{ + display: inline-block; + width: 60px; + text-align: center; +} +.form-line .input{ + height: 25px; + line-height: 25px; + font-size: 14px; + width:200px; + +} \ No newline at end of file diff --git a/src/page/user-center-update/index.js b/src/page/user-center-update/index.js new file mode 100644 index 0000000000000000000000000000000000000000..1df2334b65d0ca830b10253dd1b8b6e8df5cba02 --- /dev/null +++ b/src/page/user-center-update/index.js @@ -0,0 +1,105 @@ +/* +* @Author: root +* @Date: 2017-11-16 20:21:16 +* @Last Modified by: root +* @Last Modified time: 2017-11-18 20:26:33 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var navSide = require('page/common/nav-side/index.js'); +var _utils = require('util/util.js'); +var _user = require('service/user-service.js'); +var templateIndex = require('./index.string'); +var page = { + init : function(){ + this.onload(); + + this.bindEvent(); + }, + onload : function(){ + //初始化左侧菜单 + navSide.init({ + name:'user-center' + }); + //加载用户信息 + this.loadUserInfo(); + }, + //验证字段信息 + //sudo + validateForm : function(formData){ + + var result = { + status : false, + msg : '' + }; + //验证邮箱格式是否正确 + if(!_utils.validate(formData.email, 'email')){ + result.msg = '邮箱格式不正确'; + return result; + } + //手机格式是否正确 + if (!_utils.validate(formData.phone,'phone')) { + result.msg = '手机格式不正确'; + return result; + } + //问题不能为空 + if (!_utils.validate(formData.question,'require')) { + result.msg = '问题不能为空'; + return result; + } + //答案不能为空 + if (!_utils.validate(formData.answer,'require')) { + result.msg = '答案不能为空'; + return result; + } + //通过验证,返回正确提示 + result.status = true; + result.msg = '验证通过'; + return result; + }, + bindEvent : function(){ + var _this = this; + $(document).on('click','.btn-submit',function(){ + var userInfo = { + phone : $.trim($("#phone").val()), + email : $.trim($("#email").val()), + question : $.trim($("#question").val()), + answer : $.trim($("#answer").val()) + }, + validateResult = _this.validateForm(userInfo); + + + + + if(validateResult.status){ + _user.updateUserInfo(userInfo,function(res,msg){ + _utils.successTips(msg); + window.location.href = './user-center.html'; + },function(errMsg){ + _utils.errorTips(validateResult.msg); + }); + } + else { + _utils.errorTips(validateResult.msg); + } + }); + }, + + loadUserInfo : function(){ + var userHtml = '' ; + _user.getUserInfo(function(res){ + + userHtml = _utils.renderHtml(templateIndex, res); + + $('.panel-body').html(userHtml); + },function(errMsg){ + _utils.errorTips(errMsg); + }); + } + +}; +$(function(){ + page.init(); +}); \ No newline at end of file diff --git a/src/page/user-center-update/index.string b/src/page/user-center-update/index.string new file mode 100644 index 0000000000000000000000000000000000000000..fa243dbb451f22a9dbe795108fde2c4078e6faa3 --- /dev/null +++ b/src/page/user-center-update/index.string @@ -0,0 +1,24 @@ +
    +
    +用户名: +{{username}} +
    +
    +电 话: + +
    +
    +邮 箱: + +
    +
    +问 题: + +
    +
    +答 案: + +
    +提交 +
    + \ No newline at end of file diff --git a/src/page/user-center/index.css b/src/page/user-center/index.css new file mode 100644 index 0000000000000000000000000000000000000000..e213f040ded64e82e9b079cd1f23e6acb615de33 --- /dev/null +++ b/src/page/user-center/index.css @@ -0,0 +1,16 @@ +/* +* @Author: root +* @Date: 2017-11-16 20:09:53 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 22:47:27 +*/ +.form-line{ + height: 30px; + line-height: 30px; + font-size: 14px +} +.form-line .label{ + display: inline-block; + width: 60px; + text-align: center; +} \ No newline at end of file diff --git a/src/page/user-center/index.js b/src/page/user-center/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f6038e2ac674ac1a579e6d48600d232aef3fee36 --- /dev/null +++ b/src/page/user-center/index.js @@ -0,0 +1,42 @@ +/* +* @Author: root +* @Date: 2017-11-16 20:09:44 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 23:08:11 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var navSide = require('page/common/nav-side/index.js'); +var _utils = require('util/util.js'); +var _user = require('service/user-service.js'); +var templateIndex = require('./index.string'); +var page = { + init : function(){ + this.onload(); + }, + onload : function(){ + //初始化左侧菜单 + navSide.init({ + name:'user-center' + }); + //加载用户信息 + this.loadUserInfo(); + }, + loadUserInfo : function(){ + var userHtml = '' ; + _user.getUserInfo(function(res){ + + userHtml = _utils.renderHtml(templateIndex, res); + + $('.panel-body').html(userHtml); + },function(errMsg){ + _utils.errorTips(errMsg); + }); + } + +}; +$(function(){ + page.init(); +}); \ No newline at end of file diff --git a/src/page/user-center/index.string b/src/page/user-center/index.string new file mode 100644 index 0000000000000000000000000000000000000000..50d31da5e1e1978906fbf748aac093e5884d4c4f --- /dev/null +++ b/src/page/user-center/index.string @@ -0,0 +1,23 @@ +
    +
    +用户名: +{{username}} +
    +
    +电 话: +{{phone}} +
    +
    +邮 箱: +{{email}} +
    +
    +问 题: +{{question}} +
    +
    +答 案: +{{answer}} +
    +编辑
    + \ No newline at end of file diff --git a/src/page/user-login/index.css b/src/page/user-login/index.css new file mode 100644 index 0000000000000000000000000000000000000000..19930afe1f5f7d81e379e7f67d4645613630ca3f --- /dev/null +++ b/src/page/user-login/index.css @@ -0,0 +1,86 @@ + +/* +* @Author: root +* @Date: 2017-11-05 22:25:37 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 21:42:21 +*/ +/*最外容器色*/ +.page-wrap{ + padding: 40px 0; + background:#e72955; +} +/*表单框*/ +.user-con{ + position: relative; + width:400px; + margin: 0 auto; + background: #fff; +} +.user-con .user-title{ + text-align: center; + padding: 10px 0; + border-bottom: 1px solid #ddd; + font-size: 18px; + font-weight: bold;; + color: #666; +} +.user-con .user-box{ + padding: 20px; +} +/*错误提示框*/ +.user-con .user-box .error-item{ + display: none; + position: relative; + padding: 4px 0 4px 40px; + margin-bottom: 10px; + border:1px solid red; + color: red; + background: #fde9e9; +} +/*错误提示*/ +.user-con .user-box .error-icon{ + position: absolute; + left: 14px; + top: 50%; + font-size: 14px; + margin-top: -7px; +} +.user-con .user-item{ + position: relative; + margin-bottom: 20px; +} +.user-con .user-item .user-label{ + outline: none; + position: absolute; + left: 1px; + top: 1px; + bottom: 1px; + width: 40px; + line-height: 36px; + background: #f3f3f3; + font-size: 18px; + color: #d3d3d3; + text-align: center; + border-right: 1px solid #bdbdbd; +} +.user-con .user-item .user-content{ + outline: none; + padding: 10px 0 10px 50px; + width: 308px; +} +.user-con .btn-submit{ + padding: 2px 0; + width: 100%; + text-align: center; + font-size: 20px; +} +/*跳转连接*/ +.user-con .link-item{ + text-align: right; + margin-top: 10px; +} +.user-con .link-item .link{ + margin-left: 10px; + color: #999; +} \ No newline at end of file diff --git a/src/page/user-login/index.js b/src/page/user-login/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a5e895691fb1efcbab9f77331712f145f17b1f5d --- /dev/null +++ b/src/page/user-login/index.js @@ -0,0 +1,81 @@ +/* +* @Author: root +* @Date: 2017-10-30 21:56:07 +* @Last Modified by: root +* @Last Modified time: 2017-11-08 10:32:43 +*/ +'user strict' +require('./index.css'); +require('page/common/nav-simple/index.js'); +var _user = require('service/user-service.js'); +var _utils = require('util/util.js'); +//表单的错误提示 +var formError = { + show : function(errMsg){ + $('.error-item').show().find('.err-msg').text(errMsg); + }, + hide : function(){ + $('.error-item').hide().find('.err-msg').text(''); + } +} +var page = { + init : function(){ + this.bindEvent(); + }, + bindEvent : function(){ + var _this = this; + //登陆按钮的点击 + $('#submit').click(function(){ + _this.submit(); + }); + //如果按下回车,也进行提交 + $('.user-content').keyup(function(e){ + //当keyCode等于回车13时候则表示,回车也提交 + if(e.keyCode === 13){ + _this.submit(); + } + }); + + },//提交表单 + submit : function(){ + var formData = { + username : $.trim($('#username').val()), + password : $.trim($('#password').val()) + }; + //表单验证结果 + validateResult = this.formValidate(formData); + if (validateResult.status) { + //提交成功 + _user.login(formData,function(res){ + window.location.href = _utils.getUrlParam('redirect') || './index.html'; + }, function(errMsg){ + formError.show(errMsg); + }); + //验证失败,错误提示 + }else { + formError.show(validateResult.msg); + } + }, + //表单字段的验证 + formValidate : function(formData){ + var result = { + status : false, + msg : '' + }; + if (!_utils.validate(formData.username,'require')) { + result.msg = '用户名不能为空'; + return result; + } + if (!_utils.validate(formData.password,'require')) { + result.msg = '密码不能为空'; + return result; + } + //通过验证,返回正确提示 + result.status = true; + result.msg = '验证通过'; + return result; + } +}; +$(function(){ + page.init(); +}) \ No newline at end of file diff --git a/src/page/user-pass-reset/index.css b/src/page/user-pass-reset/index.css new file mode 100644 index 0000000000000000000000000000000000000000..232afa3a5d8ca0c64755f3e71ac6d048ced4ac73 --- /dev/null +++ b/src/page/user-pass-reset/index.css @@ -0,0 +1,88 @@ +/* * @Author: root * @Date: 2017-11-14 13:15:25 * @Last Modified by: root +* @Last Modified time: 2017-11-16 20:07:23 +padding: 40px 0; + +} +/*表单框*/ +.user-con{ + position: relative; + width:400px; + margin: 0 auto; + background: #fff; +} +.user-con .user-title{ + text-align: center; + padding: 10px 0; + border-bottom: 1px solid #ddd; + font-size: 18px; + font-weight: bold;; + color: #666; +} +.user-con .user-box{ + padding: 20px; +} +/*错误提示框*/ +.user-con .user-box .error-item{ + display: none; + position: relative; + padding: 4px 0 4px 40px; + margin-bottom: 10px; + border:1px solid red; + color: red; + background: #fde9e9; +} +/*错误提示*/ +.user-con .user-box .error-icon{ + position: absolute; + left: 14px; + top: 50%; + font-size: 14px; + margin-top: -7px; +} +/*输入框容器*/ +.user-con .user-item{ + position: relative; + margin-bottom: 20px; +} +.user-con .user-item-text{ + margin-bottom: 10px; + font-size: 14px; +} +/* 每一步的容器 */ +.user-con .step-con{ + display: none; +} +.user-con .user-item .user-label{ + outline: none; + position: absolute; + left: 1px; + top: 1px; + bottom: 1px; + width: 40px; + line-height: 36px; + background: #f3f3f3; + font-size: 18px; + color: #d3d3d3; + text-align: center; + border-right: 1px solid #bdbdbd; +} +.user-con .user-item .user-content{ + outline: none; + padding: 10px 0 10px 50px; + width: 308px; +} +.user-con .btn-submit{ + padding: 2px 0; + width: 100%; + text-align: center; + font-size: 20px; +} +/*跳转连接*/ +.user-con .link-item{ + text-align: right; + margin-top: 10px; +} +.user-con .link-item .link{ + margin-left: 10px; + color: #999; +} \ No newline at end of file diff --git a/src/page/user-pass-reset/index.js b/src/page/user-pass-reset/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8c1ac658d1e0e4d7e8acf6b06917f28731329692 --- /dev/null +++ b/src/page/user-pass-reset/index.js @@ -0,0 +1,138 @@ +/* +* @Author: root +* @Date: 2017-11-14 13:15:15 +* @Last Modified by: root +* @Last Modified time: 2017-11-14 22:38:58 +*/ +'user strict' +require('./index.css'); +require('page/common/nav-simple/index.js'); +var _user = require('service/user-service.js'); +var _utils = require('util/util.js'); +//表单的错误提示 +var formError = { + show : function(errMsg){ + $('.error-item').show().find('.err-msg').text(errMsg); + }, + hide : function(){ + $('.error-item').hide().find('.err-msg').text(''); + } +} +var page = { + data : { + username : '', + question : '', + answer : '', + token : '' + }, + init : function(){ + this.onload(); + this.bindEvent(); + }, + onload : function(){ + this.loadStepUsername(); + }, + bindEvent : function(){ + var _this = this; + //输入用户名下一步的点击 + $('#submit-username').click(function(){ + var username = $.trim($('#username').val()); + //用户名存在 + if(username){ + _user.getQuestion(username,function(res){ + _this.data.username = username; + _this.data.question = res; + _this.loadStepQuestion(); + },function(errMsg){ + formError.show(errMsg); + }); + }//用户名不存在 + else { + formError.show("请输入用户名"); + } + }); + //输入问题提示问题答案中的按钮的点击 + $('#submit-question').click(function(){ + var answer = $.trim($('#answer').val()); + //检查答案是否存在 + if(answer){ + _user.checkAnswer({ + username : _this.data.username, + question : _this.data.question, + answer : answer + },function(res){ + _this.data.answer = username; + _this.data.token = res; + _this.loadStepPassword(); + },function(errMsg){ + formError.show(errMsg); + }); + }//用户名不存在 + else { + formError.show("请输入密码提示的答案 "); + } + }); + //输入问题提示问题答案中的按钮的点击 + $('#submit-question').click(function(){ + var answer = $.trim($('#answer').val()); + //检查答案是否存在 + if(answer){ + _user.checkAnswer({ + username : _this.data.username, + question : _this.data.question, + answer : answer + },function(res){ + _this.data.answer = username; + _this.data.token = res; + _this.loadStepPassword(); + },function(errMsg){ + formError.show(errMsg); + }); + }//用户名不存在 + else { + formError.show("请输入密码提示的答案 "); + } + }); + //输入新密码后 + $('#submit-password').click(function(){ + var password = $.trim($('#password').val()); + //密码是否为空 + if(password && password.length>= 6){ + _user.reserPassword({ + username : _this.data.username, + passwordNew : password, + forgetToken : _this.data.token + },function(res){ + window.location.href = './result.html?type=pass-reset'; + },function(errMsg){ + formError.show(errMsg); + }); + }//密码为空 + else { + formError.show("请输入不小于6位的密码 "); + } + }); + }, + //加载输入用户名的一步 + loadStepUsername : function(){ + $('.step-username').show(); + }, + //加载输入问题答案的一步 + loadStepQuestion : function(){ + //清除错误提示 + formError.hide(); + //做容器的切换 + + $('.step-username').hide() + .siblings('.step-question').show().find('.question').text(this.data.question); + }, + //加载输入用户新密码的一步 + loadStepPassword : function(){ + formError.hide(); + $('.step-question').hide().siblings('.step-password').show(); + }, + +}; +$(function(){ + page.init(); +}) \ No newline at end of file diff --git a/src/page/user-pass-update/index.css b/src/page/user-pass-update/index.css new file mode 100644 index 0000000000000000000000000000000000000000..2d440c3baa8e90fb19b679eb7e9d7f9f116a0aea --- /dev/null +++ b/src/page/user-pass-update/index.css @@ -0,0 +1,24 @@ +/* +* @Author: root +* @Date: 2017-11-18 21:31:12 +* @Last Modified by: root +* @Last Modified time: 2017-11-18 22:12:03 +*/ +.form-line{ + height: 30px; + line-height: 30px; + font-size: 14px; + margin-bottom: 10px; +} +.form-line .label{ + display: inline-block; + width: 80px; + text-align: center; +} +.form-line .input{ + height: 25px; + line-height: 25px; + font-size: 14px; + width:200px; + +} \ No newline at end of file diff --git a/src/page/user-pass-update/index.js b/src/page/user-pass-update/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a136697359055de57311996640f6f7b3caa09b01 --- /dev/null +++ b/src/page/user-pass-update/index.js @@ -0,0 +1,98 @@ +/* +* @Author: root +* @Date: 2017-11-18 21:31:01 +* @Last Modified by: root +* @Last Modified time: 2017-11-18 22:42:07 +*/ +'use strict'; +require('./index.css'); +require('page/common/nav/index.js'); +require('page/common/header/index.js'); +var navSide = require('page/common/nav-side/index.js'); +var _utils = require('util/util.js'); +var _user = require('service/user-service.js'); + +var page = { + init : function(){ + this.onload(); + + this.bindEvent(); + }, + onload : function(){ + //初始化左侧菜单 + navSide.init({ + name:'user-pass-update' + }); + }, + bindEvent : function(){ + var _this = this; + $(document).on('click','.btn-submit',function(){ + var userInfo = { + password : $.trim($("#password").val()), + passwordNew : $.trim($("#password-new").val()), + passwordConfirm : $.trim($("#password-confirm").val()) + }, + validateResult = _this.validateForm(userInfo); + + if(validateResult.status){ + //更改用户密码 + _user.updatePassword({ + passwordOld : userInfo.password, + passwordNew : userInfo.passwordNew + },function(res,msg){ + _utils.successTips(msg); + //修改成功后退出用户 + _user.logout(function(res){ + window.location.href = './user-login.html'; + alert("请重新登陆"); + }, function(errMsg){ + util.errorTips(errMsg); + }); + + + },function(errMsg){ + _utils.errorTips(validateResult.msg); + }); + } + else { + _utils.errorTips(validateResult.msg); + } + }); + },//验证字段信息 + validateForm : function(formData){ + + var result = { + status : false, + msg : '' + }; + //验证原密码是否为空 + if(!_utils.validate(formData.password, 'require')){ + result.msg = '原密码不能为空'; + return result; + } + if (!formData.passwordNew||formData.passwordNew.length <6) { + result.msg = '新密码长度不得少于6位'; + return result; + } + if (!formData.password||formData.password.length <6) { + result.msg = '密码长度不得少于6位'; + return result; + } + if(!_utils.validate(formData.passwordConfirm, 'require')){ + result.msg = '请确认输入密码'; + return result; + } + //问题不能为空 + if (formData.passwordNew !== formData.passwordConfirm){ + result.msg = '两次输入密码不正确'; + } + + //通过验证,返回正确提示 + result.status = true; + result.msg = '验证通过'; + return result; + } +}; +$(function(){ + page.init(); +}); \ No newline at end of file diff --git a/src/page/user-register/index.css b/src/page/user-register/index.css new file mode 100644 index 0000000000000000000000000000000000000000..ae5b0138204f593d2d21fa0d01663b91a9fdabd9 --- /dev/null +++ b/src/page/user-register/index.css @@ -0,0 +1,87 @@ + + +/* +* @Author: root +* @Date: 2017-11-08 10:47:57 +* @Last Modified by: root +* @Last Modified time: 2017-11-16 21:42:26 +*/ +/*最外容器色*/ +.page-wrap{ + padding: 40px 0; + background:#e72955; +} +/*表单框*/ +.user-con{ + position: relative; + width:400px; + margin: 0 auto; + background: #fff; +} +.user-con .user-title{ + text-align: center; + padding: 10px 0; + border-bottom: 1px solid #ddd; + font-size: 18px; + font-weight: bold;; + color: #666; +} +.user-con .user-box{ + padding: 20px; +} +/*错误提示框*/ +.user-con .user-box .error-item{ + display: none; + position: relative; + padding: 4px 0 4px 40px; + margin-bottom: 10px; + border:1px solid red; + color: red; + background: #fde9e9; +} +/*错误提示*/ +.user-con .user-box .error-icon{ + position: absolute; + left: 14px; + top: 50%; + font-size: 14px; + margin-top: -7px; +} +.user-con .user-item{ + position: relative; + margin-bottom: 20px; +} +.user-con .user-item .user-label{ + outline: none; + position: absolute; + left: 1px; + top: 1px; + bottom: 1px; + width: 40px; + line-height: 36px; + background: #f3f3f3; + font-size: 18px; + color: #d3d3d3; + text-align: center; + border-right: 1px solid #bdbdbd; +} +.user-con .user-item .user-content{ + outline: none; + padding: 10px 0 10px 50px; + width: 308px; +} +.user-con .btn-submit{ + padding: 2px 0; + width: 100%; + text-align: center; + font-size: 20px; +} +/*跳转连接*/ +.user-con .link-item{ + text-align: right; + margin-top: 10px; +} +.user-con .link-item .link{ + margin-left: 10px; + color: #999; +} \ No newline at end of file diff --git a/src/page/user-register/index.js b/src/page/user-register/index.js new file mode 100644 index 0000000000000000000000000000000000000000..48283797cfed2181ad7cef65f585b1064b05812b --- /dev/null +++ b/src/page/user-register/index.js @@ -0,0 +1,126 @@ +/* +* @Author: root +* @Date: 2017-11-08 10:47:48 +* @Last Modified by: root +* @Last Modified time: 2017-11-08 18:37:57 +*/ +'user strict' +require('./index.css'); +require('page/common/nav-simple/index.js'); +var _user = require('service/user-service.js'); +var _utils = require('util/util.js'); +//表单的错误提示 +var formError = { + show : function(errMsg){ + $('.error-item').show().find('.err-msg').text(errMsg); + }, + hide : function(){ + $('.error-item').hide().find('.err-msg').text(''); + } +} +//逻辑 +var page = { + init : function(){ + this.bindEvent(); + }, + bindEvent : function(){ + var _this = this; + //验证username + $('#username').blur(function(){ + var username = $.trim($(this).val()); + //如果用户名为空则不验证 + if(!username){ + return; + } + // 异步验证用吗是否存在 + _user.checkUsername(username,function(res){ + formError.hide(); + },function(errMsg){ + formError.show(errMsg); + }); + }); + //注册按钮的点击 + $('#submit').click(function(){ + _this.submit(); + }); + //如果按下回车,也进行提交 + $('.user-content').keyup(function(e){ + //当keyCode等于回车13时候则表示,回车也提交 + if(e.keyCode === 13){ + _this.submit(); + } + }); + + },//提交表单 + submit : function(){ + var formData = { + username : $.trim($('#username').val()), + password : $.trim($('#password').val()), + passwordConfirm : $.trim($('#password-confirm').val()), + phone : $.trim($('#phone').val()), + email : $.trim($('#email').val()), + question : $.trim($('#question').val()), + answer : $.trim($('#answer').val()) + }, + //表单验证结果 + validateResult = this.formValidate(formData); + if (validateResult.status) { + //提交成功 + _user.register(formData,function(res){ + window.location.href = './index.html?type=register'; + }, function(errMsg){ + formError.show(errMsg); + }); + //验证失败,错误提示 + }else { + formError.show(validateResult.msg); + } + }, + //表单字段的验证 + formValidate : function(formData){ + var result = { + status : false, + msg : '' + }; + if (!_utils.validate(formData.username,'require')) { + result.msg = '用户名不能为空'; + return result; + } + if (!_utils.validate(formData.password,'require')) { + result.msg = '密码不能为空'; + return result; + } + if (formData.password.length < 6) { + result.msg = '密码长度不能少于6位'; + return result; + } + //验证两次 + if (formData.password!== formData.passwordConfirm) { + result.msg = '两次输入的密码不一致'; + return result; + } + if(!_utils.validate(formData.email, 'email')){ + result.msg = '邮箱格式不正确'; + return result; + } + if (!_utils.validate(formData.phone,'phone')) { + result.msg = '手机格式不正确'; + return result; + } + if (!_utils.validate(formData.question,'require')) { + result.msg = '问题不能为空'; + return result; + } + if (!_utils.validate(formData.answer,'require')) { + result.msg = '答案不能为空'; + return result; + } + //通过验证,返回正确提示 + result.status = true; + result.msg = '验证通过'; + return result; + } +}; +$(function(){ + page.init(); +}) \ No newline at end of file diff --git a/src/service/address-service.js b/src/service/address-service.js new file mode 100644 index 0000000000000000000000000000000000000000..81e02f4e7a89484209d031c092d7a8e8a826a89b --- /dev/null +++ b/src/service/address-service.js @@ -0,0 +1,73 @@ +/* +* @Author: root +* @Date: 2017-11-29 22:42:38 +* @Last Modified by: root +* @Last Modified time: 2017-12-04 21:46:07 +*/ +/* +* @Author: root +* @Date: 2017-11-29 21:14:27 +* @Last Modified by: root +* @Last Modified time: 2017-11-29 21:14:51 +*/ +'use strict'; + +var _utils = require('util/util.js'); + +var _address = { + + // 获取地址列表 + getAddressList : function(resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/shipping/list.do'), + data :{ + pageSize : 50 + }, + success : resolve, + error : reject + }); + }, + //新增收件人地址 + save : function(addressInfo,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/shipping/add.do'), + data : addressInfo, + success : resolve, + error : reject + }); + }, + //获取单条收件人信息 + getAddress : function(shippingId,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/shipping/select.do'), + data : { + shippingId : shippingId + }, + success : resolve, + error : reject + }); + }, + //更新收件人 + update : function(addressInfo,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/shipping/update.do'), + data : addressInfo, + success : resolve, + error : reject + }); + }, + //删除收件人的地址信息 + //获取单条收件人信息 + deleteAddress : function(shippingId,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/shipping/del.do'), + data : { + shippingId : shippingId + }, + success : resolve, + error : reject + }); + }, + +} +module.exports = _address; \ No newline at end of file diff --git a/src/service/cart-service.js b/src/service/cart-service.js new file mode 100644 index 0000000000000000000000000000000000000000..b5ff6a8ec973a5af09ee4e893b00b100956dc9ee --- /dev/null +++ b/src/service/cart-service.js @@ -0,0 +1,98 @@ +/* +* @Author: root +* @Date: 2017-11-05 13:46:35 +* @Last Modified by: root +* @Last Modified time: 2017-11-29 00:41:54 +*/ +'use strict'; + +var _mm = require('util/util.js'); + +var _cart = { + + // 获取购物车数量 + getCartCount : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/get_cart_product_count.do'), + success : resolve, + error : reject + }); + }, + // 添加到购物车 + + addToCart : function(productInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/add.do'), + data : productInfo, + success : resolve, + error : reject + }); + }, + // 获取购物车列表 + getCartList : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/list.do'), + success : resolve, + error : reject + }); + }, + // 选择购物车商品 + selectProduct : function(productId, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/select.do'), + data : { + productId : productId + }, + success : resolve, + error : reject + }); + }, + // 取消选择购物车商品 + unselectProduct : function(productId, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/un_select.do'), + data : { + productId : productId + }, + success : resolve, + error : reject + }); + }, + // 选中全部商品 + selectAllProduct : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/select_all.do'), + success : resolve, + error : reject + }); + }, + // 取消选中全部商品 + unselectAllProduct : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/un_select_all.do'), + success : resolve, + error : reject + }); + }, + // 更新购物车商品数量 + updateProduct : function(productInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/update.do'), + data : productInfo, + success : resolve, + error : reject + }); + }, + // 删除指定商品 + deleteProduct : function(productIds, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/cart/delete_product.do'), + data : { + productIds : productIds + }, + success : resolve, + error : reject + }); + }, +} +module.exports = _cart; \ No newline at end of file diff --git a/src/service/order-service.js b/src/service/order-service.js new file mode 100644 index 0000000000000000000000000000000000000000..1b384e34bebf11e970b59f06ae68b40f50d5a0c2 --- /dev/null +++ b/src/service/order-service.js @@ -0,0 +1,62 @@ +/* +* @Author: root +* @Date: 2017-11-29 21:14:27 +* @Last Modified by: root +* @Last Modified time: 2017-12-07 23:16:04 +*/ +'use strict'; + +var _utils = require('util/util.js'); + +var _cart = { + + // 获取订单信息 + getProductList : function(resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/order/get_order_cart_product.do'), + success : resolve, + error : reject + }); + }, + // 提交订单 + createOrder : function(OrderInfo, resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/order/create.do'), + data : OrderInfo, + success : resolve, + error : reject + }); + }, + //获取订单列表 + getOrderList : function(listParam,resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/order/list.do'), + data : listParam, + success : resolve, + error : reject + }); + }, + //获取订单详情 + getOrderDetail : function(orderNumber,resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/order/detail.do'), + data : { + orderNo : orderNumber + }, + success : resolve, + error : reject + }); + }, + //取消订单 + cancelOrder : function(orderNumber,resolve, reject){ + _utils.request({ + url : _utils.getServerUrl('/order/cancel.do'), + data : { + orderNo : orderNumber + }, + success : resolve, + error : reject + }); + } +} +module.exports = _cart; \ No newline at end of file diff --git a/src/service/payment-service.js b/src/service/payment-service.js new file mode 100644 index 0000000000000000000000000000000000000000..48387e5e188881d2747323ab99bab9475e9815e4 --- /dev/null +++ b/src/service/payment-service.js @@ -0,0 +1,36 @@ +/* +* @Author: root +* @Date: 2017-12-09 13:42:36 +* @Last Modified by: root +* @Last Modified time: 2017-12-09 14:20:00 +*/ +'use strict'; + +var _utils = require('util/util.js'); + +var _payment = { + + // 获取商品列表信息 + getPaymentInfo : function (orderNumber, resolve, reject) { + _utils.request({ + url : _utils.getServerUrl('/order/pay.do'), + data : { + orderNo : orderNumber + }, + success : resolve, + error : reject + }); + }, + //获取订单状态 + getPaymentStatus : function (orderNumber, resolve, reject) { + _utils.request({ + url : _utils.getServerUrl('/order/query_order_pay_status.do'), + data : { + orderNo : orderNumber + }, + success : resolve, + error : reject + }); + }, +} +module.exports = _payment; \ No newline at end of file diff --git a/src/service/product-service.js b/src/service/product-service.js new file mode 100644 index 0000000000000000000000000000000000000000..7881376c9950424f18d6bc5d4ad57bee03a0425a --- /dev/null +++ b/src/service/product-service.js @@ -0,0 +1,31 @@ +/* +* @Author: root +* @Date: 2017-11-25 18:50:32 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 23:46:00 +*/ +'use strict' +var _utils = require('util/util.js'); + +var _product = { + //获取商品列表的信息 + getProductList : function(listParm,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/product/list.do'), + data : listParm, + success : resolve, + error : reject + }); + },//获取商品详细信息 + getProductDetail : function(productId,resolve,reject){ + _utils.request({ + url : _utils.getServerUrl('/product/detail.do'), + data : { + productId : productId + }, + success : resolve, + error : reject + }); + } +} +module.exports = _product; \ No newline at end of file diff --git a/src/service/user-service.js b/src/service/user-service.js new file mode 100644 index 0000000000000000000000000000000000000000..d82742c34daf8a0dd44cb0d0b436b8656726b130 --- /dev/null +++ b/src/service/user-service.js @@ -0,0 +1,208 @@ +/* +* @Author: root +* @Date: 2017-11-05 13:46:16 +* @Last Modified by: root +* @Last Modified time: 2017-11-18 22:11:05 +*/ +'use strict'; + +var _mm = require('util/util.js'); + +var _user = { + //登录状态下更新密码 + updatePassword : function(){ + _mm.request({ + url : _mm.getServerUrl('/user/reset_password.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + updateUserInfo : function(userInfo,resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/update_information.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 获取用户信息 + getUserInfo : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/get_information.do'), + method : 'POST', + success : resolve, + error : reject + }); + }, + //重置密码 + reserPassword : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_reset_password.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + checkAnswer : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_check_answer.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + //获取用户密码提示问题 + getQuestion : function(username, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_get_question.do'), + data : { + username :username + }, + method : 'POST', + success : resolve, + error : reject + }); + }, + + // 检验用户名 + checkUsername : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/check_valid.do'), + data : { + type : 'username', + str : username + }, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 用户注册 + register : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/register.do'), + data : userInfo , + method : 'POST', + success : resolve, + error : reject + }); + }, + // 用户登录 + login : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/login.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 检查用户名 + checkUsername : function(username, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/check_valid.do'), + data : { + type : 'username', + str : username + }, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 用户注册 + register : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/register.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 检查登录状态 + checkLogin : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/get_user_info.do'), + method : 'POST', + success : resolve, + error : reject + }); + }, + // 获取用户密码提示问题 + getQuestion : function(username, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_get_question.do'), + data : { + username : username + }, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 检查密码提示问题答案 + checkAnswer : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_check_answer.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 重置密码 + resetPassword : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/forget_reset_password.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 获取用户信息 + getUserInfo : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/get_information.do'), + method : 'POST', + success : resolve, + error : reject + }); + }, + // 更新个人信息 + updateUserInfo : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/update_information.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 登录状态下更新密码 + updatePassword : function(userInfo, resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/reset_password.do'), + data : userInfo, + method : 'POST', + success : resolve, + error : reject + }); + }, + // 登出 + logout : function(resolve, reject){ + _mm.request({ + url : _mm.getServerUrl('/user/logout.do'), + method : 'POST', + success : resolve, + error : reject + }); + } +} +module.exports = _user; \ No newline at end of file diff --git a/src/util/cities/index.js b/src/util/cities/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6b5cbe908b5c6ea83040810fabbd68887ba247a6 --- /dev/null +++ b/src/util/cities/index.js @@ -0,0 +1,59 @@ +/* +* @Author: root +* @Date: 2017-12-03 22:26:22 +* @Last Modified by: root +* @Last Modified time: 2017-12-03 22:48:36 +*/ +'use strict'; +var _cities = { + cityInfo : { + "北京市": ["北京市"], + "天津市": ["天津市"], + "河北省": ["石家庄市", "唐山市", "秦皇岛市", "邯郸市", "邢台市", "保定市", "张家口市", "承德市", "沧州市", "廊坊市", "衡水市"], + "山西省": ["太原市", "大同市", "阳泉市", "长治市", "晋城市", "朔州市", "晋中市", "运城市", "忻州市", "临汾市", "吕梁市"], + "内蒙古自治区": ["呼和浩特市", "包头市", "乌海市", "赤峰市", "通辽市", "鄂尔多斯市", "呼伦贝尔市", "巴彦淖尔市", "乌兰察布市", "兴安盟", "锡林郭勒盟", "阿拉善盟"], + "辽宁省": ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市", "丹东市", "锦州市", "营口市", "阜新市", "辽阳市", "盘锦市", "铁岭市", "朝阳市", "葫芦岛市"], + "吉林省": ["长春市", "吉林市", "四平市", "辽源市", "通化市", "白山市", "松原市", "白城市", "延边朝鲜族自治州"], + "黑龙江省": ["哈尔滨市", "齐齐哈尔市", "鸡西市", "鹤岗市", "双鸭山市", "大庆市", "伊春市", "佳木斯市", "七台河市", "牡丹江市", "黑河市", "绥化市", "大兴安岭地区"], + "上海市": ["上海市"], + "江苏省": ["南京市", "无锡市", "徐州市", "常州市", "苏州市", "南通市", "连云港市", "淮安市", "盐城市", "扬州市", "镇江市", "泰州市", "宿迁市"], + "浙江省": ["杭州市", "宁波市", "温州市", "嘉兴市", "湖州市", "绍兴市", "金华市", "衢州市", "舟山市", "台州市", "丽水市"], + "安徽省": ["合肥市", "芜湖市", "蚌埠市", "淮南市", "马鞍山市", "淮北市", "铜陵市", "安庆市", "黄山市", "滁州市", "阜阳市", "宿州市", "六安市", "亳州市", "池州市", "宣城市"], + "福建省": ["福州市", "厦门市", "莆田市", "三明市", "泉州市", "漳州市", "南平市", "龙岩市", "宁德市"], + "江西省": ["南昌市", "景德镇市", "萍乡市", "九江市", "新余市", "鹰潭市", "赣州市", "吉安市", "宜春市", "抚州市", "上饶市"], + "山东省": ["济南市", "青岛市", "淄博市", "枣庄市", "东营市", "烟台市", "潍坊市", "济宁市", "泰安市", "威海市", "日照市", "莱芜市", "临沂市", "德州市", "聊城市", "滨州市", "菏泽市"], + "河南省": ["郑州市", "开封市", "洛阳市", "平顶山市", "安阳市", "鹤壁市", "新乡市", "焦作市", "濮阳市", "许昌市", "漯河市", "三门峡市", "南阳市", "商丘市", "信阳市", "周口市", "驻马店市"], + "湖北省": ["武汉市", "黄石市", "十堰市", "宜昌市", "襄阳市", "鄂州市", "荆门市", "孝感市", "荆州市", "黄冈市", "咸宁市", "随州市", "恩施土家族苗族自治州"], + "湖南省": ["长沙市", "株洲市", "湘潭市", "衡阳市", "邵阳市", "岳阳市", "常德市", "张家界市", "益阳市", "郴州市", "永州市", "怀化市", "娄底市", "湘西土家族苗族自治州"], + "广东省": ["广州市", "韶关市", "深圳市", "珠海市", "汕头市", "佛山市", "江门市", "湛江市", "茂名市", "肇庆市", "惠州市", "梅州市", "汕尾市", "河源市", "阳江市", "清远市", "东莞市", "中山市", "潮州市", "揭阳市", "云浮市"], + "广西壮族自治区": ["南宁市", "柳州市", "桂林市", "梧州市", "北海市", "防城港市", "钦州市", "贵港市", "玉林市", "百色市", "贺州市", "河池市", "来宾市", "崇左市"], + "海南省": ["海口市", "三亚市", "三沙市", "儋州市"], + "重庆市": ["重庆市"], + "四川省": ["成都市", "自贡市", "攀枝花市", "泸州市", "德阳市", "绵阳市", "广元市", "遂宁市", "内江市", "乐山市", "南充市", "眉山市", "宜宾市", "广安市", "达州市", "雅安市", "巴中市", "资阳市", "阿坝藏族羌族自治州", "甘孜藏族自治州", "凉山彝族自治州"], + "贵州省": ["贵阳市", "六盘水市", "遵义市", "安顺市", "毕节市", "铜仁市", "黔西南布依族苗族自治州", "黔东南苗族侗族自治州", "黔南布依族苗族自治州"], + "云南省": ["昆明市", "曲靖市", "玉溪市", "保山市", "昭通市", "丽江市", "普洱市", "临沧市", "楚雄彝族自治州", "红河哈尼族彝族自治州", "文山壮族苗族自治州", "西双版纳傣族自治州", "大理白族自治州", "德宏傣族景颇族自治州", "怒江傈僳族自治州", "迪庆藏族自治州"], + "西藏自治区": ["拉萨市", "日喀则市", "昌都市", "林芝市", "山南市", "那曲地区", "阿里地区"], + "陕西省": ["西安市", "铜川市", "宝鸡市", "咸阳市", "渭南市", "延安市", "汉中市", "榆林市", "安康市", "商洛市"], + "甘肃省": ["兰州市", "嘉峪关市", "金昌市", "白银市", "天水市", "武威市", "张掖市", "平凉市", "酒泉市", "庆阳市", "定西市", "陇南市", "临夏回族自治州", "甘南藏族自治州"], + "青海省": ["西宁市", "海东市", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州", "果洛藏族自治州", "玉树藏族自治州", "海西蒙古族藏族自治州"], + "宁夏回族自治区": ["银川市", "石嘴山市", "吴忠市", "固原市", "中卫市"], + "新疆维吾尔自治区": ["乌鲁木齐市", "克拉玛依市", "吐鲁番市", "哈密市", "昌吉回族自治州", "博尔塔拉蒙古自治州", "巴音郭楞蒙古自治州", "阿克苏地区", "克孜勒苏柯尔克孜自治州", "喀什地区", "和田地区", "伊犁哈萨克自治州", "塔城地区", "阿勒泰地区"], + "台湾省": [], + "香港特别行政区": [], + "澳门特别行政区": [] + }, + //获取所有的省份 + getProvinces : function(){ + var provinces = []; + for(var item in this.cityInfo){ + provinces.push(item); + } + return provinces; + }, + //获取某个省份的所有城市 + getCities : function(provinceName){ + return this.cityInfo[provinceName] || []; + }, + +} +module.exports=_cities; diff --git a/src/util/pagination/index.css b/src/util/pagination/index.css new file mode 100644 index 0000000000000000000000000000000000000000..c962e91d791bf26f4fa4f010173cfbe02530a807 --- /dev/null +++ b/src/util/pagination/index.css @@ -0,0 +1,39 @@ +/* +* @Author: root +* @Date: 2017-11-26 00:26:32 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 18:52:28 +*/ +.pg-content{ + text-align: center; + color: #333; +} +.pg-content .pg-item{ +display: inline-block; + height: 36px; + line-height: 36px; + padding: 0 15px; + margin: 0 2px; + border: 1px solid #ccc; + background: #eee; + cursor: pointer; + -moz-user-select : none; + -webkit-user-select : none; + -ms-user-select : none; + user-select : none; +} +.pg-content .pg-item.disabled{ + color: #ccc; + background: none; + cursor: auto; +} +.pg-content .pg-item.active{ + border: 1px solid #f6f6f6; + background: none; + cursor: auto; +} +.pg-content .pg-total{ + margin-left: 10px; + background: none; + cursor: auto; +} \ No newline at end of file diff --git a/src/util/pagination/index.js b/src/util/pagination/index.js new file mode 100644 index 0000000000000000000000000000000000000000..469cca6cd67257081e99653b30cd3578dc5f5b63 --- /dev/null +++ b/src/util/pagination/index.js @@ -0,0 +1,83 @@ + /* +* @Author: root +* @Date: 2017-11-26 00:26:21 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 19:08:13 +*/ +'use strict'; +require('./index.css'); +var templatePagination = require('./index.string'); +var _utils = require('util/util.js'); +var Pagination = function(){ + var _this = this; + this.defaultOption ={ + container : null, + pageNum : 1, + pageRange : 3, + onSelectPage : null + }; + //事件的处理 + $(document).on('click','.pg-item',function(){ + var $this = $(this); + //对于active和disabled按钮点击,不做处理 + if ($this.hasClass('active')|| $this.hasClass('disabled')) { + return; + } + typeof _this.option.onSelectPage === 'function' ? + _this.option.onSelectPage($this.data('value')):null; + }); +}; +//渲染分页组件 +Pagination.prototype.render = function(userOption){ + this.option = $.extend({},this.defaultOption,userOption); + this.option = $.extend({}, this.defaultOption, userOption); + //判断对象是否为合法的jquery对象 + if (!(this.option.container instanceof jQuery)) { + return; + } + //判断是否只有一页 + if (this.option.pages <= 1) { + return; + } + //渲染分页内容 + this.option.container.html(this.getPaginationHtml()); +} +//获取分页的html +Pagination.prototype.getPaginationHtml = function(){ + //|上一页| 1 2 3 4 =5= 6|下一页| 5/6 + var html = '', + option = this.option, + pageArray = [], + start = option.pageNum - option.pageRange > 0 + ? option.pageNum - option.pageRange : 1, + end = option.pageNum + option.pageRange < option.pages + ? option.pageNum + option.pageRange : option.pages; + // 上一页按钮的数据 + pageArray.push({ + name : '上一页', + value : this.option.prePage, + disabled : !this.option.hasPreviousPage + }); + + // 数字按钮的处理 + for(var i = start; i <= end; i++){ + pageArray.push({ + name : i, + value : i, + active : (i === option.pageNum) + }); + }; + //下一页按钮的数据 + pageArray.push({ + name : '下一页', + value : this.option.nextPage, + disabled : !this.option.hasNextPage + }); + html = _utils.renderHtml(templatePagination,{ + pageArray : pageArray, + pageNum : option.pageNum, + pages : option.pages + }); + return html; +}; +module.exports = Pagination; \ No newline at end of file diff --git a/src/util/pagination/index.string b/src/util/pagination/index.string new file mode 100644 index 0000000000000000000000000000000000000000..d06e1eecbcaf411b0ce5176c6d8cc3a21586fd4b --- /dev/null +++ b/src/util/pagination/index.string @@ -0,0 +1,16 @@ +
    + {{#pageArray}} + {{#disabled}} + {{name}} + {{/disabled}} + {{^disabled}} + {{#active}} + {{name}} + {{/active}} + {{^active}} + {{name}} + {{/active}} + {{/disabled}} + {{/pageArray}} + {{pageNum}}/{{pages}} +
    \ No newline at end of file diff --git a/src/util/slider/index.css b/src/util/slider/index.css new file mode 100644 index 0000000000000000000000000000000000000000..306eec183c438ba35e6204ce9239df0ae498e7b9 --- /dev/null +++ b/src/util/slider/index.css @@ -0,0 +1,16 @@ +/* +* @Author: root +* @Date: 2017-11-25 14:44:54 +* @Last Modified by: root +* @Last Modified time: 2017-11-25 16:34:56 +*/ +/*banner*/ +.banner { + position: relative; + overflow: auto; +} +.banner li { list-style: none; +} +.banner ul li { float: left; +} + diff --git a/src/util/slider/index.js b/src/util/slider/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2634e29e087619cbf0cd00e4eaf2350d657dfbd4 --- /dev/null +++ b/src/util/slider/index.js @@ -0,0 +1,9 @@ +/* +* @Author: root +* @Date: 2017-11-25 14:44:46 +* @Last Modified by: root +* @Last Modified time: 2017-11-25 15:11:24 +*/ +'use strict'; +require('./index.css'); +require('./index.js'); diff --git a/src/util/slider/unslider.js b/src/util/slider/unslider.js new file mode 100644 index 0000000000000000000000000000000000000000..777abd6ef5a99c93fb496cc11e7625d461277342 --- /dev/null +++ b/src/util/slider/unslider.js @@ -0,0 +1,617 @@ +/** + * Unslider + * version 2.0 + * by @idiot and friends + */ + +(function($) { + // Don't throw any errors when jQuery + if(!$) { + return console.warn('Unslider needs jQuery'); + } + + $.Unslider = function(context, options) { + var self = this; + + // Create an Unslider reference we can use everywhere + self._ = 'unslider'; + + // Store our default options in here + // Everything will be overwritten by the jQuery plugin though + self.defaults = { + // Should the slider move on its own or only when + // you interact with the nav/arrows? + // Only accepts boolean true/false. + autoplay: false, + + // 3 second delay between slides moving, pass + // as a number in milliseconds. + delay: 3000, + + // Animation speed in millseconds + speed: 750, + + // An easing string to use. If you're using Velocity, use a + // Velocity string otherwise you can use jQuery/jQ UI options. + easing: 'swing', // [.42, 0, .58, 1], + + // Does it support keyboard arrows? + // Can pass either true or false - + // or an object with the keycodes, like so: + // { + // prev: 37, + // next: 39 + // } + // You can call any internal method name + // before the keycode and it'll be called. + keys: { + prev: 37, + next: 39 + }, + + // Do you want to generate clickable navigation + // to skip to each slide? Accepts boolean true/false or + // a callback function per item to generate. + nav: true, + + // Should there be left/right arrows to go back/forth? + // -> This isn't keyboard support. + // Either set true/false, or an object with the HTML + // elements for each arrow like below: + arrows: { + prev: '', + next: '' + }, + + // How should Unslider animate? + // It can do one of the following types: + // "fade": each slide fades in to each other + // "horizontal": each slide moves from left to right + // "vertical": each slide moves from top to bottom + animation: 'horizontal', + + // If you don't want to use a list to display your slides, + // you can change it here. Not recommended and you'll need + // to adjust the CSS accordingly. + selectors: { + container: 'ul:first', + slides: 'li' + }, + + // Do you want to animate the heights of each slide as + // it moves + animateHeight: false, + + // Active class for the nav + activeClass: self._ + '-active', + + // Have swipe support? + // You can set this here with a boolean and always use + // initSwipe/destroySwipe later on. + swipe: true + }; + + // Set defaults + self.$context = context; + self.options = {}; + + // Leave our elements blank for now + // Since they get changed by the options, we'll need to + // set them in the init method. + self.$parent = null; + self.$container = null; + self.$slides = null; + self.$nav = null; + self.$arrows = []; + + // Set our indexes and totals + self.total = 0; + self.current = 0; + + // Generate a specific random ID so we don't dupe events + self.prefix = self._ + '-'; + self.eventSuffix = '.' + self.prefix + ~~(Math.random() * 2e3); + + // In case we're going to use the autoplay + self.interval = null; + + // Get everything set up innit + self.init = function(options) { + // Set up our options inside here so we can re-init at + // any time + self.options = $.extend({}, self.defaults, options); + + // Our elements + self.$container = self.$context.find(self.options.selectors.container).addClass(self.prefix + 'wrap'); + self.$slides = self.$container.children(self.options.selectors.slides); + + // We'll manually init the container + self.setup(); + + // We want to keep this script as small as possible + // so we'll optimise some checks + $.each(['nav', 'arrows', 'keys', 'infinite'], function(index, module) { + self.options[module] && self['init' + $._ucfirst(module)](); + }); + + // Add swipe support + if(jQuery.event.special.swipe && self.options.swipe) { + self.initSwipe(); + } + + // If autoplay is set to true, call self.start() + // to start calling our timeouts + self.options.autoplay && self.start(); + + // We should be able to recalculate slides at will + self.calculateSlides(); + + // Listen to a ready event + self.$context.trigger(self._ + '.ready'); + + // Everyday I'm chainin' + return self.animate(self.options.index || self.current, 'init'); + }; + + self.setup = function() { + // Add a CSS hook to the main element + self.$context.addClass(self.prefix + self.options.animation).wrap('
    '); + self.$parent = self.$context.parent('.' + self._); + + // We need to manually check if the container is absolutely + // or relatively positioned + var position = self.$context.css('position'); + + // If we don't already have a position set, we'll + // automatically set it ourselves + if(position === 'static') { + self.$context.css('position', 'relative'); + } + + self.$context.css('overflow', 'hidden'); + }; + + // Set up the slide widths to animate with + // so the box doesn't float over + self.calculateSlides = function() { + self.total = self.$slides.length; + + // Set the total width + if(self.options.animation !== 'fade') { + var prop = 'width'; + + if(self.options.animation === 'vertical') { + prop = 'height'; + } + + self.$container.css(prop, (self.total * 100) + '%').addClass(self.prefix + 'carousel'); + self.$slides.css(prop, (100 / self.total) + '%'); + } + }; + + + // Start our autoplay + self.start = function() { + self.interval = setTimeout(function() { + // Move on to the next slide + self.next(); + + // If we've got autoplay set up + // we don't need to keep starting + // the slider from within our timeout + // as .animate() calls it for us + }, self.options.delay); + + return self; + }; + + // And pause our timeouts + // and force stop the slider if needed + self.stop = function() { + clearTimeout(self.interval); + + return self; + }; + + + // Set up our navigation + self.initNav = function() { + var $nav = $(''); + + // Build our click navigation item-by-item + self.$slides.each(function(key) { + // If we've already set a label, let's use that + // instead of generating one + var label = this.getAttribute('data-nav') || key + 1; + + // Listen to any callback functions + if($.isFunction(self.options.nav)) { + label = self.options.nav.call(self.$slides.eq(key), key, label); + } + + // And add it to our navigation item + $nav.children('ol').append('
  • ' + label + '
  • '); + }); + + // Keep a copy of the nav everywhere so we can use it + self.$nav = $nav.insertAfter(self.$context); + + // Now our nav is built, let's add it to the slider and bind + // for any click events on the generated links + self.$nav.find('li').on('click' + self.eventSuffix, function() { + // Cache our link and set it to be active + var $me = $(this).addClass(self.options.activeClass); + + // Set the right active class, remove any other ones + $me.siblings().removeClass(self.options.activeClass); + + // Move the slide + self.animate($me.attr('data-slide')); + }); + }; + + + // Set up our left-right arrow navigation + // (Not keyboard arrows, prev/next buttons) + self.initArrows = function() { + if(self.options.arrows === true) { + self.options.arrows = self.defaults.arrows; + } + + // Loop our options object and bind our events + $.each(self.options.arrows, function(key, val) { + // Add our arrow HTML and bind it + self.$arrows.push( + $(val).insertAfter(self.$context).on('click' + self.eventSuffix, self[key]) + ); + }); + }; + + + // Set up our keyboad navigation + // Allow binding to multiple keycodes + self.initKeys = function() { + if(self.options.keys === true) { + self.options.keys = self.defaults.keys; + } + + $(document).on('keyup' + self.eventSuffix, function(e) { + $.each(self.options.keys, function(key, val) { + if(e.which === val) { + $.isFunction(self[key]) && self[key].call(self); + } + }); + }); + }; + + // Requires jQuery.event.swipe + // -> stephband.info/jquery.event.swipe + self.initSwipe = function() { + var width = self.$slides.width(); + + self.$container.on({ + swipeleft: self.next, + swiperight: self.prev, + + movestart: function(e) { + // If the movestart heads off in a upwards or downwards + // direction, prevent it so that the browser scrolls normally. + if((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) { + return !!e.preventDefault(); + } + + self.$container.css('position', 'relative'); + } + }); + + // We don't want to have a tactile swipe in the slider + // in the fade animation, as it can cause some problems + // with layout, so we'll just disable it. + if(self.options.animation !== 'fade') { + self.$container.on({ + move: function(e) { + self.$container.css('left', -(100 * self.current) + (100 * e.distX / width) + '%'); + }, + + moveend: function(e) { + if((Math.abs(e.distX) / width) < $.event.special.swipe.settings.threshold) { + return self._move(self.$container, {left: -(100 * self.current) + '%'}, false, 200); + } + } + }); + } + }; + + // Infinite scrolling is a massive pain in the arse + // so we need to create a whole bloody function to set + // it up. Argh. + self.initInfinite = function() { + var pos = ['first', 'last']; + + $.each(pos, function(index, item) { + self.$slides.push.apply( + self.$slides, + + // Exclude all cloned slides and call .first() or .last() + // depending on what `item` is. + self.$slides.filter(':not(".' + self._ + '-clone")')[item]() + + // Make a copy of it and identify it as a clone + .clone().addClass(self._ + '-clone') + + // Either insert before or after depending on whether we're + // the first or last clone + ['insert' + (index === 0 ? 'After' : 'Before')]( + // Return the other element in the position array + // if item = first, return "last" + self.$slides[pos[~~!index]]() + ) + ); + }); + }; + + // Remove any trace of arrows + // Loop our array of arrows and use jQuery to remove + // It'll unbind any event handlers for us + self.destroyArrows = function() { + $.each(self.$arrows, function($arrow) { + $arrow.remove(); + }); + }; + + // Remove any swipe events and reset the position + self.destroySwipe = function() { + // We bind to 4 events, so we'll unbind those + self.$container.off('movestart move moveend'); + }; + + // Unset the keyboard navigation + // Remove the handler + self.destroyKeys = function() { + // Remove the event handler + $(document).off('keyup' + self.eventSuffix); + }; + + self.setIndex = function(to) { + if(to < 0) { + to = self.total - 1; + } + + self.current = Math.min(Math.max(0, to), self.total - 1); + + if(self.options.nav) { + self.$nav.find('[data-slide="' + self.current + '"]')._active(self.options.activeClass); + } + + self.$slides.eq(self.current)._active(self.options.activeClass); + + return self; + }; + + // Despite the name, this doesn't do any animation - since there's + // now three different types of animation, we let this method delegate + // to the right type, keeping the name for backwards compat. + self.animate = function(to, dir) { + // Animation shortcuts + // Instead of passing a number index, we can now + // use .data('unslider').animate('last'); + // or .unslider('animate:last') + // to go to the very last slide + if(to === 'first') to = 0; + if(to === 'last') to = self.total; + + // Don't animate if it's not a valid index + if(isNaN(to)) { + return self; + } + + if(self.options.autoplay) { + self.stop().start(); + } + + self.setIndex(to); + + // Add a callback method to do stuff with + self.$context.trigger(self._ + '.change', [to, self.$slides.eq(to)]); + + // Delegate the right method - everything's named consistently + // so we can assume it'll be called "animate" + + var fn = 'animate' + $._ucfirst(self.options.animation); + + // Make sure it's a valid animation method, otherwise we'll get + // a load of bug reports that'll be really hard to report + if($.isFunction(self[fn])) { + self[fn](self.current, dir); + } + + return self; + }; + + + // Shortcuts for animating if we don't know what the current + // index is (i.e back/forward) + // For moving forward we need to make sure we don't overshoot. + self.next = function() { + var target = self.current + 1; + + // If we're at the end, we need to move back to the start + if(target >= self.total) { + target = 0; + } + + return self.animate(target, 'next'); + }; + + // Previous is a bit simpler, we can just decrease the index + // by one and check if it's over 0. + self.prev = function() { + return self.animate(self.current - 1, 'prev'); + }; + + + // Our default animation method, the old-school left-to-right + // horizontal animation + self.animateHorizontal = function(to) { + var prop = 'left'; + + // Add RTL support, slide the slider + // the other way if the site is right-to-left + if(self.$context.attr('dir') === 'rtl') { + prop = 'right'; + } + + if(self.options.infinite) { + // So then we need to hide the first slide + self.$container.css('margin-' + prop, '-100%'); + } + + return self.slide(prop, to); + }; + + // The same animation methods, but vertical support + // RTL doesn't affect the vertical direction so we + // can just call as is + self.animateVertical = function(to) { + self.options.animateHeight = true; + + // Normal infinite CSS fix doesn't work for + // vertical animation so we need to manually set it + // with pixels. Ah well. + if(self.options.infinite) { + self.$container.css('margin-top', -self.$slides.outerHeight()); + } + + return self.slide('top', to); + }; + + // Actually move the slide now + // We have to pass a property to animate as there's + // a few different directions it can now move, but it's + // otherwise unchanged from before. + self.slide = function(prop, to) { + // If we want to change the height of the slider + // to match the current slide, you can set + // {animateHeight: true} + if(self.options.animateHeight) { + self._move(self.$context, {height: self.$slides.eq(to).outerHeight()}, false); + } + + // For infinite sliding we add a dummy slide at the end and start + // of each slider to give the appearance of being infinite + if(self.options.infinite) { + var dummy; + + // Going backwards to last slide + if(to === self.total - 1) { + // We're setting a dummy position and an actual one + // the dummy is what the index looks like + // (and what we'll silently update to afterwards), + // and the actual is what makes it not go backwards + dummy = self.total - 3; + to = -1; + } + + // Going forwards to first slide + if(to === self.total - 2) { + dummy = 0; + to = self.total - 2; + } + + // If it's a number we can safely set it + if(typeof dummy === 'number') { + self.setIndex(dummy); + + // Listen for when the slide's finished transitioning so + // we can silently move it into the right place and clear + // this whole mess up. + self.$context.on(self._ + '.moved', function() { + if(self.current === dummy) { + self.$container.css(prop, -(100 * dummy) + '%').off(self._ + '.moved'); + } + }); + } + } + + // We need to create an object to store our property in + // since we don't know what it'll be. + var obj = {}; + + // Manually create it here + obj[prop] = -(100 * to) + '%'; + + // And animate using our newly-created object + return self._move(self.$container, obj); + }; + + + // Fade between slides rather than, uh, sliding it + self.animateFade = function(to) { + var $active = self.$slides.eq(to).addClass(self.options.activeClass); + + // Toggle our classes + self._move($active.siblings().removeClass(self.options.activeClass), {opacity: 0}); + self._move($active, {opacity: 1}, false); + }; + + self._move = function($el, obj, callback, speed) { + if(callback !== false) { + callback = function() { + self.$context.trigger(self._ + '.moved'); + }; + } + + return $el._move(obj, speed || self.options.speed, self.options.easing, callback); + }; + + // Allow daisy-chaining of methods + return self.init(options); + }; + + // Internal (but global) jQuery methods + // They're both just helpful types of shorthand for + // anything that might take too long to write out or + // something that might be used more than once. + $.fn._active = function(className) { + return this.addClass(className).siblings().removeClass(className); + }; + + // The equivalent to PHP's ucfirst(). Take the first + // character of a string and make it uppercase. + // Simples. + $._ucfirst = function(str) { + // Take our variable, run a regex on the first letter + return (str + '').toLowerCase().replace(/^./, function(match) { + // And uppercase it. Simples. + return match.toUpperCase(); + }); + }; + + $.fn._move = function() { + this.stop(true, true); + return $.fn[$.fn.velocity ? 'velocity' : 'animate'].apply(this, arguments); + }; + + // And set up our jQuery plugin + $.fn.unslider = function(opts) { + return this.each(function() { + var $this = $(this); + + // Allow usage of .unslider('function_name') + // as well as using .data('unslider') to access the + // main Unslider object + if(typeof opts === 'string' && $this.data('unslider')) { + opts = opts.split(':'); + + var call = $this.data('unslider')[opts[0]]; + + // Do we have arguments to pass to the string-function? + if($.isFunction(call)) { + return call.apply($this, opts[1] ? opts[1].split(',') : null); + } + } + + return $this.data('unslider', new $.Unslider($this, opts)); + }); + }; + +})(window.jQuery); \ No newline at end of file diff --git a/src/util/slider/unslider.min.js b/src/util/slider/unslider.min.js new file mode 100644 index 0000000000000000000000000000000000000000..42987011c008720f055c4778b3071d4d34a632c3 --- /dev/null +++ b/src/util/slider/unslider.min.js @@ -0,0 +1 @@ +(function(e,t){if(!e)return t;var n=function(){this.el=t;this.items=t;this.sizes=[];this.max=[0,0];this.current=0;this.interval=t;this.opts={speed:500,delay:3e3,complete:t,keys:!t,dots:t,fluid:t};var n=this;this.init=function(t,n){this.el=t;this.ul=t.children("ul");this.max=[t.outerWidth(),t.outerHeight()];this.items=this.ul.children("li").each(this.calculate);this.opts=e.extend(this.opts,n);this.setup();return this};this.calculate=function(t){var r=e(this),i=r.outerWidth(),s=r.outerHeight();n.sizes[t]=[i,s];if(i>n.max[0])n.max[0]=i;if(s>n.max[1])n.max[1]=s};this.setup=function(){this.el.css({overflow:"hidden",width:n.max[0],height:this.items.first().outerHeight()});this.ul.css({width:this.items.length*100+"%",position:"relative"});this.items.css("width",100/this.items.length+"%");if(this.opts.delay!==t){this.start();this.el.hover(this.stop,this.start)}this.opts.keys&&e(document).keydown(this.keys);this.opts.dots&&this.dots();if(this.opts.fluid){var r=function(){n.el.css("width",Math.min(Math.round(n.el.outerWidth()/n.el.parent().outerWidth()*100),100)+"%")};r();e(window).resize(r)}if(this.opts.arrows){this.el.parent().append('

    ').find(".arrows span").click(function(){e.isFunction(n[this.className])&&n[this.className]()})}if(e.event.swipe){this.el.on("swipeleft",n.prev).on("swiperight",n.next)}};this.move=function(t,r){if(!this.items.eq(t).length)t=0;if(t<0)t=this.items.length-1;var i=this.items.eq(t);var s={height:i.outerHeight()};var o=r?5:this.opts.speed;if(!this.ul.is(":animated")){n.el.find(".dot:eq("+t+")").addClass("active").siblings().removeClass("active");this.el.animate(s,o)&&this.ul.animate(e.extend({left:"-"+t+"00%"},s),o,function(i){n.current=t;e.isFunction(n.opts.complete)&&!r&&n.opts.complete(n.el)})}};this.start=function(){n.interval=setInterval(function(){n.move(n.current+1)},n.opts.delay)};this.stop=function(){n.interval=clearInterval(n.interval);return n};this.keys=function(t){var r=t.which;var i={37:n.prev,39:n.next,27:n.stop};if(e.isFunction(i[r])){i[r]()}};this.next=function(){return n.stop().move(n.current+1)};this.prev=function(){return n.stop().move(n.current-1)};this.dots=function(){var t='
      ';e.each(this.items,function(e){t+='
    1. '+(e+1)+"
    2. "});t+="
    ";this.el.addClass("has-dots").append(t).find(".dot").click(function(){n.move(e(this).index())})}};e.fn.unslider=function(t){var r=this.length;return this.each(function(i){var s=e(this);var u=(new n).init(s,t);s.data("unslider"+(r>1?"-"+(i+1):""),u)})}})(window.jQuery,false) \ No newline at end of file diff --git a/src/util/util.js b/src/util/util.js new file mode 100644 index 0000000000000000000000000000000000000000..2c31f3f9081cef82b6e03955a5a3656fcf1dad80 --- /dev/null +++ b/src/util/util.js @@ -0,0 +1,93 @@ +/* +* @Author: root +* @Date: 2017-11-02 15:20:44 +* @Last Modified by: root +* @Last Modified time: 2017-11-26 19:28:04 +*/ +'use strict' +var Hogan = require('hogan.js'); +var conf = { + serverHost : '' +}; +var utils = { + request : function(param){ + var _this = this ; + $.ajax({ + type : param.method || 'get', + url : param.url || '', + dataType : param.type || 'json', + data : param.data || '', + success : function(res){ + //请求成功 + if(0 === res.status){ + typeof param.success === 'function' && param.success(res.data,res.msg); + } + //没有登陆状态,需要强制登陆 + else if (10===res.status) { + _this.doLogin(); + } + else if (1===res.status) { + typeof param.error === 'function' && param.error(res.msg); + } + }, + error : function(error){ + typeof param.error === 'function' && param.error(error.statusText); + } + }); + }, + //获取服务器地址 + getServerUrl : function(path){ + return conf.serverHost + path ; + }, + //获取url的参数 + // 获取url参数 + getUrlParam : function(name){ + var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); + var result = window.location.search.substr(1).match(reg); + return result ? decodeURIComponent(result[2]) : null; + }, + //渲染html模板 + renderHtml : function(htmlTemplate, data){ + var template = Hogan.compile(htmlTemplate); + var result = template.render(data); + + return result; + }, + //成功提示 + successTips : function(msg){ + alert(msg||'操作成功'); + }, + //错误提示 + errorTips : function(errMsg){ + alert(errMsg||'哪里不对了~'); + }, + //字段的验证,支持非空判断,支持是否为空、手机、邮箱 + validate : function(value,type){ + var value = $.trim(value); + //非空验证 + if ('require'===type) { + return !! value; + } + //手机验证 + if('phone'===type){ + return /^1\d{10}$/.test(value); + } + //邮箱格式验证 + + if('email'===type){ + + return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/.test(value); + } + + }, + //统一登陆处理 + doLogin : function(){ + window.location.href = './user-login.html?redirect='+encodeURIComponent(window.location.href); + }, + goHome : function(){ + window.location.href = './index.html'; + } + +}; + +module.exports = utils; \ No newline at end of file diff --git a/src/view/about.html b/src/view/about.html new file mode 100644 index 0000000000000000000000000000000000000000..b41bc86d3e9ed381e9a28c8190414cda79a3d390 --- /dev/null +++ b/src/view/about.html @@ -0,0 +1,30 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shopping平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    +
    +

    关于网站

    +
    + 欢迎访问shopping,这是一个个人学习的网站。 +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/cart.html b/src/view/cart.html new file mode 100644 index 0000000000000000000000000000000000000000..8c5e51284467fb3f06e1e126717e1a592117bce0 --- /dev/null +++ b/src/view/cart.html @@ -0,0 +1,25 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shopping平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/detail.html b/src/view/detail.html new file mode 100644 index 0000000000000000000000000000000000000000..8746cb3830eeceb84046c68e0f891850f1a5e599 --- /dev/null +++ b/src/view/detail.html @@ -0,0 +1,25 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shopping平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/index.html b/src/view/index.html new file mode 100644 index 0000000000000000000000000000000000000000..f3b226093e08e668b179d813fd6fa65f15d70590 --- /dev/null +++ b/src/view/index.html @@ -0,0 +1,250 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + + 轻松自在便利 - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav-simple.html') %> + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    + + +
    +
    + + + + + +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/layout/footer.html b/src/view/layout/footer.html new file mode 100644 index 0000000000000000000000000000000000000000..f020a1e57411677425751ab302f3a9fc460976bb --- /dev/null +++ b/src/view/layout/footer.html @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/src/view/layout/head-common.html b/src/view/layout/head-common.html new file mode 100644 index 0000000000000000000000000000000000000000..da36c0aae8daadd3b238ef019d3935b126bd46b2 --- /dev/null +++ b/src/view/layout/head-common.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + diff --git a/src/view/layout/header.html b/src/view/layout/header.html new file mode 100644 index 0000000000000000000000000000000000000000..6e7c4c66f06532006d6c7392acf38872cb725875 --- /dev/null +++ b/src/view/layout/header.html @@ -0,0 +1,9 @@ +
    +
    + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/src/view/layout/nav-side.html b/src/view/layout/nav-side.html new file mode 100644 index 0000000000000000000000000000000000000000..3c5fdc988565d1ac49c0ff8c3820d04b4041620b --- /dev/null +++ b/src/view/layout/nav-side.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/view/layout/nav-simple.html b/src/view/layout/nav-simple.html new file mode 100644 index 0000000000000000000000000000000000000000..136537443e86e189181aef8e13c69d1748d3c34e --- /dev/null +++ b/src/view/layout/nav-simple.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/src/view/layout/nav.html b/src/view/layout/nav.html new file mode 100644 index 0000000000000000000000000000000000000000..c1fad651c564702a4e703ee899e1689a73f27f1b --- /dev/null +++ b/src/view/layout/nav.html @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/src/view/list.html b/src/view/list.html new file mode 100644 index 0000000000000000000000000000000000000000..c2ea56ecde15407c6ee1c83d11078d574446462e --- /dev/null +++ b/src/view/list.html @@ -0,0 +1,39 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + > + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + + + + + +
    + + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/order-confirm.html b/src/view/order-confirm.html new file mode 100644 index 0000000000000000000000000000000000000000..92a6c5c10663d56df3029544a0fb908ef09f42b2 --- /dev/null +++ b/src/view/order-confirm.html @@ -0,0 +1,39 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    +
    + 收货地址 +
    + +
    +
    +
    + 商品详情 +
    + +
    +
    +
    + + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/order-detail.html b/src/view/order-detail.html new file mode 100644 index 0000000000000000000000000000000000000000..1c52c77425bf3976078acf45ed6adecbfc203c16 --- /dev/null +++ b/src/view/order-detail.html @@ -0,0 +1,30 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    + +
    + +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/order-list.html b/src/view/order-list.html new file mode 100644 index 0000000000000000000000000000000000000000..c638fafe47f1d043c8afda5faba62bb1a3ffc6ca --- /dev/null +++ b/src/view/order-list.html @@ -0,0 +1,38 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    +
    +
    <%= htmlWebpackPlugin.options.title%>
    +
    +
    + +
    + +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/payment.html b/src/view/payment.html new file mode 100644 index 0000000000000000000000000000000000000000..07b8fad7a3f9975cbaca7fcd67513fe48c42642b --- /dev/null +++ b/src/view/payment.html @@ -0,0 +1,24 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/result.html b/src/view/result.html new file mode 100644 index 0000000000000000000000000000000000000000..7dc31be6a999ad362e372e574d15a234b4b01ab8 --- /dev/null +++ b/src/view/result.html @@ -0,0 +1,49 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav-simple.html') %> +
    +
    +

    恭喜您,注册成功!

    + +
    +
    +

    恭喜您,重置密码成功!

    + +
    +
    +

    恭喜您,操作成功!

    + +
    +
    +

    您的商品已成功加入购物车!

    + +
    +
    +

    您的订单支付成功!

    + +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-center-update.html b/src/view/user-center-update.html new file mode 100644 index 0000000000000000000000000000000000000000..2ba3c44c28d6e0abd81d29d3ec395035b2b30812 --- /dev/null +++ b/src/view/user-center-update.html @@ -0,0 +1,33 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + > + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    +
    +
    个人中心
    +
    +
    +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-center.html b/src/view/user-center.html new file mode 100644 index 0000000000000000000000000000000000000000..3ab405ded1e1067e33f5aa94f665d3a30fe8c287 --- /dev/null +++ b/src/view/user-center.html @@ -0,0 +1,34 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + > + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    + +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    +
    +
    个人中心
    +
    +
    +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-login.html b/src/view/user-login.html new file mode 100644 index 0000000000000000000000000000000000000000..53f788d5a2ea0d1dfcbac8e8e84c605a7b973f86 --- /dev/null +++ b/src/view/user-login.html @@ -0,0 +1,43 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav-simple.html') %> +
    +
    +
    +
    用户登录
    +
    +
    + +

    Error

    +
    +
    + + + +
    +
    + + +
    + 登录 + +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-pass-reset.html b/src/view/user-pass-reset.html new file mode 100644 index 0000000000000000000000000000000000000000..251caac09f70cb0b6efedf6f53d424756a0301b7 --- /dev/null +++ b/src/view/user-pass-reset.html @@ -0,0 +1,58 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav-simple.html') %> +
    +
    +
    +
    找回密码
    +
    +
    + +

    Error

    +
    +
    +

    请输入用户名:

    +
    + + +
    + 下一步 +
    +
    +

    请输入密码提示问题是:

    +
    + + +
    + 下一步 +
    +
    +

    请输入新密码:

    +
    + + +
    + 下一步 +
    + +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-pass-update.html b/src/view/user-pass-update.html new file mode 100644 index 0000000000000000000000000000000000000000..84fccd8ed142d001b1635b37f1f4c62a020ab36f --- /dev/null +++ b/src/view/user-pass-update.html @@ -0,0 +1,46 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav.html') %> + <%= require('html-loader!./layout/header.html') %> +
    +
    +
    + Shoping + > + <%= htmlWebpackPlugin.options.title%> +
    +
    +
    + +
    + <%= require('html-loader!./layout/nav-side.html') %> +
    +
    +
    修改密码
    +
    + +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/src/view/user-register.html b/src/view/user-register.html new file mode 100644 index 0000000000000000000000000000000000000000..708ea7e873724c82c22528dfb445d4094e913b3b --- /dev/null +++ b/src/view/user-register.html @@ -0,0 +1,73 @@ + + + +<%= require('html-loader!./layout/head-common.html') %> + <%= htmlWebpackPlugin.options.title%> - Shoping Go电商平台 + + + + <%= require('html-loader!./layout/nav-simple.html') %> +
    +
    +
    +
    用户注册
    +
    +
    + +

    Error

    +
    +
    + + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + 立即注册 + +
    +
    +
    +
    + <%= require('html-loader!./layout/footer.html') %> + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000000000000000000000000000000000000..6fee6c75bfa00078bb83aa11dd03dc54e22ccbad --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,110 @@ +var ExtractTextPlugin = require("extract-text-webpack-plugin"); +var webpack = require('webpack'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); + +//环境遍历配置,dev / online 容错处理 +var WEBPACK_ENV = process.env.WEBPACK_ENV || 'dev'; +console.log(WEBPACK_ENV); + + +//获取html-webpack-plugin参数的方法 +var getHtmlConfig = function(name,title){ + + return { + template :'./src/view/' + name + '.html', + favicon : './favicons.ico', + filename : 'view/' + name + '.html', + title : title, + inject : true, + hash : true, + chunks : ['common',name] + }; +} +//webpack config +var config = { + entry: { + 'common' : ['./src/page/common/index.js'], + 'index' : ['./src/page/index/index.js' ], + 'list' : ['./src/page/list/index.js' ], + 'about' : ['./src/page/about/index.js' ], + 'cart' : ['./src/page/cart/index.js' ], + 'order-confirm' : ['./src/page/order-confirm/index.js' ], + 'order-list' : ['./src/page/order-list/index.js' ], + 'order-detail' : ['./src/page/order-detail/index.js' ], + 'detail' : ['./src/page/detail/index.js' ], + 'payment' : ['./src/page/payment/index.js' ], + 'user-login' : ['./src/page/user-login/index.js' ], + 'result' : ['./src/page/result/index.js'], + 'user-register' : ['./src/page/user-register/index.js'], + 'user-center' : ['./src/page/user-center/index.js'], + 'user-center-update' : ['./src/page/user-center-update/index.js'], + 'user-pass-reset' : ['./src/page/user-pass-reset/index.js' ], + 'user-pass-update' : ['./src/page/user-pass-update/index.js' ], + }, + output:{ + path : __dirname+'/dist/', + publicPath:'dev'===WEBPACK_ENV ?' /dist/' : '//s.shopping.com/Shopping-fe/dist/', + filename: 'js/[name].js' + }, + externals:{ + 'jquery':'window.jquery' + }, + module: { + loaders: [ + { test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader","css-loader")}, + { test: /\.(gif|png|jpg|woff|svg|eot|ttf)\??.*$/, loader: 'url-loader?limit=100&name=resource/[name].[ext]' }, + { + test: /\.string$/, + loader: 'html-loader', + query:{ + minimize : true , + removeAttributeQuotes : false + } + } + ] + }, + resolve : { + alias : { + node_modules : __dirname + '/node_modules', + image : __dirname + '/src/image', + page : __dirname + '/src/page', + service : __dirname + '/src/service', + util : __dirname + '/src/util', + view : __dirname + '/src/view' + } + }, + plugins: [ + //独立通用模块到js/base.js + new webpack.optimize.CommonsChunkPlugin({ + name : 'common', + filename : 'js/base.js' + }), + //把css单独打包到文件里 + new ExtractTextPlugin("css/[name].css"), + //html模板的处理 + new HtmlWebpackPlugin(getHtmlConfig('index','首页')), + new HtmlWebpackPlugin(getHtmlConfig('user-login','用户登录')), + new HtmlWebpackPlugin(getHtmlConfig('result','操作结果')), + new HtmlWebpackPlugin(getHtmlConfig('detail','商品详情页')), + new HtmlWebpackPlugin(getHtmlConfig('cart','>购物车')), + new HtmlWebpackPlugin(getHtmlConfig('list','商品列表页')), + new HtmlWebpackPlugin(getHtmlConfig('user-pass-reset','找回密码')), + new HtmlWebpackPlugin(getHtmlConfig('user-center','个人中心')), + new HtmlWebpackPlugin(getHtmlConfig('about','关于网站')), + new HtmlWebpackPlugin(getHtmlConfig('user-pass-update','修改个人密码')), + new HtmlWebpackPlugin(getHtmlConfig('user-center-update','修改个人信息')), + new HtmlWebpackPlugin(getHtmlConfig('order-confirm','订单确认')), + new HtmlWebpackPlugin(getHtmlConfig('payment','订单订单支付')), + new HtmlWebpackPlugin(getHtmlConfig('order-list','订单列表')), + new HtmlWebpackPlugin(getHtmlConfig('order-detail','订单详情页面')), + new HtmlWebpackPlugin(getHtmlConfig('user-register','用户注册')) + + ] + +}; + + +if('dev' === WEBPACK_ENV){ + config.entry.common.push('webpack-dev-server/client?http://localhost:8088'); +} +module.exports = config; \ No newline at end of file