├── .eslintrc.js ├── .gitignore ├── .jshintrc ├── API接口.md ├── README.md ├── mobile.rar ├── package-lock.json ├── package.json ├── src ├── config.js ├── index.js ├── models │ ├── Cover.js │ ├── Goods.js │ ├── GoodsComment.js │ ├── News.js │ ├── NewsComment.js │ ├── Photo.js │ └── PhotoComment.js ├── router.js └── util │ └── db.js ├── 总体设计.md └── 数据字典.md /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true 6 | }, 7 | "extends": "eslint:recommended", 8 | // "extends": "airbnb", 9 | "globals": { 10 | "Atomics": "readonly", 11 | "SharedArrayBuffer": "readonly" 12 | }, 13 | "parserOptions": { 14 | "ecmaVersion": 2018 15 | }, 16 | "rules": { 17 | semi: ["warn", "always"] 18 | } 19 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6, 3 | "asi": true 4 | } -------------------------------------------------------------------------------- /API接口.md: -------------------------------------------------------------------------------- 1 | # 端口详细请看 src/config.js,默认是3000 2 | 3 | > ## CUD (添加、更新、删除)统一返回的数据:status 为-1 是查询失败, status 1 是查询成功 4 | 5 | ## 封面图片 6 | 7 | ### 查询封面,[http://localhost:3000/api/getcover](null) 8 | 9 | ````javascript 10 | { 11 | status: 1, 12 | imgs: ['https://pic.baidu.com/a.png'] 13 | } 14 | ```` 15 | 16 | ## 新闻 17 | 18 | ### 查询新闻,pageIdx 表示页码 [http://localhost:3000/api/getnews?pageIdx=1](null) 19 | 20 | ```javascript 21 | { 22 | status: 1, 23 | news: [ 24 | { 25 | add_time: '2019-04-27112019-04-27T12:53:13.489Z', 26 | clicked: 2, 27 | img_url: 'http://img1.baidu/a.png', 28 | title: '普通的标题',summary: '新闻的摘要', 29 | summary: '概要', 30 | add_time: '2019-04-27112019-04-27T12:53:13.489Z' 31 | } 32 | ] 33 | } 34 | ```` 35 | 36 | ### 按照新闻 id 查询新闻详细 [http://localhost:3000/api/getnewsdetail?newsId=1](null) 37 | 38 | ````javascript 39 | { 40 | status: 1, 41 | news: { 42 | add_time: 2019-05-04T07:25:01.409Z, 43 | clicked: 0,_id: 5ccd3e4d2b822c0b0cf7b3e7, 44 | id: 1, 45 | img_url:'http://img3.imgtn.bdimg.com/it/u=3213710805,2599468180&fm=26&gp=0.jpg', 46 | title: '我熊猫头不服', 47 | summary: '这是一个熊猫头的摘要', 48 | content: '

熊猫头的标题

', 49 | } 50 | } 51 | ```` 52 | 53 | ## 新闻评论 54 | 55 | ### 获取评论[http://localhost:3000/api/getnewscom?newsId=1&pageIdx=1](null) 56 | 57 | ````javascript 58 | { 59 | comments: [ 60 | {comId: 1, username: 'username', comDate: , content: } 61 | ] 62 | } 63 | ```` 64 | 65 | ### `post` 方法发送新闻评论 [http://localhost:3000/api/addnewscom?newsId=number](null) 66 | 67 | ````javascript 68 | { 69 | username: 'username', 70 | content: '这个是我的内容' 71 | } 72 | ```` 73 | 74 | ## 图片 photo 75 | 76 | ### 获取图片分类 [http://localhost:3000/api/getphotypes](null) 77 | 78 | ````javascript 79 | { 80 | status: 1 81 | types: ['清纯美女', '动漫'] 82 | } 83 | ```` 84 | 85 | ### 分页获取对应分类的所有图片信息 [http://localhost:3000/api/getpho?pageIdx=0&type=类型](null),`如果没有添加分类信息则是查询所有` 86 | 87 | ````javascript 88 | { 89 | status: 1, 90 | phos: [{ 91 | phoId: 1, 92 | type: '类型', 93 | phos: ['图片1', '图片2'] 94 | }] 95 | } 96 | ```` 97 | 98 | ### 根据图片的id查询图片的详细 [http://localhost:3000/api/getphodetail?phoId=1](null) 99 | 100 | ````javascript 101 | { 102 | phoId: 1, 103 | type: '类型', 104 | } 105 | ```` 106 | 107 | ### 根据图片的id查询图片的所有评论 [http://localhost:3000/api/getphocom?phoId=1](null) 108 | 109 | ````javascript 110 | { 111 | comId: 0, 112 | username: '匿名', 113 | comDate: '2019-05-08T02:56:03.187+00:00', 114 | content: '沙发' 115 | } 116 | ```` 117 | 118 | ## 商品 Goods 119 | 120 | ### 分页获取所有的商品信息 [http://localhost:3000/api/getgod?pageIdx=1](null) 121 | 122 | ````javascript 123 | { 124 | status: 1, 125 | gods: [ 126 | { 127 | godId: 0, 128 | oldPrice: 999, 129 | newPrice: 699, 130 | addDate: '2019-05-10T07:54:29.984Z', 131 | intro: '商品的文字介绍', 132 | phos: ['商品图片一', '商品图片二'], 133 | imgIntro: ['图文介绍一', '图片介绍2], 134 | name: '商品名称', 135 | quantity: 30, 136 | godNumber: '201801160604531', 137 | } 138 | ] 139 | } 140 | ```` 141 | 142 | ### 获取商品详细 [http://localhost:3000/api/getgoddetail?godId=1](null) 143 | 144 | ````javascript 145 | { 146 | status: 1, 147 | god: { 148 | godId: 0, 149 | oldPrice: 999, 150 | newPrice: 699, 151 | addDate: '2019-05-10T07:54:29.984Z', 152 | intro: '商品的文字介绍', 153 | phos: ['商品图片一', '商品图片二'], 154 | imgIntro: ['图文介绍一', '图片介绍2], 155 | name: '商品名称', 156 | quantity: 30, 157 | godNumber: '201801160604531', 158 | } 159 | } 160 | 161 | ```` 162 | 163 | ### 分页获取商品的评论 [http://localhost:3000/api/getgodcom?godId=1&pageIdx=1](null) 164 | 165 | ````javascript 166 | { 167 | status: 1, 168 | comments: [{ 169 | comId: 0, 170 | username: '用户名', 171 | content: '评论的内容' 172 | }] 173 | } 174 | ```` 175 | 176 | ### `post`方式发送商品评论[http://localhost:3000/api/addgodcom?godId=1](null) 177 | 178 | ````javascript 179 | { 180 | username: 'username', 181 | content: '评论内容' 182 | } 183 | ```` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 这是一个配合VUE移动端网页学习项目 [vue-mobbile](https://github.com/arm-liang/vue-mobbile-learning) 使用的 nodejs 服务器 2 | 3 | > 项目使用 nodejs + express + mongodb + mongoose 来实现网页JSON服务器,服务器默认运行在本地3000端口 4 | > 测试服务器 [http://120.77.181.41:3000](),由于Nodejs单线程的缘故,服务器可能会崩。所以如果崩了,请自己动手去搭建。 5 | > 服务器的数据在下面的压缩包里面,请使用 mongorestore -h <:port> -d dbname ,来初始化服务器数据 6 | > 比如 mongorestore -h localhost:27017 -d mobile ./mobile 7 | 8 | ## 自行搭建服务 9 | 10 | 1. 自行搭建服务请下载MongoDB数据库[https://www.mongodb.com/](https://www.mongodb.com/),下载正常安装之后设置通过这个命令设置MongoDB数据库文件存储位置 11 | `mongod --dbpath "d:\mongodb-path"`,路径随意 12 | 2. 去nodejs官网下载新版的nodejs[http://nodejs.cn/](http://nodejs.cn/) 13 | 3. 下载整个项目,通过命令行进入项目目录 14 | 4. npm start 或者 node index.js启动项目 15 | 5. 数据库连接的配置在 src/config.js中保存,默认访问本地的localhost:27017 16 | 17 | ## [总体设计](总体设计.md) 18 | 19 | > 该文件定义了本服务器的总体设计,包括服务器实现的几大模块,模块内部的功能 20 | 21 | ## [数据字典](数据字典.md) 22 | 23 | > 该文件定义了数据库表格的设计,使用 Mongoose Schema 格式定义 24 | > 在实现字段自增的时候通过 pre post 中间件来实现(后期可以通过自建一个保存所有自增字段的数据的表) 25 | 26 | ## [API接口](API接口.md) 27 | 28 | > 该文件定义了前台浏览器和服务器沟通的采用何种标准 29 | 30 | >### 本项目仅供学习和参考,请勿用于任何商业用途,任何图片和资源均来自网络,转载请注明出处,如果喜欢请不要忘了 `Star` :star: and `Fork` :fork_and_knife: me 31 | -------------------------------------------------------------------------------- /mobile.rar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arm-liang/vue-mobbile-server/e68ba13a2171cb24c5532c28b782155e42dd5369/mobile.rar -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-mobbile-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "accepts": { 28 | "version": "1.3.5", 29 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 30 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 31 | "requires": { 32 | "mime-types": "~2.1.18", 33 | "negotiator": "0.6.1" 34 | } 35 | }, 36 | "acorn": { 37 | "version": "6.1.1", 38 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", 39 | "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", 40 | "dev": true 41 | }, 42 | "acorn-jsx": { 43 | "version": "5.0.1", 44 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", 45 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", 46 | "dev": true 47 | }, 48 | "ajv": { 49 | "version": "6.10.0", 50 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 51 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 52 | "dev": true, 53 | "requires": { 54 | "fast-deep-equal": "^2.0.1", 55 | "fast-json-stable-stringify": "^2.0.0", 56 | "json-schema-traverse": "^0.4.1", 57 | "uri-js": "^4.2.2" 58 | } 59 | }, 60 | "ansi-escapes": { 61 | "version": "3.2.0", 62 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 63 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 64 | "dev": true 65 | }, 66 | "ansi-regex": { 67 | "version": "3.0.0", 68 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 69 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 70 | "dev": true 71 | }, 72 | "ansi-styles": { 73 | "version": "3.2.1", 74 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 75 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 76 | "dev": true, 77 | "requires": { 78 | "color-convert": "^1.9.0" 79 | } 80 | }, 81 | "argparse": { 82 | "version": "1.0.10", 83 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 84 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 85 | "dev": true, 86 | "requires": { 87 | "sprintf-js": "~1.0.2" 88 | } 89 | }, 90 | "array-flatten": { 91 | "version": "1.1.1", 92 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 93 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 94 | }, 95 | "astral-regex": { 96 | "version": "1.0.0", 97 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 98 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 99 | "dev": true 100 | }, 101 | "async": { 102 | "version": "2.6.1", 103 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 104 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 105 | "requires": { 106 | "lodash": "^4.17.10" 107 | } 108 | }, 109 | "balanced-match": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 112 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 113 | "dev": true 114 | }, 115 | "bluebird": { 116 | "version": "3.5.1", 117 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 118 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 119 | }, 120 | "body-parser": { 121 | "version": "1.19.0", 122 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 123 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 124 | "requires": { 125 | "bytes": "3.1.0", 126 | "content-type": "~1.0.4", 127 | "debug": "2.6.9", 128 | "depd": "~1.1.2", 129 | "http-errors": "1.7.2", 130 | "iconv-lite": "0.4.24", 131 | "on-finished": "~2.3.0", 132 | "qs": "6.7.0", 133 | "raw-body": "2.4.0", 134 | "type-is": "~1.6.17" 135 | }, 136 | "dependencies": { 137 | "http-errors": { 138 | "version": "1.7.2", 139 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 140 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 141 | "requires": { 142 | "depd": "~1.1.2", 143 | "inherits": "2.0.3", 144 | "setprototypeof": "1.1.1", 145 | "statuses": ">= 1.5.0 < 2", 146 | "toidentifier": "1.0.0" 147 | } 148 | }, 149 | "qs": { 150 | "version": "6.7.0", 151 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 152 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 153 | }, 154 | "setprototypeof": { 155 | "version": "1.1.1", 156 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 157 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 158 | }, 159 | "statuses": { 160 | "version": "1.5.0", 161 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 162 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 163 | } 164 | } 165 | }, 166 | "brace-expansion": { 167 | "version": "1.1.11", 168 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 169 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 170 | "dev": true, 171 | "requires": { 172 | "balanced-match": "^1.0.0", 173 | "concat-map": "0.0.1" 174 | } 175 | }, 176 | "bson": { 177 | "version": "1.1.1", 178 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", 179 | "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" 180 | }, 181 | "bytes": { 182 | "version": "3.1.0", 183 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 184 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 185 | }, 186 | "callsites": { 187 | "version": "3.1.0", 188 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 189 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 190 | "dev": true 191 | }, 192 | "chalk": { 193 | "version": "2.4.2", 194 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 195 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 196 | "dev": true, 197 | "requires": { 198 | "ansi-styles": "^3.2.1", 199 | "escape-string-regexp": "^1.0.5", 200 | "supports-color": "^5.3.0" 201 | } 202 | }, 203 | "chardet": { 204 | "version": "0.7.0", 205 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 206 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 207 | "dev": true 208 | }, 209 | "cli-cursor": { 210 | "version": "2.1.0", 211 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 212 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 213 | "dev": true, 214 | "requires": { 215 | "restore-cursor": "^2.0.0" 216 | } 217 | }, 218 | "cli-width": { 219 | "version": "2.2.0", 220 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 221 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 222 | "dev": true 223 | }, 224 | "color-convert": { 225 | "version": "1.9.3", 226 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 227 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 228 | "dev": true, 229 | "requires": { 230 | "color-name": "1.1.3" 231 | } 232 | }, 233 | "color-name": { 234 | "version": "1.1.3", 235 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 236 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 237 | "dev": true 238 | }, 239 | "commander": { 240 | "version": "2.20.0", 241 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 242 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" 243 | }, 244 | "concat-map": { 245 | "version": "0.0.1", 246 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 247 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 248 | "dev": true 249 | }, 250 | "content-disposition": { 251 | "version": "0.5.2", 252 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 253 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 254 | }, 255 | "content-type": { 256 | "version": "1.0.4", 257 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 258 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 259 | }, 260 | "cookie": { 261 | "version": "0.3.1", 262 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 263 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 264 | }, 265 | "cookie-signature": { 266 | "version": "1.0.6", 267 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 268 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 269 | }, 270 | "cross-spawn": { 271 | "version": "6.0.5", 272 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 273 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 274 | "dev": true, 275 | "requires": { 276 | "nice-try": "^1.0.4", 277 | "path-key": "^2.0.1", 278 | "semver": "^5.5.0", 279 | "shebang-command": "^1.2.0", 280 | "which": "^1.2.9" 281 | } 282 | }, 283 | "cssfilter": { 284 | "version": "0.0.10", 285 | "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", 286 | "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" 287 | }, 288 | "debug": { 289 | "version": "2.6.9", 290 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 291 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 292 | "requires": { 293 | "ms": "2.0.0" 294 | } 295 | }, 296 | "deep-is": { 297 | "version": "0.1.3", 298 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 299 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 300 | "dev": true 301 | }, 302 | "depd": { 303 | "version": "1.1.2", 304 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 305 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 306 | }, 307 | "destroy": { 308 | "version": "1.0.4", 309 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 310 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 311 | }, 312 | "doctrine": { 313 | "version": "3.0.0", 314 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 315 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 316 | "dev": true, 317 | "requires": { 318 | "esutils": "^2.0.2" 319 | } 320 | }, 321 | "ee-first": { 322 | "version": "1.1.1", 323 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 324 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 325 | }, 326 | "emoji-regex": { 327 | "version": "7.0.3", 328 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 329 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 330 | "dev": true 331 | }, 332 | "encodeurl": { 333 | "version": "1.0.2", 334 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 335 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 336 | }, 337 | "escape-html": { 338 | "version": "1.0.3", 339 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 340 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 341 | }, 342 | "escape-string-regexp": { 343 | "version": "1.0.5", 344 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 345 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 346 | "dev": true 347 | }, 348 | "eslint": { 349 | "version": "5.16.0", 350 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 351 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 352 | "dev": true, 353 | "requires": { 354 | "@babel/code-frame": "^7.0.0", 355 | "ajv": "^6.9.1", 356 | "chalk": "^2.1.0", 357 | "cross-spawn": "^6.0.5", 358 | "debug": "^4.0.1", 359 | "doctrine": "^3.0.0", 360 | "eslint-scope": "^4.0.3", 361 | "eslint-utils": "^1.3.1", 362 | "eslint-visitor-keys": "^1.0.0", 363 | "espree": "^5.0.1", 364 | "esquery": "^1.0.1", 365 | "esutils": "^2.0.2", 366 | "file-entry-cache": "^5.0.1", 367 | "functional-red-black-tree": "^1.0.1", 368 | "glob": "^7.1.2", 369 | "globals": "^11.7.0", 370 | "ignore": "^4.0.6", 371 | "import-fresh": "^3.0.0", 372 | "imurmurhash": "^0.1.4", 373 | "inquirer": "^6.2.2", 374 | "js-yaml": "^3.13.0", 375 | "json-stable-stringify-without-jsonify": "^1.0.1", 376 | "levn": "^0.3.0", 377 | "lodash": "^4.17.11", 378 | "minimatch": "^3.0.4", 379 | "mkdirp": "^0.5.1", 380 | "natural-compare": "^1.4.0", 381 | "optionator": "^0.8.2", 382 | "path-is-inside": "^1.0.2", 383 | "progress": "^2.0.0", 384 | "regexpp": "^2.0.1", 385 | "semver": "^5.5.1", 386 | "strip-ansi": "^4.0.0", 387 | "strip-json-comments": "^2.0.1", 388 | "table": "^5.2.3", 389 | "text-table": "^0.2.0" 390 | }, 391 | "dependencies": { 392 | "debug": { 393 | "version": "4.1.1", 394 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 395 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 396 | "dev": true, 397 | "requires": { 398 | "ms": "^2.1.1" 399 | } 400 | }, 401 | "ms": { 402 | "version": "2.1.1", 403 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 404 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 405 | "dev": true 406 | } 407 | } 408 | }, 409 | "eslint-scope": { 410 | "version": "4.0.3", 411 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 412 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 413 | "dev": true, 414 | "requires": { 415 | "esrecurse": "^4.1.0", 416 | "estraverse": "^4.1.1" 417 | } 418 | }, 419 | "eslint-utils": { 420 | "version": "1.3.1", 421 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", 422 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", 423 | "dev": true 424 | }, 425 | "eslint-visitor-keys": { 426 | "version": "1.0.0", 427 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 428 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 429 | "dev": true 430 | }, 431 | "espree": { 432 | "version": "5.0.1", 433 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 434 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 435 | "dev": true, 436 | "requires": { 437 | "acorn": "^6.0.7", 438 | "acorn-jsx": "^5.0.0", 439 | "eslint-visitor-keys": "^1.0.0" 440 | } 441 | }, 442 | "esprima": { 443 | "version": "4.0.1", 444 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 445 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 446 | "dev": true 447 | }, 448 | "esquery": { 449 | "version": "1.0.1", 450 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 451 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 452 | "dev": true, 453 | "requires": { 454 | "estraverse": "^4.0.0" 455 | } 456 | }, 457 | "esrecurse": { 458 | "version": "4.2.1", 459 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 460 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 461 | "dev": true, 462 | "requires": { 463 | "estraverse": "^4.1.0" 464 | } 465 | }, 466 | "estraverse": { 467 | "version": "4.2.0", 468 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 469 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 470 | "dev": true 471 | }, 472 | "esutils": { 473 | "version": "2.0.2", 474 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 475 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 476 | "dev": true 477 | }, 478 | "etag": { 479 | "version": "1.8.1", 480 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 481 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 482 | }, 483 | "express": { 484 | "version": "4.16.4", 485 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 486 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 487 | "requires": { 488 | "accepts": "~1.3.5", 489 | "array-flatten": "1.1.1", 490 | "body-parser": "1.18.3", 491 | "content-disposition": "0.5.2", 492 | "content-type": "~1.0.4", 493 | "cookie": "0.3.1", 494 | "cookie-signature": "1.0.6", 495 | "debug": "2.6.9", 496 | "depd": "~1.1.2", 497 | "encodeurl": "~1.0.2", 498 | "escape-html": "~1.0.3", 499 | "etag": "~1.8.1", 500 | "finalhandler": "1.1.1", 501 | "fresh": "0.5.2", 502 | "merge-descriptors": "1.0.1", 503 | "methods": "~1.1.2", 504 | "on-finished": "~2.3.0", 505 | "parseurl": "~1.3.2", 506 | "path-to-regexp": "0.1.7", 507 | "proxy-addr": "~2.0.4", 508 | "qs": "6.5.2", 509 | "range-parser": "~1.2.0", 510 | "safe-buffer": "5.1.2", 511 | "send": "0.16.2", 512 | "serve-static": "1.13.2", 513 | "setprototypeof": "1.1.0", 514 | "statuses": "~1.4.0", 515 | "type-is": "~1.6.16", 516 | "utils-merge": "1.0.1", 517 | "vary": "~1.1.2" 518 | }, 519 | "dependencies": { 520 | "body-parser": { 521 | "version": "1.18.3", 522 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 523 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 524 | "requires": { 525 | "bytes": "3.0.0", 526 | "content-type": "~1.0.4", 527 | "debug": "2.6.9", 528 | "depd": "~1.1.2", 529 | "http-errors": "~1.6.3", 530 | "iconv-lite": "0.4.23", 531 | "on-finished": "~2.3.0", 532 | "qs": "6.5.2", 533 | "raw-body": "2.3.3", 534 | "type-is": "~1.6.16" 535 | } 536 | }, 537 | "bytes": { 538 | "version": "3.0.0", 539 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 540 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 541 | }, 542 | "iconv-lite": { 543 | "version": "0.4.23", 544 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 545 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 546 | "requires": { 547 | "safer-buffer": ">= 2.1.2 < 3" 548 | } 549 | }, 550 | "raw-body": { 551 | "version": "2.3.3", 552 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 553 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 554 | "requires": { 555 | "bytes": "3.0.0", 556 | "http-errors": "1.6.3", 557 | "iconv-lite": "0.4.23", 558 | "unpipe": "1.0.0" 559 | } 560 | } 561 | } 562 | }, 563 | "external-editor": { 564 | "version": "3.0.3", 565 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 566 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 567 | "dev": true, 568 | "requires": { 569 | "chardet": "^0.7.0", 570 | "iconv-lite": "^0.4.24", 571 | "tmp": "^0.0.33" 572 | }, 573 | "dependencies": { 574 | "iconv-lite": { 575 | "version": "0.4.24", 576 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 577 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 578 | "dev": true, 579 | "requires": { 580 | "safer-buffer": ">= 2.1.2 < 3" 581 | } 582 | } 583 | } 584 | }, 585 | "fast-deep-equal": { 586 | "version": "2.0.1", 587 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 588 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 589 | "dev": true 590 | }, 591 | "fast-json-stable-stringify": { 592 | "version": "2.0.0", 593 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 594 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 595 | "dev": true 596 | }, 597 | "fast-levenshtein": { 598 | "version": "2.0.6", 599 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 600 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 601 | "dev": true 602 | }, 603 | "figures": { 604 | "version": "2.0.0", 605 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 606 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 607 | "dev": true, 608 | "requires": { 609 | "escape-string-regexp": "^1.0.5" 610 | } 611 | }, 612 | "file-entry-cache": { 613 | "version": "5.0.1", 614 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 615 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 616 | "dev": true, 617 | "requires": { 618 | "flat-cache": "^2.0.1" 619 | } 620 | }, 621 | "finalhandler": { 622 | "version": "1.1.1", 623 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 624 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 625 | "requires": { 626 | "debug": "2.6.9", 627 | "encodeurl": "~1.0.2", 628 | "escape-html": "~1.0.3", 629 | "on-finished": "~2.3.0", 630 | "parseurl": "~1.3.2", 631 | "statuses": "~1.4.0", 632 | "unpipe": "~1.0.0" 633 | } 634 | }, 635 | "flat-cache": { 636 | "version": "2.0.1", 637 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 638 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 639 | "dev": true, 640 | "requires": { 641 | "flatted": "^2.0.0", 642 | "rimraf": "2.6.3", 643 | "write": "1.0.3" 644 | } 645 | }, 646 | "flatted": { 647 | "version": "2.0.0", 648 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", 649 | "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", 650 | "dev": true 651 | }, 652 | "forwarded": { 653 | "version": "0.1.2", 654 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 655 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 656 | }, 657 | "fresh": { 658 | "version": "0.5.2", 659 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 660 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 661 | }, 662 | "fs.realpath": { 663 | "version": "1.0.0", 664 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 665 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 666 | "dev": true 667 | }, 668 | "functional-red-black-tree": { 669 | "version": "1.0.1", 670 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 671 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 672 | "dev": true 673 | }, 674 | "glob": { 675 | "version": "7.1.3", 676 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 677 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 678 | "dev": true, 679 | "requires": { 680 | "fs.realpath": "^1.0.0", 681 | "inflight": "^1.0.4", 682 | "inherits": "2", 683 | "minimatch": "^3.0.4", 684 | "once": "^1.3.0", 685 | "path-is-absolute": "^1.0.0" 686 | } 687 | }, 688 | "globals": { 689 | "version": "11.11.0", 690 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", 691 | "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", 692 | "dev": true 693 | }, 694 | "has-flag": { 695 | "version": "3.0.0", 696 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 697 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 698 | "dev": true 699 | }, 700 | "http-errors": { 701 | "version": "1.6.3", 702 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 703 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 704 | "requires": { 705 | "depd": "~1.1.2", 706 | "inherits": "2.0.3", 707 | "setprototypeof": "1.1.0", 708 | "statuses": ">= 1.4.0 < 2" 709 | } 710 | }, 711 | "iconv-lite": { 712 | "version": "0.4.24", 713 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 714 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 715 | "requires": { 716 | "safer-buffer": ">= 2.1.2 < 3" 717 | } 718 | }, 719 | "ignore": { 720 | "version": "4.0.6", 721 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 722 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 723 | "dev": true 724 | }, 725 | "import-fresh": { 726 | "version": "3.0.0", 727 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", 728 | "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", 729 | "dev": true, 730 | "requires": { 731 | "parent-module": "^1.0.0", 732 | "resolve-from": "^4.0.0" 733 | }, 734 | "dependencies": { 735 | "resolve-from": { 736 | "version": "4.0.0", 737 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 738 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 739 | "dev": true 740 | } 741 | } 742 | }, 743 | "imurmurhash": { 744 | "version": "0.1.4", 745 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 746 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 747 | "dev": true 748 | }, 749 | "inflight": { 750 | "version": "1.0.6", 751 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 752 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 753 | "dev": true, 754 | "requires": { 755 | "once": "^1.3.0", 756 | "wrappy": "1" 757 | } 758 | }, 759 | "inherits": { 760 | "version": "2.0.3", 761 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 762 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 763 | }, 764 | "inquirer": { 765 | "version": "6.3.1", 766 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", 767 | "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", 768 | "dev": true, 769 | "requires": { 770 | "ansi-escapes": "^3.2.0", 771 | "chalk": "^2.4.2", 772 | "cli-cursor": "^2.1.0", 773 | "cli-width": "^2.0.0", 774 | "external-editor": "^3.0.3", 775 | "figures": "^2.0.0", 776 | "lodash": "^4.17.11", 777 | "mute-stream": "0.0.7", 778 | "run-async": "^2.2.0", 779 | "rxjs": "^6.4.0", 780 | "string-width": "^2.1.0", 781 | "strip-ansi": "^5.1.0", 782 | "through": "^2.3.6" 783 | }, 784 | "dependencies": { 785 | "ansi-regex": { 786 | "version": "4.1.0", 787 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 788 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 789 | "dev": true 790 | }, 791 | "strip-ansi": { 792 | "version": "5.2.0", 793 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 794 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 795 | "dev": true, 796 | "requires": { 797 | "ansi-regex": "^4.1.0" 798 | } 799 | } 800 | } 801 | }, 802 | "ipaddr.js": { 803 | "version": "1.9.0", 804 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 805 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 806 | }, 807 | "is-fullwidth-code-point": { 808 | "version": "2.0.0", 809 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 810 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 811 | "dev": true 812 | }, 813 | "is-promise": { 814 | "version": "2.1.0", 815 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 816 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 817 | "dev": true 818 | }, 819 | "isexe": { 820 | "version": "2.0.0", 821 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 822 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 823 | "dev": true 824 | }, 825 | "js-tokens": { 826 | "version": "4.0.0", 827 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 828 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 829 | "dev": true 830 | }, 831 | "js-yaml": { 832 | "version": "3.13.1", 833 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 834 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 835 | "dev": true, 836 | "requires": { 837 | "argparse": "^1.0.7", 838 | "esprima": "^4.0.0" 839 | } 840 | }, 841 | "json-schema-traverse": { 842 | "version": "0.4.1", 843 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 844 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 845 | "dev": true 846 | }, 847 | "json-stable-stringify-without-jsonify": { 848 | "version": "1.0.1", 849 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 850 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 851 | "dev": true 852 | }, 853 | "kareem": { 854 | "version": "2.3.0", 855 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", 856 | "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" 857 | }, 858 | "levn": { 859 | "version": "0.3.0", 860 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 861 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 862 | "dev": true, 863 | "requires": { 864 | "prelude-ls": "~1.1.2", 865 | "type-check": "~0.3.2" 866 | } 867 | }, 868 | "lodash": { 869 | "version": "4.17.11", 870 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 871 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 872 | }, 873 | "media-typer": { 874 | "version": "0.3.0", 875 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 876 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 877 | }, 878 | "memory-pager": { 879 | "version": "1.5.0", 880 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 881 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 882 | "optional": true 883 | }, 884 | "merge-descriptors": { 885 | "version": "1.0.1", 886 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 887 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 888 | }, 889 | "methods": { 890 | "version": "1.1.2", 891 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 892 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 893 | }, 894 | "mime": { 895 | "version": "1.4.1", 896 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 897 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 898 | }, 899 | "mime-db": { 900 | "version": "1.40.0", 901 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 902 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 903 | }, 904 | "mime-types": { 905 | "version": "2.1.24", 906 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 907 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 908 | "requires": { 909 | "mime-db": "1.40.0" 910 | } 911 | }, 912 | "mimic-fn": { 913 | "version": "1.2.0", 914 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 915 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 916 | "dev": true 917 | }, 918 | "minimatch": { 919 | "version": "3.0.4", 920 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 921 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 922 | "dev": true, 923 | "requires": { 924 | "brace-expansion": "^1.1.7" 925 | } 926 | }, 927 | "minimist": { 928 | "version": "0.0.8", 929 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 930 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 931 | "dev": true 932 | }, 933 | "mkdirp": { 934 | "version": "0.5.1", 935 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 936 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 937 | "dev": true, 938 | "requires": { 939 | "minimist": "0.0.8" 940 | } 941 | }, 942 | "mongodb": { 943 | "version": "3.2.2", 944 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.2.tgz", 945 | "integrity": "sha512-xQ6apOOV+w7VFApdaJpWhYhzartpjIDFQjG0AwgJkLh7dBs7PTsq4A3Bia2QWpDohmAzTBIdQVLMqqLy0mwt3Q==", 946 | "requires": { 947 | "mongodb-core": "3.2.2", 948 | "safe-buffer": "^5.1.2" 949 | } 950 | }, 951 | "mongodb-core": { 952 | "version": "3.2.2", 953 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.2.tgz", 954 | "integrity": "sha512-YRgC39MuzKL0uoGoRdTmV1e9m47NbMnYmuEx4IOkgWAGXPSEzRY7cwb3N0XMmrDMnD9vp7MysNyAriIIeGgIQg==", 955 | "requires": { 956 | "bson": "^1.1.1", 957 | "require_optional": "^1.0.1", 958 | "safe-buffer": "^5.1.2", 959 | "saslprep": "^1.0.0" 960 | } 961 | }, 962 | "mongoose": { 963 | "version": "5.5.4", 964 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.5.4.tgz", 965 | "integrity": "sha512-xzS7fJtXGjCOZozCtlyFS8graMub1L9knp37+1dJCDmWzOtXVHeLjV2XIC9tX0sE54cxeG5rHvSmIkLpeHjjmA==", 966 | "requires": { 967 | "async": "2.6.1", 968 | "bson": "~1.1.1", 969 | "kareem": "2.3.0", 970 | "mongodb": "3.2.2", 971 | "mongodb-core": "3.2.2", 972 | "mongoose-legacy-pluralize": "1.0.2", 973 | "mpath": "0.5.2", 974 | "mquery": "3.2.0", 975 | "ms": "2.1.1", 976 | "regexp-clone": "0.0.1", 977 | "safe-buffer": "5.1.2", 978 | "sift": "7.0.1", 979 | "sliced": "1.0.1" 980 | }, 981 | "dependencies": { 982 | "ms": { 983 | "version": "2.1.1", 984 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 985 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 986 | } 987 | } 988 | }, 989 | "mongoose-legacy-pluralize": { 990 | "version": "1.0.2", 991 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 992 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 993 | }, 994 | "mpath": { 995 | "version": "0.5.2", 996 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.2.tgz", 997 | "integrity": "sha512-NOeCoW6AYc3hLi30npe7uzbD9b4FQZKH40YKABUCCvaKKL5agj6YzvHoNx8jQpDMNPgIa5bvSZQbQpWBAVD0Kw==" 998 | }, 999 | "mquery": { 1000 | "version": "3.2.0", 1001 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz", 1002 | "integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==", 1003 | "requires": { 1004 | "bluebird": "3.5.1", 1005 | "debug": "3.1.0", 1006 | "regexp-clone": "0.0.1", 1007 | "safe-buffer": "5.1.2", 1008 | "sliced": "1.0.1" 1009 | }, 1010 | "dependencies": { 1011 | "debug": { 1012 | "version": "3.1.0", 1013 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1014 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1015 | "requires": { 1016 | "ms": "2.0.0" 1017 | } 1018 | } 1019 | } 1020 | }, 1021 | "ms": { 1022 | "version": "2.0.0", 1023 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1024 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1025 | }, 1026 | "mute-stream": { 1027 | "version": "0.0.7", 1028 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1029 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1030 | "dev": true 1031 | }, 1032 | "natural-compare": { 1033 | "version": "1.4.0", 1034 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1035 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1036 | "dev": true 1037 | }, 1038 | "negotiator": { 1039 | "version": "0.6.1", 1040 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1041 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1042 | }, 1043 | "nice-try": { 1044 | "version": "1.0.5", 1045 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1046 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1047 | "dev": true 1048 | }, 1049 | "on-finished": { 1050 | "version": "2.3.0", 1051 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1052 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1053 | "requires": { 1054 | "ee-first": "1.1.1" 1055 | } 1056 | }, 1057 | "once": { 1058 | "version": "1.4.0", 1059 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1060 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1061 | "dev": true, 1062 | "requires": { 1063 | "wrappy": "1" 1064 | } 1065 | }, 1066 | "onetime": { 1067 | "version": "2.0.1", 1068 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1069 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1070 | "dev": true, 1071 | "requires": { 1072 | "mimic-fn": "^1.0.0" 1073 | } 1074 | }, 1075 | "optionator": { 1076 | "version": "0.8.2", 1077 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1078 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1079 | "dev": true, 1080 | "requires": { 1081 | "deep-is": "~0.1.3", 1082 | "fast-levenshtein": "~2.0.4", 1083 | "levn": "~0.3.0", 1084 | "prelude-ls": "~1.1.2", 1085 | "type-check": "~0.3.2", 1086 | "wordwrap": "~1.0.0" 1087 | } 1088 | }, 1089 | "os-tmpdir": { 1090 | "version": "1.0.2", 1091 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1092 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1093 | "dev": true 1094 | }, 1095 | "parent-module": { 1096 | "version": "1.0.1", 1097 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1098 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1099 | "dev": true, 1100 | "requires": { 1101 | "callsites": "^3.0.0" 1102 | } 1103 | }, 1104 | "parseurl": { 1105 | "version": "1.3.3", 1106 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1107 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1108 | }, 1109 | "path-is-absolute": { 1110 | "version": "1.0.1", 1111 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1112 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1113 | "dev": true 1114 | }, 1115 | "path-is-inside": { 1116 | "version": "1.0.2", 1117 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1118 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1119 | "dev": true 1120 | }, 1121 | "path-key": { 1122 | "version": "2.0.1", 1123 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1124 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1125 | "dev": true 1126 | }, 1127 | "path-to-regexp": { 1128 | "version": "0.1.7", 1129 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1130 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1131 | }, 1132 | "prelude-ls": { 1133 | "version": "1.1.2", 1134 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1135 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1136 | "dev": true 1137 | }, 1138 | "progress": { 1139 | "version": "2.0.3", 1140 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1141 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1142 | "dev": true 1143 | }, 1144 | "proxy-addr": { 1145 | "version": "2.0.5", 1146 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 1147 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 1148 | "requires": { 1149 | "forwarded": "~0.1.2", 1150 | "ipaddr.js": "1.9.0" 1151 | } 1152 | }, 1153 | "punycode": { 1154 | "version": "2.1.1", 1155 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1156 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1157 | "dev": true 1158 | }, 1159 | "qs": { 1160 | "version": "6.5.2", 1161 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1162 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1163 | }, 1164 | "range-parser": { 1165 | "version": "1.2.0", 1166 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 1167 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 1168 | }, 1169 | "raw-body": { 1170 | "version": "2.4.0", 1171 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1172 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1173 | "requires": { 1174 | "bytes": "3.1.0", 1175 | "http-errors": "1.7.2", 1176 | "iconv-lite": "0.4.24", 1177 | "unpipe": "1.0.0" 1178 | }, 1179 | "dependencies": { 1180 | "http-errors": { 1181 | "version": "1.7.2", 1182 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1183 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1184 | "requires": { 1185 | "depd": "~1.1.2", 1186 | "inherits": "2.0.3", 1187 | "setprototypeof": "1.1.1", 1188 | "statuses": ">= 1.5.0 < 2", 1189 | "toidentifier": "1.0.0" 1190 | } 1191 | }, 1192 | "setprototypeof": { 1193 | "version": "1.1.1", 1194 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1195 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1196 | }, 1197 | "statuses": { 1198 | "version": "1.5.0", 1199 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1200 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1201 | } 1202 | } 1203 | }, 1204 | "regexp-clone": { 1205 | "version": "0.0.1", 1206 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 1207 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 1208 | }, 1209 | "regexpp": { 1210 | "version": "2.0.1", 1211 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1212 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1213 | "dev": true 1214 | }, 1215 | "require_optional": { 1216 | "version": "1.0.1", 1217 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1218 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1219 | "requires": { 1220 | "resolve-from": "^2.0.0", 1221 | "semver": "^5.1.0" 1222 | } 1223 | }, 1224 | "resolve-from": { 1225 | "version": "2.0.0", 1226 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1227 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1228 | }, 1229 | "restore-cursor": { 1230 | "version": "2.0.0", 1231 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1232 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1233 | "dev": true, 1234 | "requires": { 1235 | "onetime": "^2.0.0", 1236 | "signal-exit": "^3.0.2" 1237 | } 1238 | }, 1239 | "rimraf": { 1240 | "version": "2.6.3", 1241 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1242 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1243 | "dev": true, 1244 | "requires": { 1245 | "glob": "^7.1.3" 1246 | } 1247 | }, 1248 | "run-async": { 1249 | "version": "2.3.0", 1250 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1251 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1252 | "dev": true, 1253 | "requires": { 1254 | "is-promise": "^2.1.0" 1255 | } 1256 | }, 1257 | "rxjs": { 1258 | "version": "6.5.1", 1259 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.1.tgz", 1260 | "integrity": "sha512-y0j31WJc83wPu31vS1VlAFW5JGrnGC+j+TtGAa1fRQphy48+fDYiDmX8tjGloToEsMkxnouOg/1IzXGKkJnZMg==", 1261 | "dev": true, 1262 | "requires": { 1263 | "tslib": "^1.9.0" 1264 | } 1265 | }, 1266 | "safe-buffer": { 1267 | "version": "5.1.2", 1268 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1269 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1270 | }, 1271 | "safer-buffer": { 1272 | "version": "2.1.2", 1273 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1274 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1275 | }, 1276 | "saslprep": { 1277 | "version": "1.0.2", 1278 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz", 1279 | "integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==", 1280 | "optional": true, 1281 | "requires": { 1282 | "sparse-bitfield": "^3.0.3" 1283 | } 1284 | }, 1285 | "semver": { 1286 | "version": "5.7.0", 1287 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 1288 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 1289 | }, 1290 | "send": { 1291 | "version": "0.16.2", 1292 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1293 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1294 | "requires": { 1295 | "debug": "2.6.9", 1296 | "depd": "~1.1.2", 1297 | "destroy": "~1.0.4", 1298 | "encodeurl": "~1.0.2", 1299 | "escape-html": "~1.0.3", 1300 | "etag": "~1.8.1", 1301 | "fresh": "0.5.2", 1302 | "http-errors": "~1.6.2", 1303 | "mime": "1.4.1", 1304 | "ms": "2.0.0", 1305 | "on-finished": "~2.3.0", 1306 | "range-parser": "~1.2.0", 1307 | "statuses": "~1.4.0" 1308 | } 1309 | }, 1310 | "serve-static": { 1311 | "version": "1.13.2", 1312 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1313 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1314 | "requires": { 1315 | "encodeurl": "~1.0.2", 1316 | "escape-html": "~1.0.3", 1317 | "parseurl": "~1.3.2", 1318 | "send": "0.16.2" 1319 | } 1320 | }, 1321 | "setprototypeof": { 1322 | "version": "1.1.0", 1323 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1324 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1325 | }, 1326 | "shebang-command": { 1327 | "version": "1.2.0", 1328 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1329 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1330 | "dev": true, 1331 | "requires": { 1332 | "shebang-regex": "^1.0.0" 1333 | } 1334 | }, 1335 | "shebang-regex": { 1336 | "version": "1.0.0", 1337 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1338 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1339 | "dev": true 1340 | }, 1341 | "sift": { 1342 | "version": "7.0.1", 1343 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 1344 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 1345 | }, 1346 | "signal-exit": { 1347 | "version": "3.0.2", 1348 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1349 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1350 | "dev": true 1351 | }, 1352 | "slice-ansi": { 1353 | "version": "2.1.0", 1354 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1355 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1356 | "dev": true, 1357 | "requires": { 1358 | "ansi-styles": "^3.2.0", 1359 | "astral-regex": "^1.0.0", 1360 | "is-fullwidth-code-point": "^2.0.0" 1361 | } 1362 | }, 1363 | "sliced": { 1364 | "version": "1.0.1", 1365 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1366 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1367 | }, 1368 | "sparse-bitfield": { 1369 | "version": "3.0.3", 1370 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1371 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1372 | "optional": true, 1373 | "requires": { 1374 | "memory-pager": "^1.0.2" 1375 | } 1376 | }, 1377 | "sprintf-js": { 1378 | "version": "1.0.3", 1379 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1380 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1381 | "dev": true 1382 | }, 1383 | "statuses": { 1384 | "version": "1.4.0", 1385 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1386 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1387 | }, 1388 | "string-width": { 1389 | "version": "2.1.1", 1390 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1391 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1392 | "dev": true, 1393 | "requires": { 1394 | "is-fullwidth-code-point": "^2.0.0", 1395 | "strip-ansi": "^4.0.0" 1396 | } 1397 | }, 1398 | "strip-ansi": { 1399 | "version": "4.0.0", 1400 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1401 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1402 | "dev": true, 1403 | "requires": { 1404 | "ansi-regex": "^3.0.0" 1405 | } 1406 | }, 1407 | "strip-json-comments": { 1408 | "version": "2.0.1", 1409 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1410 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1411 | "dev": true 1412 | }, 1413 | "supports-color": { 1414 | "version": "5.5.0", 1415 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1416 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1417 | "dev": true, 1418 | "requires": { 1419 | "has-flag": "^3.0.0" 1420 | } 1421 | }, 1422 | "table": { 1423 | "version": "5.2.3", 1424 | "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", 1425 | "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", 1426 | "dev": true, 1427 | "requires": { 1428 | "ajv": "^6.9.1", 1429 | "lodash": "^4.17.11", 1430 | "slice-ansi": "^2.1.0", 1431 | "string-width": "^3.0.0" 1432 | }, 1433 | "dependencies": { 1434 | "ansi-regex": { 1435 | "version": "4.1.0", 1436 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1437 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1438 | "dev": true 1439 | }, 1440 | "string-width": { 1441 | "version": "3.1.0", 1442 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1443 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1444 | "dev": true, 1445 | "requires": { 1446 | "emoji-regex": "^7.0.1", 1447 | "is-fullwidth-code-point": "^2.0.0", 1448 | "strip-ansi": "^5.1.0" 1449 | } 1450 | }, 1451 | "strip-ansi": { 1452 | "version": "5.2.0", 1453 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1454 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1455 | "dev": true, 1456 | "requires": { 1457 | "ansi-regex": "^4.1.0" 1458 | } 1459 | } 1460 | } 1461 | }, 1462 | "text-table": { 1463 | "version": "0.2.0", 1464 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1465 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1466 | "dev": true 1467 | }, 1468 | "through": { 1469 | "version": "2.3.8", 1470 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1471 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1472 | "dev": true 1473 | }, 1474 | "tmp": { 1475 | "version": "0.0.33", 1476 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1477 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1478 | "dev": true, 1479 | "requires": { 1480 | "os-tmpdir": "~1.0.2" 1481 | } 1482 | }, 1483 | "toidentifier": { 1484 | "version": "1.0.0", 1485 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1486 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1487 | }, 1488 | "tslib": { 1489 | "version": "1.9.3", 1490 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1491 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1492 | "dev": true 1493 | }, 1494 | "type-check": { 1495 | "version": "0.3.2", 1496 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1497 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1498 | "dev": true, 1499 | "requires": { 1500 | "prelude-ls": "~1.1.2" 1501 | } 1502 | }, 1503 | "type-is": { 1504 | "version": "1.6.18", 1505 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1506 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1507 | "requires": { 1508 | "media-typer": "0.3.0", 1509 | "mime-types": "~2.1.24" 1510 | } 1511 | }, 1512 | "unpipe": { 1513 | "version": "1.0.0", 1514 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1515 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1516 | }, 1517 | "uri-js": { 1518 | "version": "4.2.2", 1519 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1520 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1521 | "dev": true, 1522 | "requires": { 1523 | "punycode": "^2.1.0" 1524 | } 1525 | }, 1526 | "utils-merge": { 1527 | "version": "1.0.1", 1528 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1529 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1530 | }, 1531 | "vary": { 1532 | "version": "1.1.2", 1533 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1534 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1535 | }, 1536 | "which": { 1537 | "version": "1.3.1", 1538 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1539 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1540 | "dev": true, 1541 | "requires": { 1542 | "isexe": "^2.0.0" 1543 | } 1544 | }, 1545 | "wordwrap": { 1546 | "version": "1.0.0", 1547 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1548 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1549 | "dev": true 1550 | }, 1551 | "wrappy": { 1552 | "version": "1.0.2", 1553 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1554 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1555 | "dev": true 1556 | }, 1557 | "write": { 1558 | "version": "1.0.3", 1559 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1560 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1561 | "dev": true, 1562 | "requires": { 1563 | "mkdirp": "^0.5.1" 1564 | } 1565 | }, 1566 | "xss": { 1567 | "version": "1.0.6", 1568 | "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.6.tgz", 1569 | "integrity": "sha512-6Q9TPBeNyoTRxgZFk5Ggaepk/4vUOYdOsIUYvLehcsIZTFjaavbVnsuAkLA5lIFuug5hw8zxcB9tm01gsjph2A==", 1570 | "requires": { 1571 | "commander": "^2.9.0", 1572 | "cssfilter": "0.0.10" 1573 | } 1574 | } 1575 | } 1576 | } 1577 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-mobbile-server", 3 | "version": "1.0.0", 4 | "description": "项目数据库后台,使用Mongoose + MongoDb + express 实现", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Mr.Liang", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.19.0", 13 | "express": "^4.16.4", 14 | "mongoose": "^5.5.4", 15 | "xss": "^1.0.6" 16 | }, 17 | "devDependencies": { 18 | "eslint": "^5.16.0" 19 | } 20 | } -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | // 连接数据库的配置文件,向外暴露一个配置对象 2 | 3 | const host = 'localhost'; 4 | const dbname = 'mobile'; 5 | const port = 3000; 6 | 7 | // const username = 'mobile'; 8 | // const password = 'yourpasswd'; 9 | 10 | // 如果是有密码的登录使用这种方式 11 | // const url = `mongodb://${username}:${password}@${host}:27017/${dbname}`; 12 | 13 | // 如果是没有密码的本地测试使用这种方式 14 | const url = `mongodb://${host}:27017/${dbname}`; 15 | 16 | module.exports = { 17 | // 数据库的连接地址 18 | url, 19 | // http 服务器监听的端口 20 | port 21 | }; -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const express = require('express'); 3 | const router = require('./router.js'); 4 | const port = require('./config.js').port; 5 | 6 | const app = express(); 7 | // 引入json解析中间件 8 | const bodyParser = require('body-parser'); 9 | // 添加json解析 10 | app.use(bodyParser.json()); 11 | app.use(bodyParser.urlencoded({ 12 | extended: false 13 | })); 14 | 15 | // 允许所有的请求形式 16 | app.use((req, res, next) => { 17 | res.header("Access-Control-Allow-Origin", "*"); 18 | res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 19 | next(); 20 | }); 21 | 22 | // ---------------------- 新闻News路由开始 ---------------------- 23 | 24 | // 根据 pageIdx 分页查询新闻 25 | app.get('/api/getnews', router.doFindNewsByPageIdx); 26 | 27 | // 根据 newsId 查询新闻的详细,并且自增新闻的点击量 28 | app.get('/api/getnewsdetail', router.doFindNewsById); 29 | 30 | // 获取主页的封面图 31 | app.get('/api/getcover', router.doGetCover); 32 | 33 | // 根据新闻 newsId 和 pageIdx 分页获取新闻的评论 34 | app.get('/api/getnewscom', router.doGetCommentByNewsId); 35 | 36 | // 添加评论 37 | app.post('/api/addnewscom', router.doAddNewsComment); 38 | 39 | // ---------------------- 新闻News路由结束 ---------------------- 40 | 41 | // ---------------------- 图片Photo路由开始 ---------------------- 42 | 43 | // 获取所有的图片分类 44 | app.get('/api/getphotypes', router.doGetPhoTypes); 45 | 46 | // 根据图片的页码和图片的分页查询部分图片信息 47 | app.get('/api/getpho', router.doGetPho); 48 | 49 | // 获取图片的详细 50 | app.get('/api/getphodetail', router.doGetPhoDetail); 51 | 52 | // 获取所有的图片评论 53 | app.get('/api/getphocom', router.doGetPhoComByPage); 54 | 55 | // 添加图片的评论 56 | app.post('/api/addphocom', router.doAddPhoComment); 57 | 58 | // ---------------------- 图片Photo路由结束 ---------------------- 59 | 60 | // ---------------------- 商品Goods路由开始吃 ---------------------- 61 | 62 | // 通过页码分页查询所有的商品信息 63 | app.get('/api/getgod', router.doGetGoodsByPage); 64 | 65 | // 通过商品id和页码分页查询商品的评论 66 | app.get('/api/getgodcom', router.doGetCommentByGodId); 67 | 68 | // 获取商品详细 69 | app.get('/api/getgoddetail', router.doFindGodDetailByid); 70 | 71 | // POST 添加商品评论 72 | app.post('/api/addgodcom', router.doAddGodComment); 73 | // ---------------------- 商品Goods路由开结束 ---------------------- 74 | 75 | // 匹配 404 76 | app.get('*', (req, res) => { 77 | res.send('没有找到网页'); 78 | }); 79 | 80 | 81 | // app 默认在 6666 端口监听 82 | app.listen(port); 83 | console.log('server listen on http://localhost:' + port); -------------------------------------------------------------------------------- /src/models/Cover.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 封面的图片 3 | */ 4 | // 映入数据库连接对象 5 | 6 | const db = require('../util/db.js') 7 | 8 | const mongoose = require('mongoose') 9 | 10 | // 通过 mongoose 创建一个 Schema 11 | 12 | const CoverSchema = mongoose.Schema({ 13 | imgs: [String] 14 | }) 15 | 16 | // 注册 Model 17 | // 并导出这个 Model 18 | module.exports = db.model('cover', CoverSchema); -------------------------------------------------------------------------------- /src/models/Goods.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const mongoose = require('mongoose'); 3 | const db = require('../util/db.js'); 4 | 5 | // 一页显示吧八条商品信息和八条商品评论 6 | const PAGE_SIZE = 8; 7 | 8 | // 创建 商品 Goods 的Schema对象 9 | const GoodsSchema = mongoose.Schema({ 10 | // 商品的id号码 11 | godId: Number, 12 | // 商品的名称 13 | name: String, 14 | // 商品的原价 15 | oldPrice: Number, 16 | // 商品的现价 17 | newPrice: Number, 18 | // 商品的文字介绍 19 | intro: String, 20 | // 商品的库存 21 | quantity: Number, 22 | // 商品的编号 23 | godNum: String, 24 | // 商品的添加日期 25 | addDate: { 26 | type: Date, 27 | default: new Date() 28 | }, 29 | // 商品的图片介绍 30 | phos: [String], 31 | // 商品的多个图文介绍的图片地址 32 | imgIntro: [String] 33 | }); 34 | 35 | GoodsSchema.pre('save', function (next) { 36 | // 在保存商品信息之前修改商品的id自增 37 | this.model('goods').find({}, (err, data) => { 38 | if (err) return console.log(err); 39 | 40 | this.godId = data.length; 41 | next(); 42 | }); 43 | }); 44 | 45 | GoodsSchema.post('save', function (doc, next) { 46 | // 在商品添加完成之后生成对应的评论 47 | const comModel = this.model('goodscomment'); 48 | 49 | comModel.find({}, (err) => { 50 | if (err) return console.log(err); 51 | new comModel({ 52 | godId: doc.godId, 53 | comments: [] 54 | }).save(next); 55 | }); 56 | 57 | }); 58 | 59 | // 分页查找商品信息 60 | GoodsSchema.statics.findByPage = function (pageIdx, callback) { 61 | this.model('goods').find({}).skip(PAGE_SIZE * (pageIdx - 1)).limit(PAGE_SIZE).exec(callback); 62 | }; 63 | 64 | 65 | 66 | // 数据库中注册 Goods Model 67 | module.exports = db.model('goods', GoodsSchema); -------------------------------------------------------------------------------- /src/models/GoodsComment.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const db = require('../util/db.js'); 3 | const mongoose = require('mongoose'); 4 | const PAGE_SIZE = 8; 5 | // 生成商品评论的Schema结构 6 | const GoodsCommentSchema = mongoose.Schema({ 7 | // 一个商品对于多个评论 8 | godId: Number, 9 | comments: [{ 10 | // 评论的id号码 11 | comId: Number, 12 | // 评论的用户名 13 | username: { 14 | type: String, 15 | default: '匿名' 16 | }, 17 | // 评论的日期 18 | comDate: { 19 | type: Date, 20 | default: new Date() 21 | }, 22 | // 评论的内容 23 | content: String 24 | }] 25 | }); 26 | 27 | // 添加商品的评论 28 | GoodsCommentSchema.statics.addComment = function (godId, comment, callback) { 29 | this.model('goodscomment').findOne({ 30 | godId 31 | }, (err, data) => { 32 | if (err) return console.log(err); 33 | // 更新评论的id自增 34 | const commentList = data.comments; 35 | comment.comId = commentList.length; 36 | 37 | data.comments.push(comment); 38 | data.save(callback); 39 | 40 | }); 41 | }; 42 | 43 | // 分页查询商品的评论 44 | GoodsCommentSchema.statics.findByPageIdx = function (godId, pageIdx, callback) { 45 | const limStart = PAGE_SIZE * (pageIdx - 1); 46 | this.model('goodscomment').findOne({ 47 | godId 48 | }, { 49 | comments: { 50 | $slice: [limStart, limStart + PAGE_SIZE] 51 | } 52 | }).exec(callback); 53 | }; 54 | 55 | // 在数据库连接中注册模型 56 | module.exports = db.model('goodscomment', GoodsCommentSchema); -------------------------------------------------------------------------------- /src/models/News.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /** 3 | * 创建一个 News 新闻对象的 Schema 对象 4 | * News 如果通过静态方法创建News的话 News 的id不会自增,需要通过 new News 的方式生成 5 | */ 6 | // 引入数据库连接对象 7 | const db = require('../util/db.js'); 8 | const mongoose = require('mongoose'); 9 | 10 | // 定义一页八条数据 11 | const PAGE_SIZE = 8; 12 | 13 | // 通过 mongoose 创建一个Schema 14 | const NewsSchema = mongoose.Schema({ 15 | id: { 16 | type: Number, 17 | // index: true 18 | }, 19 | add_time: { 20 | type: Date, 21 | default: new Date() 22 | }, 23 | clicked: { 24 | type: Number, 25 | default: 0 26 | }, 27 | img_url: String, 28 | title: String, 29 | summary: String, 30 | content: String 31 | }); 32 | 33 | 34 | // 定义实例方法方便分页查找 35 | NewsSchema.statics.findByPage = function (pageIdx, callback) { 36 | // 先跳过 page_size * (pageIdx-1) 个新闻 然后 只查询 page_size 个 37 | this.model('news').find({}).skip(PAGE_SIZE * (pageIdx - 1)).limit(PAGE_SIZE).exec(callback); 38 | }; 39 | 40 | // 点击了对应的文章之后,文章的点击数目加一 41 | NewsSchema.statics.clicked = function (newsId, callback) { 42 | // $inc increase 自增的意思,递减的话 $inc -num 43 | this.model('news').update({ 44 | 'id': newsId 45 | }, { 46 | $inc: { 47 | 'clicked': 1 48 | } 49 | }, callback); 50 | }; 51 | 52 | NewsSchema.pre('save', function (next) { 53 | // 在保存新闻之前修改新闻的id自增 54 | this.model('news').find({}, (err, data) => { 55 | if (err) return console.log(err); 56 | 57 | this.id = data.length; 58 | next(); 59 | }); 60 | }); 61 | // 在新闻保存之后让新闻的评论自动添加 62 | NewsSchema.post('save', function (doc, next) { 63 | // 添加新闻评论的模板内容 64 | const newComModel = this.model('newscomment'); 65 | newComModel.find({}, (err) => { 66 | if (err) return console.log(err); 67 | new newComModel({ 68 | newsId: doc.id, 69 | comments: [] 70 | }).save(next); 71 | }); 72 | }); 73 | 74 | module.exports = db.model('news', NewsSchema); -------------------------------------------------------------------------------- /src/models/NewsComment.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /** 3 | * 创建一个 Comment 评论对象的 Schema 对象 4 | */ 5 | // 引入数据库连接对象 6 | const db = require('../util/db.js'); 7 | const mongoose = require('mongoose'); 8 | 9 | // 一页加载8条评论信息 10 | const PAGE_SIZE = 8; 11 | // 通过 mongoose 创建一个Schema 12 | const NewsCommentScheme = new mongoose.Schema({ 13 | newsId: Number, 14 | comments: [{ 15 | comId: { 16 | type: Number, 17 | // index: true 18 | }, 19 | username: { 20 | type: String, 21 | default: '匿名' 22 | }, 23 | comDate: { 24 | type: Date, 25 | default: new Date() 26 | }, 27 | content: String 28 | }] 29 | }); 30 | 31 | // 通过 新闻 id 分页查询评论的方法 32 | NewsCommentScheme.statics.findByPageIdx = function (id, pageIdx, callback) { 33 | const limStart = PAGE_SIZE * (pageIdx - 1); 34 | this.model('newscomment').findOne({ 35 | 'newsId': id 36 | }, { 37 | comments: { 38 | $slice: [limStart, limStart + PAGE_SIZE] 39 | } 40 | }).exec(callback); 41 | }; 42 | 43 | // 定义实例的添加评论方法 44 | NewsCommentScheme.statics.addComment = function (newsId, comment, callback) { 45 | Comment.findOne({ 46 | newsId: newsId 47 | }, (err, data) => { 48 | if (err) return console.log(err); 49 | // 更新 评论的id自增 50 | const commentsList = data.comments; 51 | comment.comId = commentsList.length; 52 | 53 | data.comments.push(comment); 54 | // 继续修改这里的内容 55 | data.save(callback); 56 | }); 57 | }; 58 | 59 | // 通过这个 Schema 注册一个 Model 60 | const Comment = db.model('newscomment', NewsCommentScheme); 61 | // 定义通过新闻找到评论的实例方法 62 | module.exports = Comment; -------------------------------------------------------------------------------- /src/models/Photo.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /** 3 | * 创建一个 Photo 图片对象的 Schema 对象 4 | */ 5 | const db = require('../util/db.js'); 6 | const mongoose = require('mongoose'); 7 | 8 | // 定义分页查询的时候一页显示多少张图片 9 | const PAGE_SIZE = 4; 10 | // 创建 Schema 对象 11 | const PhotoSchema = mongoose.Schema({ 12 | // 图片分享的id号码 13 | phoId: Number, 14 | 15 | // 多个图片的 url地址 16 | phos: [String], 17 | 18 | // 图片的介绍 19 | intro: String, 20 | 21 | // 图片的分类 22 | type: String 23 | }); 24 | 25 | // 在保存数据之前修改 phoId 自增 26 | PhotoSchema.pre('save', function (next) { 27 | Photo.find({}, (err, data) => { 28 | if (err) return console.log(err); 29 | 30 | this.phoId = data.length; 31 | next(); 32 | }); 33 | }); 34 | 35 | // 在保存数据结束之后生成图片对于的评论基本信息 36 | PhotoSchema.post('save', function (doc, next) { 37 | const photoComModel = this.model('photocomment'); 38 | // 新创建一个 图片的评论对象,这个对象的id为图片的id 39 | photoComModel.find({}, (err) => { 40 | if (err) return console.log(err); 41 | new photoComModel({ 42 | phoId: doc.phoId, 43 | comments: [] 44 | }).save(next); 45 | }); 46 | }); 47 | 48 | // 查找所有图片的分类 49 | PhotoSchema.statics.findAllTypes = function (callback) { 50 | // 查找所有的图片然后筛选 type 属性,然后type去重输出一个类型字符串数组 51 | this.model('photo').find({}, { 52 | type: 1 53 | }).distinct('type').exec(callback); 54 | }; 55 | 56 | // 通过分页和类型部分查询 57 | PhotoSchema.statics.findPho = function (pageIdx, type, callback) { 58 | this.model('photo').find({ 59 | type 60 | }).skip(PAGE_SIZE * (pageIdx - 1)).limit(PAGE_SIZE).exec(callback); 61 | }; 62 | 63 | // 通过 phoId 查询一个图片的信息 64 | PhotoSchema.statics.findByPhoId = function (phoId, callback) { 65 | this.model('photo').findOne({ 66 | phoId: phoId 67 | }, callback); 68 | }; 69 | const Photo = db.model('photo', PhotoSchema); 70 | // 在数据库连接对象中注册这个 模型, 并向外导出这个 Model 71 | module.exports = Photo; -------------------------------------------------------------------------------- /src/models/PhotoComment.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /** 3 | * 定义图片评论的对象的 Schema 对象 4 | */ 5 | const db = require('../util/db.js'); 6 | const mongoose = require('mongoose'); 7 | 8 | // 定义一页查询八张图片信息 9 | const PAGE_SIZE = 8; 10 | 11 | const PhotoCommentSchema = mongoose.Schema({ 12 | // 一个photi对应一组评论 13 | phoId: Number, 14 | comments: [{ 15 | // 评论id 16 | comId: Number, 17 | // 用户名 18 | username: { 19 | type: String, 20 | default: '匿名' 21 | }, 22 | // 评论日期 23 | comDate: { 24 | type: Date, 25 | default: new Date() 26 | }, 27 | // 评论的内容 28 | content: String 29 | }] 30 | }); 31 | 32 | // 通过 phoId 查询一组评论的方法 33 | PhotoCommentSchema.statics.findByPhoId = function (phoId, callback) { 34 | this.model('photocomment').find({ 35 | phoId: phoId 36 | }, callback); 37 | }; 38 | 39 | // 通过图片 id 分页查询图片评论 40 | PhotoCommentSchema.statics.findByPageIdx = function (id, pageIdx, callback) { 41 | const limStart = PAGE_SIZE * (pageIdx - 1); 42 | this.model('photocomment').findOne({ 43 | phoId: id 44 | }, { 45 | comments: { 46 | $slice: [limStart, limStart + PAGE_SIZE] 47 | } 48 | }).exec(callback); 49 | }; 50 | 51 | // 添加评论的方法 52 | PhotoCommentSchema.statics.addComment = function (phoId, comment, callback) { 53 | // 通过 phoId 查找到这个 图片分享,然后添加一个评论 54 | this.model('photocomment').findOne({ 55 | phoId: phoId 56 | }, (err, data) => { 57 | if (err) return console.log(err); 58 | // 更新评论的id自增 59 | comment.comId = data.comments.length; 60 | 61 | data.comments.push(comment); 62 | // 保存修改之后的内容 63 | data.save(callback); 64 | }); 65 | }; 66 | 67 | // 通过 Schema 注册一个 Model 68 | module.exports = db.model('photocomment', PhotoCommentSchema); -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | /** 3 | * express 的路由对象负责处理,路由对应的操作 4 | */ 5 | const News = require('./models/News.js'); 6 | const NewsComment = require('./models/NewsComment.js'); 7 | const Cover = require('./models/Cover.js'); 8 | const Photo = require('./models/Photo.js'); 9 | const PhotoComment = require('./models/PhotoComment'); 10 | const Goods = require('./models/Goods.js'); 11 | const GoodsComment = require('./models/GoodsComment.js'); 12 | 13 | const xss = require('xss'); 14 | /** 15 | * 获取主页的封面信息 16 | */ 17 | module.exports.doGetCover = function (req, res) { 18 | Cover.find((err, data) => { 19 | if (err) return res.send({ 20 | status: -1 21 | }); 22 | let result = JSON.parse(JSON.stringify(data[0])); 23 | result.status = 1; 24 | res.send(result); 25 | }); 26 | }; 27 | 28 | 29 | // ------------------ 新闻模块开始 ------------------ 30 | /** 31 | * 这个方法当需要按照页码查询新闻的时候执行 32 | */ 33 | exports.doFindNewsByPageIdx = function (req, res) { 34 | let pageIdx = req.query.pageIdx || 1; 35 | pageIdx = parseInt(pageIdx); 36 | pageIdx = pageIdx <= 0 ? 1 : pageIdx; 37 | 38 | News.findByPage(pageIdx, (err, data) => { 39 | // 如果发成错误或者查询不到数据,返回状态码 -1 40 | if (err || data.length < 1) return res.send({ 41 | status: -1 42 | }); 43 | 44 | // 发送 JSON 数据 45 | res.send({ 46 | status: 1, 47 | news: data 48 | }); 49 | }); 50 | }; 51 | 52 | /** 53 | * 通过新闻id查询新闻 54 | * 每一次查询就相当于用户访问了一次 55 | */ 56 | exports.doFindNewsById = function (req, res) { 57 | let newsId = req.query.newsId; 58 | 59 | if (!newsId) newsId = 1; 60 | 61 | News.clicked(newsId, () => { 62 | News.find({ 63 | id: newsId 64 | }, (err, data) => { 65 | if (err || !data.length) return res.send({ 66 | status: -1 67 | }); 68 | 69 | // 发送JSON数据 70 | res.send({ 71 | status: 1, 72 | news: data[0] 73 | }); 74 | }); 75 | }); 76 | }; 77 | 78 | /** 79 | * 这个方法在需要添加用户评论的时候执行 80 | */ 81 | exports.doAddNewsComment = function (req, res) { 82 | // 通过post请求获得 newsId 83 | const newsId = parseInt(req.body.newsId || req.query.newsId || 0); 84 | // 构建NewsComment 评论对象 85 | const comment = { 86 | username: req.body.username, 87 | comDate: new Date(), 88 | content: xss(req.body.content) 89 | }; 90 | 91 | // 添加评论, 添加的数据通过 xss 过滤 92 | NewsComment.addComment(newsId, comment, (err, data) => { 93 | if (err || data.n < 1) return res.send({ 94 | status: -1 95 | }); 96 | 97 | // 发送 JSON 数据 98 | res.send({ 99 | status: 1 100 | }); 101 | }); 102 | }; 103 | 104 | /** 105 | * 通过新闻 id 分页查询新闻的所有评论 106 | */ 107 | module.exports.doGetCommentByNewsId = function (req, res) { 108 | let pageIdx = req.query.pageIdx || 1; 109 | pageIdx = parseInt(pageIdx); 110 | pageIdx = pageIdx <= 0 ? 1 : pageIdx; 111 | 112 | let newsId = parseInt(req.query.newsId || 0); 113 | 114 | NewsComment.findByPageIdx(newsId, pageIdx, (err, data) => { 115 | if (err || !data.comments.length) return res.send({ 116 | status: -1 117 | }); 118 | 119 | res.send({ 120 | status: 1, 121 | comments: data.comments 122 | }); 123 | }); 124 | }; 125 | 126 | // ------------------ 新闻模块结束 ------------------ 127 | 128 | 129 | 130 | // ------------------ 图片模块开始 ------------------ 131 | /** 132 | * 获取所有的图片分类信息 133 | */ 134 | exports.doGetPhoTypes = function (req, res) { 135 | Photo.findAllTypes((err, data) => { 136 | if (err) return res.send({ 137 | status: -1 138 | }); 139 | 140 | res.send({ 141 | status: 1, 142 | types: data 143 | }); 144 | }); 145 | }; 146 | 147 | /** 148 | * 根据图片的页码和分页信息查询部分图片信息 149 | */ 150 | exports.doGetPho = function (req, res) { 151 | let pageIdx = req.query.pageIdx || 0; 152 | pageIdx = parseInt(pageIdx); 153 | 154 | // 如果没有指定查询的类型就查询所有类型 155 | let type = req.query.type || /.*/; 156 | 157 | Photo.findPho(pageIdx, type, (err, data) => { 158 | if (err || !data.length) return res.send({ 159 | status: -1 160 | }); 161 | 162 | res.send({ 163 | status: 1, 164 | phos: data 165 | }); 166 | }); 167 | 168 | }; 169 | 170 | /** 171 | * 通过图片id查询一个图片的详细 172 | */ 173 | exports.doGetPhoDetail = function (req, res) { 174 | const phoId = parseInt(req.query.phoId || 0); 175 | Photo.findByPhoId(phoId, (err, data) => { 176 | if (err) return res.send({ 177 | status: -1 178 | }); 179 | 180 | res.send({ 181 | status: 1, 182 | pho: data 183 | }); 184 | }); 185 | }; 186 | /** 187 | * 通过图片id分页查询图片的评论 188 | */ 189 | exports.doGetPhoComByPage = function (req, res) { 190 | const phoId = parseInt(req.query.phoId || 0); 191 | let pageIdx = req.query.pageIdx || 1; 192 | pageIdx = parseInt(pageIdx); 193 | pageIdx = pageIdx <= 0 ? 1 : pageIdx; 194 | 195 | PhotoComment.findByPageIdx(phoId, pageIdx, (err, data) => { 196 | if (err || !data) return res.send({ 197 | status: -1 198 | }); 199 | 200 | res.send({ 201 | status: 1, 202 | comments: data.comments 203 | }); 204 | }); 205 | }; 206 | 207 | /** 208 | * 添加图片的评论 209 | */ 210 | exports.doAddPhoComment = function (req, res) { 211 | const phoId = parseInt(req.query.phoId || 0); 212 | const comment = { 213 | username: '匿名', 214 | content: req.body.content 215 | }; 216 | 217 | PhotoComment.addComment(phoId, comment, (err, data) => { 218 | if (err || !data) return res.send({ 219 | status: -1 220 | }); 221 | // 测试输出一下数据 222 | res.send({ 223 | status: 1 224 | }); 225 | }); 226 | }; 227 | 228 | // ------------------ 图片模块结束 ------------------ 229 | 230 | // ------------------ 商品模块开始 ------------------ 231 | /** 232 | * 通过页码分页查询商品信息 233 | */ 234 | exports.doGetGoodsByPage = function (req, res) { 235 | let pageIdx = req.query.pageIdx || 1; 236 | pageIdx = parseInt(pageIdx); 237 | pageIdx = pageIdx <= 0 ? 1 : pageIdx; 238 | 239 | Goods.findByPage(pageIdx, (err, data) => { 240 | // 如果发成错误或者查询不到数据,返回状态码 -1 241 | if (err || data.length < 1) return res.send({ 242 | status: -1 243 | }); 244 | 245 | // 发送 JSON 数据 246 | res.send({ 247 | status: 1, 248 | gods: data 249 | }); 250 | }); 251 | }; 252 | 253 | /** 254 | * 通过商品id分页查询商品的所有评论 255 | */ 256 | exports.doGetCommentByGodId = function (req, res) { 257 | let pageIdx = req.query.pageIdx || 1; 258 | pageIdx = parseInt(pageIdx); 259 | pageIdx = pageIdx <= 0 ? 1 : pageIdx; 260 | 261 | let godId = parseInt(req.query.godId || 0); 262 | 263 | GoodsComment.findByPageIdx(godId, pageIdx, (err, data) => { 264 | if (err || !data.comments.length) return res.send({ 265 | status: -1 266 | }); 267 | 268 | res.send({ 269 | status: 1, 270 | comments: data.comments 271 | }); 272 | }); 273 | }; 274 | 275 | /** 276 | * 通过商品id查询商品详细 277 | */ 278 | exports.doFindGodDetailByid = function (req, res) { 279 | let godId = parseInt(req.query.godId || 0); 280 | 281 | Goods.findOne({ 282 | godId: godId 283 | }, (err, data) => { 284 | if (err) return res.send({ 285 | status: -1 286 | }); 287 | 288 | res.send({ 289 | status: 1, 290 | god: data 291 | }); 292 | }); 293 | }; 294 | 295 | /** 296 | * 添加商品的评论 297 | */ 298 | exports.doAddGodComment = function (req, res) { 299 | // 通过post请求获得 newsId 300 | const godId = parseInt(req.body.godId || req.query.godId || 0); 301 | // 构建NewsComment 评论对象 302 | const comment = { 303 | username: req.body.username, 304 | comDate: new Date(), 305 | content: xss(req.body.content) 306 | }; 307 | 308 | // 添加评论, 添加的数据通过 xss 过滤 309 | GoodsComment.addComment(godId, comment, (err, data) => { 310 | if (err || data.n < 1) return res.send({ 311 | status: -1 312 | }); 313 | 314 | // 发送 JSON 数据 315 | res.send({ 316 | status: 1 317 | }); 318 | }); 319 | }; 320 | 321 | // ------------------ 商品模块结束 ------------------ 322 | 323 | // 测试商品的添加和查找 324 | // new Goods({ 325 | // name: '华为HONOR荣耀8X', 326 | // oldPrice: 1299, 327 | // newPrice: 1299, 328 | // intro: '【64GB限时优惠100元】华为HONOR荣耀8X全面大屏幕指纹解锁智能游戏青春学生新手机老年人电话机官方网旗舰店', 329 | // quantity: 30, 330 | // godNum: '2018011606104531', 331 | // imgIntro: [ 332 | // 'https://img.alicdn.com/imgextra/i1/1114511827/O1CN01M8FYpg1PMo7OOgYJi_!!1114511827.jpg', 333 | // 'https://img.alicdn.com/imgextra/i4/1114511827/O1CN01veIT5X1PMo7NFBvRI_!!1114511827.jpg', 334 | // 'https://img.alicdn.com/imgextra/i3/1114511827/O1CN01zaLP3P1PMo7P12Wta_!!1114511827.jpg', 335 | // 'https://img.alicdn.com/imgextra/i2/1114511827/O1CN01V8FXWq1PMo7MUptf1_!!1114511827.jpg' 336 | // ] 337 | // }).save((err, data) => { 338 | // if (err) return console.log(err); 339 | 340 | // console.log(data); 341 | // }); 342 | // new Goods({ 343 | // name: 'Meizu/魅族 16th', 344 | // oldPrice: 2499, 345 | // newPrice: 2299, 346 | // intro: 'Meizu/魅族 16th骁龙845 超窄边框全面屏 屏下指纹解锁 双摄拍照旗舰手机', 347 | // quantity: 20, 348 | // godNum: '2018011606090990', 349 | // imgIntro: [ 350 | // 'https://img.alicdn.com/imgextra/i1/1695308781/O1CN012EjkKRqY01dBJlq_!!1695308781.jpg', 351 | // 'https://img.alicdn.com/imgextra/i4/1114511827/O1CN01veIT5X1PMo7NFBvRI_!!1114511827.jpg', 352 | // 'https://img.alicdn.com/imgextra/i1/1695308781/TB2Y6DLJKSSBuNjy0FlXXbBpVXa_!!1695308781.jpg', 353 | // 'https://img.alicdn.com/imgextra/i2/1695308781/TB2f9SzByOYBuNjSsD4XXbSkFXa_!!1695308781.jpg', 354 | // ] 355 | // }).save((err, data) => { 356 | // if (err) return console.log(err); 357 | 358 | // console.log(data); 359 | // }); 360 | // new Goods({ 361 | // name: 'Xiaomi/小米9', 362 | // oldPrice: 3999, 363 | // newPrice: 3988, 364 | // intro: '小米无线快充Xiaomi/小米9全面屏新品手机官方旗舰店mix3骁龙855', 365 | // quantity: 89, 366 | // godNum: '2018011606140619', 367 | // imgIntro: [ 368 | // 'https://img.alicdn.com/imgextra/i1/263726286/O1CN01w4svnC1wJ2AUMO0Ds_!!263726286.jpg', 369 | // 'https://img.alicdn.com/imgextra/i1/263726286/O1CN01w4svnC1wJ2AUMO0Ds_!!263726286.jpg', 370 | // 'https://img.alicdn.com/imgextra/i1/263726286/O1CN01w4svnC1wJ2AUMO0Ds_!!263726286.jpg', 371 | // 'https://img.alicdn.com/imgextra/i1/263726286/O1CN01w4svnC1wJ2AUMO0Ds_!!263726286.jpg', 372 | // ] 373 | // }).save((err, data) => { 374 | // if (err) return console.log(err); 375 | 376 | // console.log(data); 377 | // }); 378 | 379 | // GoodsComment.addComment(0, { 380 | // username: '匿名', 381 | // content: '沙发222' 382 | // }, (err, data) => { 383 | 384 | // if (err) return console.log(err); 385 | 386 | // console.log(data); 387 | // }); 388 | -------------------------------------------------------------------------------- /src/util/db.js: -------------------------------------------------------------------------------- 1 | // 完成 mongoodb 的连接,并向外暴露一个连接成功的对象 2 | const mongoose = require('mongoose'); 3 | const config = require('../config.js'); 4 | 5 | // 连接数据库 6 | const db = mongoose.createConnection(config.url, { 7 | useNewUrlParser: true, 8 | autoIndex: true 9 | }); 10 | 11 | // 向外暴露数据库连接对象 12 | module.exports = db; -------------------------------------------------------------------------------- /总体设计.md: -------------------------------------------------------------------------------- 1 | # 项目总体设计模型 2 | 3 | [toc] 4 | 5 | ## 新闻资讯 6 | 7 | 1. 按照新闻资讯分类展示所有的新闻(包括标题、图片),默认展示全部的新闻资讯,新闻默认按照时间先后顺序排列 8 | 9 | 2. 点击新闻可以展开新闻详细,还可以添加自己的评论,评论太多了可以分页加载 10 | 11 | ## 图片分享 12 | 13 | 1. 按照图片类型展示所有的图片(包括标题和第一张图片),默认展示所有的图片,并按照时间顺序先后排列。图片加载使用懒加载技术。 14 | 2. 点击图进入图片详细,图片详细内部展示图片组内所有图片,点击图片可以预览,下方还可以评论和分页加载评论 15 | 16 | ## 商品购买 17 | 18 | 1. 按照时间先后顺序展示所有的商品信息,商品过多可以分页加载 19 | 2. 每个商品包含商品名、原价、现价、库存、介绍、多张商品图片 20 | 3. 点击商品图片可以查看商品详细 21 | 4. 商品详细包括商品参数(商品编号、库存、上架日期),商品详细页可以添加商品到购物车(商品数量受商品库存限制) 22 | 5. 商品详细可以查询商品图文介绍以及商品评论 23 | 24 | ## 留言反馈 25 | 26 | ## 视频专区 27 | 28 | ## 联系我们 -------------------------------------------------------------------------------- /数据字典.md: -------------------------------------------------------------------------------- 1 | # Vue移动端项目数据字典 2 | 3 | [toc] 4 | 5 | ## 封面 cover 6 | 7 | ````javascript 8 | { 9 | imgs: [String] 10 | } 11 | ```` 12 | 13 | ## 新闻资讯 news 14 | 15 | 1. 新闻内容 news 16 | 17 | ````javascript 18 | { 19 | // 发布的时间,精确到秒 20 | add_time: Date, 21 | // 访问的次数 22 | clicked: Number, 23 | // Id 唯一标识,索引自增 24 | id: Number, 25 | // 封面图片地址 26 | img_url: String, 27 | // 标题 28 | title: String, 29 | // 摘要 30 | summary: String 31 | // 内容 32 | content: String 33 | } 34 | ```` 35 | 36 | 2. 新闻评论 newscomment 37 | 38 | ````javascript 39 | { 40 | // 一个newsId 对应一组评论 41 | newsId: Number, 42 | comments:[ 43 | { 44 | // 评论Id 唯一标识,索引自增 45 | commId: Number, 46 | // 用户名 47 | username: String, 48 | // 评论日期,精确到秒 49 | comDate: Date, 50 | // 评论内容 51 | content: String, 52 | } 53 | ], 54 | ... 55 | } 56 | ```` 57 | 58 | ## 图片分享 photo 59 | 60 | 1. 图片内容 61 | 62 | ````javascript 63 | { 64 | // 图片分享的id号码 65 | phoId: Number, 66 | // 多个图片的url地址 67 | phos: [ 68 | String 69 | ], 70 | // 图片的介绍 71 | intro: String, 72 | // 图片的类型 73 | type: String 74 | } 75 | ```` 76 | 77 | 2. 图片评论 photocomment 78 | 79 | ````javascript 80 | { 81 | // 一个phoId 对应一组评论 82 | phoId: Number, 83 | comments:[ 84 | { 85 | // 评论Id 唯一标识,索引自增 86 | comId: Number, 87 | // 用户名 88 | username: String, 89 | // 评论日期,精确到秒 90 | comDate: Date, 91 | // 评论内容 92 | content: String, 93 | } 94 | ] 95 | } 96 | ```` 97 | 98 | ## 商品 goods 99 | 100 | ````javascript 101 | // 商品信息 102 | { 103 | // 商品的id号码 104 | godId: Number, 105 | // 商品的名称 106 | name: '商品名称', 107 | // 商品的原价 108 | oldPrice: Number, 109 | // 商品的现价 110 | newPrice: Number, 111 | // 商品的文字介绍 112 | intro: '商品介绍', 113 | // 商品的库存 114 | quantity: Number, 115 | // 商品的编号 116 | godNum: String, 117 | // 商品的添加日期 118 | addDate: Date, 119 | // 商品的图片介绍 120 | phos: ['商品的图片介绍], 121 | // 商品的图文介绍的多个图片地址 122 | imgIntro: ['商品的图文介绍地址'] 123 | } 124 | ```` 125 | 126 | ## 商品评论 goodscomment 127 | 128 | ````javascript 129 | // 商品评论 130 | { 131 | // 一个商品对于多个评论 132 | godId: Number, 133 | comments: [ 134 | { 135 | // 评论的id号码 136 | comId: Number, 137 | // 评论的用户名 138 | username: String, 139 | // 评论的日期 140 | comDate: Date, 141 | // 评论的内容 142 | content: String 143 | } 144 | ] 145 | } 146 | 147 | ```` --------------------------------------------------------------------------------