├── .gitattributes
├── .gitignore
├── README.md
├── app.js
├── config
├── config.js(自行配置)
└── mongoose.js
├── model
├── message.server.module.js
├── room.server.module.js
├── roomUserList.server.module.js
└── user.server.module.js
├── package-lock.json
├── package.json
├── routes
├── api
│ ├── creatRoom.js
│ ├── forget.js
│ ├── getRoomList.js
│ ├── login.js
│ ├── register.js
│ └── reset.js
├── index.js
├── login.js
├── room.js
├── router.js
└── utils
│ ├── mail.js
│ └── utils.js
├── views
├── common
│ ├── allPopupWrap.html
│ ├── footer.html
│ ├── header.html
│ ├── loading.html
│ ├── messageBox.html
│ └── popup.html
├── error
│ └── error.html
├── index.html
├── login.html
└── room.html
└── www
├── css
├── index.css
├── login.css
├── mint.css
├── reset.css
└── room.css
├── font
├── iconfont.css
├── iconfont.eot
├── iconfont.js
├── iconfont.svg
├── iconfont.ttf
└── iconfont.woff
├── img
├── index.PNG
├── login.PNG
└── room.PNG
├── js
├── index.js
├── login.js
└── room.js
├── server.js
└── utils
├── mint.js
├── utils.js
└── vue.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 | *.svn
17 | /node_modules/
18 |
19 | # Windows shortcuts
20 | *.lnk
21 |
22 | # =========================
23 | # Operating System Files
24 | # =========================
25 |
26 | # OSX
27 | # =========================
28 |
29 | .DS_Store
30 | .AppleDouble
31 | .LSOverride
32 |
33 | # Thumbnails
34 | ._*
35 |
36 | # Files that might appear in the root of a volume
37 | .DocumentRevisions-V100
38 | .fseventsd
39 | .Spotlight-V100
40 | .TemporaryItems
41 | .Trashes
42 | .VolumeIcon.icns
43 |
44 | # Directories potentially created on remote AFP share
45 | .AppleDB
46 | .AppleDesktop
47 | Network Trash Folder
48 | Temporary Items
49 | .apdisk
50 |
51 | #配置文件
52 | config/config.js
53 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # minya-chat
2 | 一个简单的聊天室页面
3 |
4 | 线上地址https://chat.ziyiu.com?source=github
5 | 1.支持创建聊天室,可多个聊天室共存
6 | 2.需要注册登录(以便之后扩展用户系统)
7 | 3.默认端口设置的8083,可以在config/config.js文件修改port
8 | 4.入口文件修改为www/server.js,启动命令npm start
9 | 5.测试请用多个浏览器(设备)进行
10 |
11 | ## 测试账号
12 | > ceshi@ziyiu.com 123456
13 | > 123456789@ziyiu.com 123456
14 |
15 | 喜欢请给个star吧~~~
16 | 界面截图
17 | 
18 | 
19 | 
20 |
21 | ##已知BUG
22 | * 小米浏览器不能正确监听websocket退出事件
23 | * 开启了服务器只允许指定IP访问指定端口,数据库连接不稳定(通过代码服务器请求数据库没问题,数据库不稳定是因为采用Robo 3T数据库可视化工具访问才不稳定,暂不解决)
24 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var path = require('path');
3 | var favicon = require('serve-favicon');
4 | //var logger = require('morgan');
5 | var cookieParser = require('cookie-parser');
6 | var bodyParser = require('body-parser');
7 | var app = express();
8 |
9 | // view engine setup
10 | app.set('views', path.join(__dirname, 'views'));
11 | // app.set('view engine', 'ejs');
12 | app.engine('.html', require('ejs').__express);
13 | app.set('view engine', 'html');
14 |
15 | // uncomment after placing your favicon in /public
16 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
17 | //app.use(logger('dev'));
18 | app.use(bodyParser.json());
19 | app.use(bodyParser.urlencoded({
20 | extended: false
21 | }));
22 | app.use(cookieParser());
23 |
24 | require('./routes/router')(app, express, path);
25 |
26 | module.exports = app;
--------------------------------------------------------------------------------
/config/config.js(自行配置):
--------------------------------------------------------------------------------
1 | 'use strict';
2 | /**
3 | * config
4 | */
5 | module.exports = {
6 | mongodb: "mongodb://UserName:Password@IP:PORT/dbName",
7 | port: 8083,
8 | MAIL: {
9 | service: '163',
10 | secureConnection: true,
11 | port: 465,
12 | auth: {
13 | user: '******',
14 | pass: '******'
15 | }
16 | },
17 | }
--------------------------------------------------------------------------------
/config/mongoose.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose'); //引入mongoose模块
2 | var config = require('./config.js'); //引入配置文件
3 | var db = mongoose.connect(config.mongodb);
4 | db.connection.on('error', function(error) {
5 | console.log('数据库连接失败:' + error);
6 | });
7 | db.connection.on('open', function() {
8 | console.log('——数据库连接成功!——');
9 | });
10 |
11 | module.exports = db;
--------------------------------------------------------------------------------
/model/message.server.module.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | mongoose.Promise = require('bluebird');
3 | var db = require('../config/mongoose.js');
4 |
5 | //申明一个mongoons对象
6 | var MessageRecordSchema = new mongoose.Schema({
7 | type: Number,
8 | userName: String,
9 | time: {
10 | type: Date,
11 | default: new Date()
12 | },
13 | roomName: String,
14 | roomId: String,
15 | message: String
16 | })
17 |
18 | mongoose.model('MessageRecord', MessageRecordSchema, "MessageRecord");
--------------------------------------------------------------------------------
/model/room.server.module.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | mongoose.Promise = require('bluebird');
3 | var db = require('../config/mongoose.js');
4 |
5 | //申明一个mongoons对象
6 | var RoomListSchema = new mongoose.Schema({
7 | uid: String,
8 | userName: String,
9 | time: {
10 | type: Date,
11 | default: new Date()
12 | },
13 | roomName: String,
14 | roomDetail: String,
15 | roomId: String,
16 | userNum: {
17 | type: Number,
18 | default: 0
19 | }
20 | })
21 |
22 | mongoose.model('RoomList', RoomListSchema, "RoomList");
--------------------------------------------------------------------------------
/model/roomUserList.server.module.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | mongoose.Promise = require('bluebird');
3 | var db = require('../config/mongoose.js');
4 |
5 | //申明一个mongoons对象
6 | var RoomUserListSchema = new mongoose.Schema({
7 | roomId: String,
8 | roomUserList: [],
9 | //uid: String,
10 | //userName: String,
11 | //addTime: Date,
12 | })
13 |
14 | mongoose.model('RoomUserList', RoomUserListSchema, "RoomUserList");
--------------------------------------------------------------------------------
/model/user.server.module.js:
--------------------------------------------------------------------------------
1 | var mongoose = require('mongoose');
2 | mongoose.Promise = require('bluebird');
3 | var db = require('../config/mongoose.js');
4 |
5 | //申明一个mongoons对象
6 | var UserSchema = new mongoose.Schema({
7 | userName: String,
8 | email: String,
9 | password: String,
10 | uid: String,
11 | time: {
12 | type: Date,
13 | default: new Date()
14 | }
15 | })
16 |
17 | mongoose.model('User', UserSchema, "User");
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-demo",
3 | "version": "0.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "accepts": {
8 | "version": "1.3.4",
9 | "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.4.tgz",
10 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=",
11 | "requires": {
12 | "mime-types": "2.1.17",
13 | "negotiator": "0.6.1"
14 | }
15 | },
16 | "after": {
17 | "version": "0.8.2",
18 | "resolved": "http://registry.npm.taobao.org/after/download/after-0.8.2.tgz",
19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
20 | },
21 | "array-flatten": {
22 | "version": "1.1.1",
23 | "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz",
24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
25 | },
26 | "arraybuffer.slice": {
27 | "version": "0.0.6",
28 | "resolved": "http://registry.npm.taobao.org/arraybuffer.slice/download/arraybuffer.slice-0.0.6.tgz",
29 | "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco="
30 | },
31 | "async": {
32 | "version": "2.1.4",
33 | "resolved": "http://registry.npm.taobao.org/async/download/async-2.1.4.tgz",
34 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=",
35 | "requires": {
36 | "lodash": "4.17.4"
37 | }
38 | },
39 | "backo2": {
40 | "version": "1.0.2",
41 | "resolved": "http://registry.npm.taobao.org/backo2/download/backo2-1.0.2.tgz",
42 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
43 | },
44 | "base64-arraybuffer": {
45 | "version": "0.1.5",
46 | "resolved": "http://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.1.5.tgz",
47 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
48 | },
49 | "base64id": {
50 | "version": "1.0.0",
51 | "resolved": "http://registry.npm.taobao.org/base64id/download/base64id-1.0.0.tgz",
52 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY="
53 | },
54 | "basic-auth": {
55 | "version": "1.0.4",
56 | "resolved": "http://registry.npm.taobao.org/basic-auth/download/basic-auth-1.0.4.tgz",
57 | "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA="
58 | },
59 | "better-assert": {
60 | "version": "1.0.2",
61 | "resolved": "http://registry.npm.taobao.org/better-assert/download/better-assert-1.0.2.tgz",
62 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
63 | "requires": {
64 | "callsite": "1.0.0"
65 | }
66 | },
67 | "blob": {
68 | "version": "0.0.4",
69 | "resolved": "http://registry.npm.taobao.org/blob/download/blob-0.0.4.tgz",
70 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE="
71 | },
72 | "bluebird": {
73 | "version": "3.5.1",
74 | "resolved": "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz",
75 | "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk="
76 | },
77 | "body-parser": {
78 | "version": "1.15.2",
79 | "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.15.2.tgz",
80 | "integrity": "sha1-11eM9PHRHV9uqATO813Hp/9trmc=",
81 | "requires": {
82 | "bytes": "2.4.0",
83 | "content-type": "1.0.4",
84 | "debug": "2.2.0",
85 | "depd": "1.1.1",
86 | "http-errors": "1.5.1",
87 | "iconv-lite": "0.4.13",
88 | "on-finished": "2.3.0",
89 | "qs": "6.2.0",
90 | "raw-body": "2.1.7",
91 | "type-is": "1.6.15"
92 | }
93 | },
94 | "bson": {
95 | "version": "1.0.4",
96 | "resolved": "http://registry.npm.taobao.org/bson/download/bson-1.0.4.tgz",
97 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw="
98 | },
99 | "buffer-shims": {
100 | "version": "1.0.0",
101 | "resolved": "http://registry.npm.taobao.org/buffer-shims/download/buffer-shims-1.0.0.tgz",
102 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
103 | },
104 | "bytes": {
105 | "version": "2.4.0",
106 | "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-2.4.0.tgz",
107 | "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk="
108 | },
109 | "callsite": {
110 | "version": "1.0.0",
111 | "resolved": "http://registry.npm.taobao.org/callsite/download/callsite-1.0.0.tgz",
112 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
113 | },
114 | "component-bind": {
115 | "version": "1.0.0",
116 | "resolved": "http://registry.npm.taobao.org/component-bind/download/component-bind-1.0.0.tgz",
117 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
118 | },
119 | "component-emitter": {
120 | "version": "1.1.2",
121 | "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.1.2.tgz",
122 | "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM="
123 | },
124 | "component-inherit": {
125 | "version": "0.0.3",
126 | "resolved": "http://registry.npm.taobao.org/component-inherit/download/component-inherit-0.0.3.tgz",
127 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
128 | },
129 | "content-disposition": {
130 | "version": "0.5.2",
131 | "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz",
132 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
133 | },
134 | "content-type": {
135 | "version": "1.0.4",
136 | "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
137 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
138 | },
139 | "cookie": {
140 | "version": "0.3.1",
141 | "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz",
142 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
143 | },
144 | "cookie-parser": {
145 | "version": "1.4.3",
146 | "resolved": "http://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.3.tgz",
147 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=",
148 | "requires": {
149 | "cookie": "0.3.1",
150 | "cookie-signature": "1.0.6"
151 | }
152 | },
153 | "cookie-signature": {
154 | "version": "1.0.6",
155 | "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
156 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
157 | },
158 | "core-util-is": {
159 | "version": "1.0.2",
160 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
161 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
162 | },
163 | "debug": {
164 | "version": "2.2.0",
165 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.2.0.tgz",
166 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
167 | "requires": {
168 | "ms": "0.7.1"
169 | }
170 | },
171 | "depd": {
172 | "version": "1.1.1",
173 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz",
174 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
175 | },
176 | "destroy": {
177 | "version": "1.0.4",
178 | "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
179 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
180 | },
181 | "ee-first": {
182 | "version": "1.1.1",
183 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
184 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
185 | },
186 | "ejs": {
187 | "version": "2.5.7",
188 | "resolved": "http://registry.npm.taobao.org/ejs/download/ejs-2.5.7.tgz",
189 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo="
190 | },
191 | "encodeurl": {
192 | "version": "1.0.1",
193 | "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.1.tgz",
194 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA="
195 | },
196 | "engine.io": {
197 | "version": "1.8.4",
198 | "resolved": "http://registry.npm.taobao.org/engine.io/download/engine.io-1.8.4.tgz",
199 | "integrity": "sha1-d7zhK4Dl1gQpM3/sOw2vaR68kAM=",
200 | "requires": {
201 | "accepts": "1.3.3",
202 | "base64id": "1.0.0",
203 | "cookie": "0.3.1",
204 | "debug": "2.3.3",
205 | "engine.io-parser": "1.3.2",
206 | "ws": "1.1.4"
207 | },
208 | "dependencies": {
209 | "accepts": {
210 | "version": "1.3.3",
211 | "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.3.tgz",
212 | "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
213 | "requires": {
214 | "mime-types": "2.1.17",
215 | "negotiator": "0.6.1"
216 | }
217 | },
218 | "debug": {
219 | "version": "2.3.3",
220 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz",
221 | "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
222 | "requires": {
223 | "ms": "0.7.2"
224 | }
225 | },
226 | "ms": {
227 | "version": "0.7.2",
228 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
229 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
230 | }
231 | }
232 | },
233 | "engine.io-client": {
234 | "version": "1.8.4",
235 | "resolved": "http://registry.npm.taobao.org/engine.io-client/download/engine.io-client-1.8.4.tgz",
236 | "integrity": "sha1-n+hd7iWFPKa6viW9KtaHEIY+kcI=",
237 | "requires": {
238 | "component-emitter": "1.2.1",
239 | "component-inherit": "0.0.3",
240 | "debug": "2.3.3",
241 | "engine.io-parser": "1.3.2",
242 | "has-cors": "1.1.0",
243 | "indexof": "0.0.1",
244 | "parsejson": "0.0.3",
245 | "parseqs": "0.0.5",
246 | "parseuri": "0.0.5",
247 | "ws": "1.1.2",
248 | "xmlhttprequest-ssl": "1.5.3",
249 | "yeast": "0.1.2"
250 | },
251 | "dependencies": {
252 | "component-emitter": {
253 | "version": "1.2.1",
254 | "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
255 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
256 | },
257 | "debug": {
258 | "version": "2.3.3",
259 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz",
260 | "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
261 | "requires": {
262 | "ms": "0.7.2"
263 | }
264 | },
265 | "ms": {
266 | "version": "0.7.2",
267 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
268 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
269 | },
270 | "ws": {
271 | "version": "1.1.2",
272 | "resolved": "http://registry.npm.taobao.org/ws/download/ws-1.1.2.tgz",
273 | "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
274 | "requires": {
275 | "options": "0.0.6",
276 | "ultron": "1.0.2"
277 | }
278 | }
279 | }
280 | },
281 | "engine.io-parser": {
282 | "version": "1.3.2",
283 | "resolved": "http://registry.npm.taobao.org/engine.io-parser/download/engine.io-parser-1.3.2.tgz",
284 | "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
285 | "requires": {
286 | "after": "0.8.2",
287 | "arraybuffer.slice": "0.0.6",
288 | "base64-arraybuffer": "0.1.5",
289 | "blob": "0.0.4",
290 | "has-binary": "0.1.7",
291 | "wtf-8": "1.0.0"
292 | }
293 | },
294 | "es6-promise": {
295 | "version": "3.2.1",
296 | "resolved": "http://registry.npm.taobao.org/es6-promise/download/es6-promise-3.2.1.tgz",
297 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q="
298 | },
299 | "escape-html": {
300 | "version": "1.0.3",
301 | "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
302 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
303 | },
304 | "etag": {
305 | "version": "1.7.0",
306 | "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.7.0.tgz",
307 | "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg="
308 | },
309 | "express": {
310 | "version": "4.14.1",
311 | "resolved": "http://registry.npm.taobao.org/express/download/express-4.14.1.tgz",
312 | "integrity": "sha1-ZGwjf3ZvFIwhIK/wc4F7nk1+DTM=",
313 | "requires": {
314 | "accepts": "1.3.4",
315 | "array-flatten": "1.1.1",
316 | "content-disposition": "0.5.2",
317 | "content-type": "1.0.4",
318 | "cookie": "0.3.1",
319 | "cookie-signature": "1.0.6",
320 | "debug": "2.2.0",
321 | "depd": "1.1.1",
322 | "encodeurl": "1.0.1",
323 | "escape-html": "1.0.3",
324 | "etag": "1.7.0",
325 | "finalhandler": "0.5.1",
326 | "fresh": "0.3.0",
327 | "merge-descriptors": "1.0.1",
328 | "methods": "1.1.2",
329 | "on-finished": "2.3.0",
330 | "parseurl": "1.3.2",
331 | "path-to-regexp": "0.1.7",
332 | "proxy-addr": "1.1.5",
333 | "qs": "6.2.0",
334 | "range-parser": "1.2.0",
335 | "send": "0.14.2",
336 | "serve-static": "1.11.2",
337 | "type-is": "1.6.15",
338 | "utils-merge": "1.0.0",
339 | "vary": "1.1.2"
340 | }
341 | },
342 | "finalhandler": {
343 | "version": "0.5.1",
344 | "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-0.5.1.tgz",
345 | "integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=",
346 | "requires": {
347 | "debug": "2.2.0",
348 | "escape-html": "1.0.3",
349 | "on-finished": "2.3.0",
350 | "statuses": "1.3.1",
351 | "unpipe": "1.0.0"
352 | },
353 | "dependencies": {
354 | "statuses": {
355 | "version": "1.3.1",
356 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
357 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
358 | }
359 | }
360 | },
361 | "forwarded": {
362 | "version": "0.1.2",
363 | "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
364 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
365 | },
366 | "fresh": {
367 | "version": "0.3.0",
368 | "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.3.0.tgz",
369 | "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8="
370 | },
371 | "has-binary": {
372 | "version": "0.1.7",
373 | "resolved": "http://registry.npm.taobao.org/has-binary/download/has-binary-0.1.7.tgz",
374 | "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
375 | "requires": {
376 | "isarray": "0.0.1"
377 | },
378 | "dependencies": {
379 | "isarray": {
380 | "version": "0.0.1",
381 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
382 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
383 | }
384 | }
385 | },
386 | "has-cors": {
387 | "version": "1.1.0",
388 | "resolved": "http://registry.npm.taobao.org/has-cors/download/has-cors-1.1.0.tgz",
389 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
390 | },
391 | "hooks-fixed": {
392 | "version": "2.0.2",
393 | "resolved": "http://registry.npm.taobao.org/hooks-fixed/download/hooks-fixed-2.0.2.tgz",
394 | "integrity": "sha1-IAdtqgfnfYphBog84/FyLgURQLA="
395 | },
396 | "http-errors": {
397 | "version": "1.5.1",
398 | "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.5.1.tgz",
399 | "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
400 | "requires": {
401 | "inherits": "2.0.3",
402 | "setprototypeof": "1.0.2",
403 | "statuses": "1.4.0"
404 | }
405 | },
406 | "iconv-lite": {
407 | "version": "0.4.13",
408 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.13.tgz",
409 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI="
410 | },
411 | "indexof": {
412 | "version": "0.0.1",
413 | "resolved": "http://registry.npm.taobao.org/indexof/download/indexof-0.0.1.tgz",
414 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
415 | },
416 | "inherits": {
417 | "version": "2.0.3",
418 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
419 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
420 | },
421 | "ipaddr.js": {
422 | "version": "1.4.0",
423 | "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.4.0.tgz",
424 | "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA="
425 | },
426 | "isarray": {
427 | "version": "1.0.0",
428 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
429 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
430 | },
431 | "json3": {
432 | "version": "3.3.2",
433 | "resolved": "http://registry.npm.taobao.org/json3/download/json3-3.3.2.tgz",
434 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
435 | },
436 | "kareem": {
437 | "version": "1.5.0",
438 | "resolved": "http://registry.npm.taobao.org/kareem/download/kareem-1.5.0.tgz",
439 | "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg="
440 | },
441 | "lodash": {
442 | "version": "4.17.4",
443 | "resolved": "http://registry.npm.taobao.org/lodash/download/lodash-4.17.4.tgz",
444 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
445 | },
446 | "lodash.get": {
447 | "version": "4.4.2",
448 | "resolved": "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz",
449 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
450 | },
451 | "media-typer": {
452 | "version": "0.3.0",
453 | "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
454 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
455 | },
456 | "merge-descriptors": {
457 | "version": "1.0.1",
458 | "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
459 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
460 | },
461 | "methods": {
462 | "version": "1.1.2",
463 | "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
464 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
465 | },
466 | "mime": {
467 | "version": "1.3.4",
468 | "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.3.4.tgz",
469 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
470 | },
471 | "mime-db": {
472 | "version": "1.30.0",
473 | "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz",
474 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE="
475 | },
476 | "mime-types": {
477 | "version": "2.1.17",
478 | "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz",
479 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
480 | "requires": {
481 | "mime-db": "1.30.0"
482 | }
483 | },
484 | "moment": {
485 | "version": "2.19.1",
486 | "resolved": "http://registry.npm.taobao.org/moment/download/moment-2.19.1.tgz",
487 | "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc="
488 | },
489 | "mongodb": {
490 | "version": "2.2.33",
491 | "resolved": "http://registry.npm.taobao.org/mongodb/download/mongodb-2.2.33.tgz",
492 | "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=",
493 | "requires": {
494 | "es6-promise": "3.2.1",
495 | "mongodb-core": "2.1.17",
496 | "readable-stream": "2.2.7"
497 | }
498 | },
499 | "mongodb-core": {
500 | "version": "2.1.17",
501 | "resolved": "http://registry.npm.taobao.org/mongodb-core/download/mongodb-core-2.1.17.tgz",
502 | "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=",
503 | "requires": {
504 | "bson": "1.0.4",
505 | "require_optional": "1.0.1"
506 | }
507 | },
508 | "mongoose": {
509 | "version": "4.13.0",
510 | "resolved": "http://registry.npm.taobao.org/mongoose/download/mongoose-4.13.0.tgz",
511 | "integrity": "sha1-gbsmbgRdZqyN/dhPxnSchz16asQ=",
512 | "requires": {
513 | "async": "2.1.4",
514 | "bson": "1.0.4",
515 | "hooks-fixed": "2.0.2",
516 | "kareem": "1.5.0",
517 | "lodash.get": "4.4.2",
518 | "mongodb": "2.2.33",
519 | "mpath": "0.3.0",
520 | "mpromise": "0.5.5",
521 | "mquery": "2.3.2",
522 | "ms": "2.0.0",
523 | "muri": "1.3.0",
524 | "regexp-clone": "0.0.1",
525 | "sliced": "1.0.1"
526 | },
527 | "dependencies": {
528 | "ms": {
529 | "version": "2.0.0",
530 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
531 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
532 | }
533 | }
534 | },
535 | "morgan": {
536 | "version": "1.7.0",
537 | "resolved": "http://registry.npm.taobao.org/morgan/download/morgan-1.7.0.tgz",
538 | "integrity": "sha1-6xDKjlDRq+D409rVwCAdBS2YHGI=",
539 | "requires": {
540 | "basic-auth": "1.0.4",
541 | "debug": "2.2.0",
542 | "depd": "1.1.1",
543 | "on-finished": "2.3.0",
544 | "on-headers": "1.0.1"
545 | }
546 | },
547 | "mpath": {
548 | "version": "0.3.0",
549 | "resolved": "http://registry.npm.taobao.org/mpath/download/mpath-0.3.0.tgz",
550 | "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q="
551 | },
552 | "mpromise": {
553 | "version": "0.5.5",
554 | "resolved": "http://registry.npm.taobao.org/mpromise/download/mpromise-0.5.5.tgz",
555 | "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY="
556 | },
557 | "mquery": {
558 | "version": "2.3.2",
559 | "resolved": "http://registry.npm.taobao.org/mquery/download/mquery-2.3.2.tgz",
560 | "integrity": "sha1-4sYK0RfPCA8u+x7N0UTnu/+/yhE=",
561 | "requires": {
562 | "bluebird": "3.5.1",
563 | "debug": "2.6.9",
564 | "regexp-clone": "0.0.1",
565 | "sliced": "0.0.5"
566 | },
567 | "dependencies": {
568 | "debug": {
569 | "version": "2.6.9",
570 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz",
571 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
572 | "requires": {
573 | "ms": "2.0.0"
574 | }
575 | },
576 | "ms": {
577 | "version": "2.0.0",
578 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
579 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
580 | },
581 | "sliced": {
582 | "version": "0.0.5",
583 | "resolved": "http://registry.npm.taobao.org/sliced/download/sliced-0.0.5.tgz",
584 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8="
585 | }
586 | }
587 | },
588 | "ms": {
589 | "version": "0.7.1",
590 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.1.tgz",
591 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg="
592 | },
593 | "muri": {
594 | "version": "1.3.0",
595 | "resolved": "http://registry.npm.taobao.org/muri/download/muri-1.3.0.tgz",
596 | "integrity": "sha1-rszz22TFaqfFs04A+Vt4eFJ6RyE="
597 | },
598 | "negotiator": {
599 | "version": "0.6.1",
600 | "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz",
601 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
602 | },
603 | "nodemailer": {
604 | "version": "4.3.1",
605 | "resolved": "http://registry.npm.taobao.org/nodemailer/download/nodemailer-4.3.1.tgz",
606 | "integrity": "sha1-QOFi9UGTui/syiANVE6PbBEG1pQ="
607 | },
608 | "object-assign": {
609 | "version": "4.1.0",
610 | "resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.0.tgz",
611 | "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A="
612 | },
613 | "object-component": {
614 | "version": "0.0.3",
615 | "resolved": "http://registry.npm.taobao.org/object-component/download/object-component-0.0.3.tgz",
616 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
617 | },
618 | "on-finished": {
619 | "version": "2.3.0",
620 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
621 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
622 | "requires": {
623 | "ee-first": "1.1.1"
624 | }
625 | },
626 | "on-headers": {
627 | "version": "1.0.1",
628 | "resolved": "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz",
629 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
630 | },
631 | "options": {
632 | "version": "0.0.6",
633 | "resolved": "http://registry.npm.taobao.org/options/download/options-0.0.6.tgz",
634 | "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
635 | },
636 | "parsejson": {
637 | "version": "0.0.3",
638 | "resolved": "http://registry.npm.taobao.org/parsejson/download/parsejson-0.0.3.tgz",
639 | "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
640 | "requires": {
641 | "better-assert": "1.0.2"
642 | }
643 | },
644 | "parseqs": {
645 | "version": "0.0.5",
646 | "resolved": "http://registry.npm.taobao.org/parseqs/download/parseqs-0.0.5.tgz",
647 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
648 | "requires": {
649 | "better-assert": "1.0.2"
650 | }
651 | },
652 | "parseuri": {
653 | "version": "0.0.5",
654 | "resolved": "http://registry.npm.taobao.org/parseuri/download/parseuri-0.0.5.tgz",
655 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
656 | "requires": {
657 | "better-assert": "1.0.2"
658 | }
659 | },
660 | "parseurl": {
661 | "version": "1.3.2",
662 | "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz",
663 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
664 | },
665 | "path-to-regexp": {
666 | "version": "0.1.7",
667 | "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz",
668 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
669 | },
670 | "process-nextick-args": {
671 | "version": "1.0.7",
672 | "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz",
673 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
674 | },
675 | "proxy-addr": {
676 | "version": "1.1.5",
677 | "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-1.1.5.tgz",
678 | "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=",
679 | "requires": {
680 | "forwarded": "0.1.2",
681 | "ipaddr.js": "1.4.0"
682 | }
683 | },
684 | "qs": {
685 | "version": "6.2.0",
686 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.2.0.tgz",
687 | "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs="
688 | },
689 | "range-parser": {
690 | "version": "1.2.0",
691 | "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz",
692 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
693 | },
694 | "raw-body": {
695 | "version": "2.1.7",
696 | "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.1.7.tgz",
697 | "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=",
698 | "requires": {
699 | "bytes": "2.4.0",
700 | "iconv-lite": "0.4.13",
701 | "unpipe": "1.0.0"
702 | }
703 | },
704 | "readable-stream": {
705 | "version": "2.2.7",
706 | "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.2.7.tgz",
707 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
708 | "requires": {
709 | "buffer-shims": "1.0.0",
710 | "core-util-is": "1.0.2",
711 | "inherits": "2.0.3",
712 | "isarray": "1.0.0",
713 | "process-nextick-args": "1.0.7",
714 | "string_decoder": "1.0.3",
715 | "util-deprecate": "1.0.2"
716 | }
717 | },
718 | "regexp-clone": {
719 | "version": "0.0.1",
720 | "resolved": "http://registry.npm.taobao.org/regexp-clone/download/regexp-clone-0.0.1.tgz",
721 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk="
722 | },
723 | "require_optional": {
724 | "version": "1.0.1",
725 | "resolved": "http://registry.npm.taobao.org/require_optional/download/require_optional-1.0.1.tgz",
726 | "integrity": "sha1-TPNaQkf2TKPfjC7yCMxJSxyo/C4=",
727 | "requires": {
728 | "resolve-from": "2.0.0",
729 | "semver": "5.4.1"
730 | }
731 | },
732 | "resolve-from": {
733 | "version": "2.0.0",
734 | "resolved": "http://registry.npm.taobao.org/resolve-from/download/resolve-from-2.0.0.tgz",
735 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
736 | },
737 | "safe-buffer": {
738 | "version": "5.1.1",
739 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz",
740 | "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM="
741 | },
742 | "semver": {
743 | "version": "5.4.1",
744 | "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.4.1.tgz",
745 | "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4="
746 | },
747 | "send": {
748 | "version": "0.14.2",
749 | "resolved": "http://registry.npm.taobao.org/send/download/send-0.14.2.tgz",
750 | "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
751 | "requires": {
752 | "debug": "2.2.0",
753 | "depd": "1.1.1",
754 | "destroy": "1.0.4",
755 | "encodeurl": "1.0.1",
756 | "escape-html": "1.0.3",
757 | "etag": "1.7.0",
758 | "fresh": "0.3.0",
759 | "http-errors": "1.5.1",
760 | "mime": "1.3.4",
761 | "ms": "0.7.2",
762 | "on-finished": "2.3.0",
763 | "range-parser": "1.2.0",
764 | "statuses": "1.3.1"
765 | },
766 | "dependencies": {
767 | "ms": {
768 | "version": "0.7.2",
769 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
770 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
771 | },
772 | "statuses": {
773 | "version": "1.3.1",
774 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.3.1.tgz",
775 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
776 | }
777 | }
778 | },
779 | "serve-favicon": {
780 | "version": "2.3.2",
781 | "resolved": "http://registry.npm.taobao.org/serve-favicon/download/serve-favicon-2.3.2.tgz",
782 | "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=",
783 | "requires": {
784 | "etag": "1.7.0",
785 | "fresh": "0.3.0",
786 | "ms": "0.7.2",
787 | "parseurl": "1.3.2"
788 | },
789 | "dependencies": {
790 | "ms": {
791 | "version": "0.7.2",
792 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
793 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
794 | }
795 | }
796 | },
797 | "serve-static": {
798 | "version": "1.11.2",
799 | "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.11.2.tgz",
800 | "integrity": "sha1-LPmIm9RDWjIMw2iVyapXvWYuasc=",
801 | "requires": {
802 | "encodeurl": "1.0.1",
803 | "escape-html": "1.0.3",
804 | "parseurl": "1.3.2",
805 | "send": "0.14.2"
806 | }
807 | },
808 | "setprototypeof": {
809 | "version": "1.0.2",
810 | "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.2.tgz",
811 | "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg="
812 | },
813 | "sliced": {
814 | "version": "1.0.1",
815 | "resolved": "http://registry.npm.taobao.org/sliced/download/sliced-1.0.1.tgz",
816 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
817 | },
818 | "socket.io": {
819 | "version": "1.7.4",
820 | "resolved": "http://registry.npm.taobao.org/socket.io/download/socket.io-1.7.4.tgz",
821 | "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=",
822 | "requires": {
823 | "debug": "2.3.3",
824 | "engine.io": "1.8.4",
825 | "has-binary": "0.1.7",
826 | "object-assign": "4.1.0",
827 | "socket.io-adapter": "0.5.0",
828 | "socket.io-client": "1.7.4",
829 | "socket.io-parser": "2.3.1"
830 | },
831 | "dependencies": {
832 | "debug": {
833 | "version": "2.3.3",
834 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz",
835 | "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
836 | "requires": {
837 | "ms": "0.7.2"
838 | }
839 | },
840 | "ms": {
841 | "version": "0.7.2",
842 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
843 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
844 | }
845 | }
846 | },
847 | "socket.io-adapter": {
848 | "version": "0.5.0",
849 | "resolved": "http://registry.npm.taobao.org/socket.io-adapter/download/socket.io-adapter-0.5.0.tgz",
850 | "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=",
851 | "requires": {
852 | "debug": "2.3.3",
853 | "socket.io-parser": "2.3.1"
854 | },
855 | "dependencies": {
856 | "debug": {
857 | "version": "2.3.3",
858 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz",
859 | "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
860 | "requires": {
861 | "ms": "0.7.2"
862 | }
863 | },
864 | "ms": {
865 | "version": "0.7.2",
866 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
867 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
868 | }
869 | }
870 | },
871 | "socket.io-client": {
872 | "version": "1.7.4",
873 | "resolved": "http://registry.npm.taobao.org/socket.io-client/download/socket.io-client-1.7.4.tgz",
874 | "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=",
875 | "requires": {
876 | "backo2": "1.0.2",
877 | "component-bind": "1.0.0",
878 | "component-emitter": "1.2.1",
879 | "debug": "2.3.3",
880 | "engine.io-client": "1.8.4",
881 | "has-binary": "0.1.7",
882 | "indexof": "0.0.1",
883 | "object-component": "0.0.3",
884 | "parseuri": "0.0.5",
885 | "socket.io-parser": "2.3.1",
886 | "to-array": "0.1.4"
887 | },
888 | "dependencies": {
889 | "component-emitter": {
890 | "version": "1.2.1",
891 | "resolved": "http://registry.npm.taobao.org/component-emitter/download/component-emitter-1.2.1.tgz",
892 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
893 | },
894 | "debug": {
895 | "version": "2.3.3",
896 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.3.3.tgz",
897 | "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
898 | "requires": {
899 | "ms": "0.7.2"
900 | }
901 | },
902 | "ms": {
903 | "version": "0.7.2",
904 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-0.7.2.tgz",
905 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U="
906 | }
907 | }
908 | },
909 | "socket.io-parser": {
910 | "version": "2.3.1",
911 | "resolved": "http://registry.npm.taobao.org/socket.io-parser/download/socket.io-parser-2.3.1.tgz",
912 | "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
913 | "requires": {
914 | "component-emitter": "1.1.2",
915 | "debug": "2.2.0",
916 | "isarray": "0.0.1",
917 | "json3": "3.3.2"
918 | },
919 | "dependencies": {
920 | "isarray": {
921 | "version": "0.0.1",
922 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
923 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
924 | }
925 | }
926 | },
927 | "statuses": {
928 | "version": "1.4.0",
929 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz",
930 | "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic="
931 | },
932 | "string_decoder": {
933 | "version": "1.0.3",
934 | "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz",
935 | "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
936 | "requires": {
937 | "safe-buffer": "5.1.1"
938 | }
939 | },
940 | "to-array": {
941 | "version": "0.1.4",
942 | "resolved": "http://registry.npm.taobao.org/to-array/download/to-array-0.1.4.tgz",
943 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
944 | },
945 | "type-is": {
946 | "version": "1.6.15",
947 | "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.15.tgz",
948 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
949 | "requires": {
950 | "media-typer": "0.3.0",
951 | "mime-types": "2.1.17"
952 | }
953 | },
954 | "ultron": {
955 | "version": "1.0.2",
956 | "resolved": "http://registry.npm.taobao.org/ultron/download/ultron-1.0.2.tgz",
957 | "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
958 | },
959 | "unpipe": {
960 | "version": "1.0.0",
961 | "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
962 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
963 | },
964 | "util-deprecate": {
965 | "version": "1.0.2",
966 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
967 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
968 | },
969 | "utils-merge": {
970 | "version": "1.0.0",
971 | "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.0.tgz",
972 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg="
973 | },
974 | "vary": {
975 | "version": "1.1.2",
976 | "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
977 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
978 | },
979 | "ws": {
980 | "version": "1.1.4",
981 | "resolved": "http://registry.npm.taobao.org/ws/download/ws-1.1.4.tgz",
982 | "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=",
983 | "requires": {
984 | "options": "0.0.6",
985 | "ultron": "1.0.2"
986 | }
987 | },
988 | "wtf-8": {
989 | "version": "1.0.0",
990 | "resolved": "http://registry.npm.taobao.org/wtf-8/download/wtf-8-1.0.0.tgz",
991 | "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo="
992 | },
993 | "xmlhttprequest-ssl": {
994 | "version": "1.5.3",
995 | "resolved": "http://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.3.tgz",
996 | "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0="
997 | },
998 | "yeast": {
999 | "version": "0.1.2",
1000 | "resolved": "http://registry.npm.taobao.org/yeast/download/yeast-0.1.2.tgz",
1001 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
1002 | }
1003 | }
1004 | }
1005 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-demo",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./www/server.js"
7 | },
8 | "dependencies": {
9 | "body-parser": "~1.15.2",
10 | "cookie-parser": "~1.4.3",
11 | "debug": "~2.2.0",
12 | "ejs": "~2.5.2",
13 | "express": "~4.14.0",
14 | "moment": "^2.17.1",
15 | "mongoose": "^4.7.1",
16 | "morgan": "~1.7.0",
17 | "nodemailer": "^4.3.1",
18 | "serve-favicon": "~2.3.0",
19 | "socket.io": "^1.7.2"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/routes/api/creatRoom.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var mongoose = require('mongoose');
4 | var utils = require('../utils/utils.js');
5 | require('../../model/room.server.module.js');
6 | var RoomList = mongoose.model('RoomList');
7 |
8 | require('../../model/roomUserList.server.module.js');
9 | var RoomUserList = mongoose.model('RoomUserList');
10 |
11 | router.get('/creatRoom', function(req, res) {
12 | res.send("请求资源不支持HTTP方法GET访问!");
13 | });
14 |
15 | router.post('/creatRoom', function(req, res) {
16 | RoomList.findOne({
17 | roomName: req.body.roomName
18 | }, function(err, result) {
19 | if (err) {
20 | utils.sendJson(res, 404, err);
21 | } else {
22 | if (result) utils.sendJson(res, 404, '房间名称已占用');
23 | else {
24 | var roomId = utils.creatRandomNum();
25 | roomInsert(roomId);
26 | }
27 | }
28 | })
29 |
30 | var roomInsert = function(roomId) {
31 | var content = {
32 | userName: req.body.userName,
33 | uid: req.body.uid,
34 | roomName: req.body.roomName,
35 | roomDetail: req.body.roomDetail,
36 | roomId: roomId
37 | }
38 | var room = new RoomList(content);
39 | room.save(function(err) {
40 | if (err) {
41 | console.log(err);
42 | } else {
43 | creatRoomUserList(roomId);
44 | }
45 | })
46 | }
47 |
48 | var creatRoomUserList = function(roomId) {
49 | var content = {
50 | roomId: roomId,
51 | roomUserList: []
52 | }
53 | var creatList = new RoomUserList(content);
54 | creatList.save(function(err) {
55 | if (err) {
56 | console.log(err);
57 | } else {
58 | utils.sendJson(res, 200, "创建房间成功", {
59 | roomId: roomId
60 | });
61 | }
62 | })
63 | }
64 | })
65 |
66 | module.exports = router;
--------------------------------------------------------------------------------
/routes/api/forget.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var mongoose = require('mongoose');
4 | var utils = require('../utils/utils.js');
5 | var mail = require('../utils/mail.js');
6 | require('../../model/user.server.module.js');
7 | var User = mongoose.model('User');
8 |
9 | /* GET home page. */
10 | router.get('/forget', function(req, res) {
11 | res.send("请求资源不支持HTTP方法GET访问!");
12 | });
13 |
14 | router.post('/forget', function(req, res) {
15 | User.findOne({
16 | email: req.body.email
17 | }, function(err, result) {
18 | if (err) {
19 | utils.sendJson(res, 404, err);
20 | } else {
21 | if (result) {
22 | if (result.userName == req.body.userName) {
23 | var subject = '恣意游用户重置密码';
24 | var url = req.protocol + "://" + req.get('host') + '/login?uid=' + result.uid;
25 | var html = '
亲爱的用户:
感谢您使用恣意游重置密码功能.
请点击以下链接完成重置功能
'; 26 | html += ''; 27 | mail.sendMail(req.body.email, subject, html, function(result) { 28 | if (result.status == 200) { 29 | utils.sendJson(res, 200, result.message); 30 | } else { 31 | utils.sendJson(res, 404, result.message); 32 | } 33 | }) 34 | } else { 35 | utils.sendJson(res, 404, '邮箱与用户名不一致'); 36 | } 37 | } else { 38 | utils.sendJson(res, 404, '该邮箱地址暂未注册'); 39 | } 40 | } 41 | }) 42 | }); 43 | 44 | module.exports = router; -------------------------------------------------------------------------------- /routes/api/getRoomList.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mongoose = require('mongoose'); 4 | var utils = require('../utils/utils.js'); 5 | require('../../model/room.server.module.js'); 6 | var RoomList = mongoose.model('RoomList'); 7 | 8 | require('../../model/roomUserList.server.module.js'); 9 | var RoomUserList = mongoose.model('RoomUserList'); 10 | 11 | router.get('/getRoomList', function(req, res) { 12 | res.send("请求资源不支持HTTP方法GET访问!"); 13 | }); 14 | 15 | router.post('/getRoomList', function(req, res) { 16 | RoomList.find({}, function(err, result) { 17 | if (err) { 18 | utils.sendJson(res, 404, err); 19 | } else { 20 | if (result) { 21 | getRoomUserNum(result); 22 | } else { 23 | utils.sendJson(res, 404, '暂无房间列表'); 24 | } 25 | } 26 | }) 27 | 28 | var getRoomUserNum = function(data) { 29 | RoomUserList.find({}, function(err, result) { 30 | if (err) { 31 | utils.sendJson(res, 404, err); 32 | } else { 33 | var allUserNum = 0; 34 | for (var i = 0; i < data.length; i++) { 35 | for (var j = 0; j < result.length; j++) { 36 | if (data[i].roomId == result[j].roomId) { 37 | data[i].userNum = result[j].roomUserList.length; 38 | allUserNum += result[j].roomUserList.length; 39 | } 40 | } 41 | } 42 | utils.sendJson(res, 200, allUserNum, data); 43 | } 44 | }) 45 | } 46 | }) 47 | 48 | module.exports = router; -------------------------------------------------------------------------------- /routes/api/login.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mongoose = require('mongoose'); 4 | var utils = require('../utils/utils.js'); 5 | require('../../model/user.server.module.js'); 6 | var User = mongoose.model('User'); 7 | 8 | /* GET home page. */ 9 | router.get('/login', function(req, res) { 10 | res.send("请求资源不支持HTTP方法GET访问!"); 11 | }); 12 | 13 | router.post('/login', function(req, res) { 14 | User.findOne({ 15 | email: req.body.email 16 | }, function(err, result) { 17 | if (err) { 18 | utils.sendJson(res, 404, err); 19 | } else { 20 | if (result) { 21 | if (result.password == req.body.password && result.password) { 22 | utils.sendJson(res, 200, '登录成功', { 23 | uid: result.uid, 24 | userName: result.userName 25 | }); 26 | } else { 27 | utils.sendJson(res, 404, '密码错误'); 28 | } 29 | } else { 30 | utils.sendJson(res, 404, '用户不存在'); 31 | } 32 | } 33 | }); 34 | }); 35 | 36 | module.exports = router; -------------------------------------------------------------------------------- /routes/api/register.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mongoose = require('mongoose'); 4 | var utils = require('../utils/utils.js'); 5 | var mail = require('../utils/mail.js'); 6 | require('../../model/user.server.module.js'); 7 | var User = mongoose.model('User'); 8 | 9 | /* GET home page. */ 10 | router.get('/register', function(req, res) { 11 | res.send("请求资源不支持HTTP方法GET访问!"); 12 | }); 13 | 14 | router.post('/register', function(req, res) { 15 | User.findOne({ 16 | email: req.body.email 17 | }, function(err, result) { 18 | if (err) { 19 | utils.sendJson(res, 404, err); 20 | } else { 21 | if (result) { 22 | utils.sendJson(res, 404, '该邮箱地址已注册'); 23 | } else { 24 | userInsert(); 25 | } 26 | } 27 | }) 28 | 29 | var userInsert = function() { 30 | var content = { 31 | userName: req.body.userName, 32 | email: req.body.email, 33 | password: '', 34 | uid: utils.generateUUID() 35 | } 36 | var user = new User(content); 37 | user.save(function(err) { 38 | if (err) { 39 | utils.sendJson(res, 404, err); 40 | } else { 41 | var subject = '恣意游用户验证'; 42 | var url = req.protocol + "://" + req.get('host') + '/login?uid=' + content.uid; 43 | var html = '亲爱的用户:
感谢您注册恣意游.
请点击以下链接完成注册
'; 44 | html += ''; 45 | mail.sendMail(req.body.email, subject, html, function(result) { 46 | if (result.status == 200) { 47 | utils.sendJson(res, 200, result.message); 48 | } else { 49 | utils.sendJson(res, 404, result.message); 50 | } 51 | }) 52 | } 53 | }) 54 | } 55 | }); 56 | 57 | module.exports = router; -------------------------------------------------------------------------------- /routes/api/reset.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mongoose = require('mongoose'); 4 | var utils = require('../utils/utils.js'); 5 | require('../../model/user.server.module.js'); 6 | var User = mongoose.model('User'); 7 | 8 | /* GET home page. */ 9 | router.get('/reset', function(req, res) { 10 | res.send("请求资源不支持HTTP方法GET访问!"); 11 | }); 12 | 13 | router.post('/reset', function(req, res) { 14 | User.update({ 15 | uid: req.body.uid 16 | }, { 17 | $set: { 18 | password: req.body.password 19 | } 20 | }, {}, function(err, result) { 21 | if (err) { 22 | utils.sendJson(res, 404, err); 23 | } else { 24 | var resultObj = JSON.parse(JSON.stringify(result)); 25 | console.log(resultObj); 26 | if (resultObj.nModified == 0) { 27 | utils.sendJson(res, 404, '用户不存在'); 28 | } else { 29 | User.findOne({ 30 | uid: req.body.uid 31 | }, function(err, result) { 32 | utils.sendJson(res, 200, '密码修改成功', { 33 | uid: result.uid, 34 | userName: result.userName 35 | }); 36 | }); 37 | } 38 | } 39 | }); 40 | }); 41 | 42 | module.exports = router; -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | router.get('/', function(req, res, next) { 5 | res.render('index', { 6 | pageName: '列表-恣意游', 7 | page: 'index' 8 | }); 9 | }); 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /routes/login.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | router.get('/', function(req, res, next) { 5 | if (req.cookies.uid) { 6 | res.redirect('/index'); 7 | } else { 8 | res.render('login', { 9 | pageName: '登录-恣意游', 10 | page: 'login' 11 | }); 12 | } 13 | }); 14 | 15 | module.exports = router; -------------------------------------------------------------------------------- /routes/room.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var socketIo = require('socket.io'); 4 | var utils = require('./utils/utils.js'); 5 | var mongoose = require('mongoose'); 6 | var moment = require('moment'); 7 | 8 | require('../model/room.server.module.js'); 9 | var RoomList = mongoose.model('RoomList'); 10 | 11 | require('../model/roomUserList.server.module.js'); 12 | var RoomUserList = mongoose.model('RoomUserList'); 13 | 14 | require('../model/message.server.module.js'); 15 | var MessageRecord = mongoose.model('MessageRecord'); 16 | 17 | router.get('/', function(req, res, next) { 18 | if (!req.cookies.uid) { 19 | res.redirect('/login'); 20 | } else { 21 | if (req.query.roomId) { 22 | res.render('room', { 23 | pageName: '聊天室-恣意游', 24 | page: 'room' 25 | }); 26 | } else { 27 | res.redirect('/index'); 28 | } 29 | } 30 | }); 31 | 32 | router.roomSocketIo = function(server) { 33 | var io = socketIo.listen(server); 34 | 35 | //所有在线用户列表 36 | var allUserList = []; 37 | //所有房间列表 38 | var roomList = {}; 39 | //所有在线用户数量 40 | var allConnectUserNum = 0; 41 | 42 | //连接房间 43 | io.on('connection', function(socket) { 44 | // 获取用户当前的url,从而截取出房间id 45 | var socketReqUrl = socket.request.headers.referer; 46 | var query = utils.parseURI(socketReqUrl); 47 | var roomId = query.roomId; 48 | var nowConnectUser = {}; 49 | 50 | // 监听来自客户端的消息 51 | socket.on('enter', function(obj) { 52 | if (roomId) { 53 | RoomList.findOne({ 54 | roomId: roomId 55 | }, function(err, result) { 56 | if (err) socket.emit('enter', err); 57 | else { 58 | if (result) { 59 | nowConnectUser = obj; 60 | if (!roomList[roomId]) { 61 | roomList[roomId] = []; 62 | } 63 | for (var i = 0; i < roomList[roomId].length; i++) { 64 | if (roomList[roomId][i].uid == nowConnectUser.uid) { 65 | nowConnectUser = {}; 66 | socket.emit('enter', '该用户已存在该聊天室,您可以进入其他聊天室或切换账号!'); 67 | return; 68 | } 69 | } 70 | /* 71 | * 处理当前房间逻辑 72 | * roomId 当前房间ID 73 | * roomList[roomId]当前房间所有在线用户信息 74 | */ 75 | roomList[roomId].push(nowConnectUser); 76 | socket.join(roomId); 77 | //通知房间里面的人 78 | socket.to(roomId).emit('enterSuccess', roomList[roomId].length); 79 | //通知自己,即显示在当前页面 80 | socket.emit('enterSuccess', roomList[roomId].length); 81 | 82 | /* 83 | * 处理所有房间逻辑 84 | * allConnectUserNum 所有房间在线总人数 85 | * allUserList 所有房间在线用户信息 allUserList.push(nowConnectUser); 86 | */ 87 | allConnectUserNum++; 88 | roomUserInsert(roomId, nowConnectUser); 89 | console.log('总在线人数' + allConnectUserNum); 90 | console.log('当前房间在线人数' + roomList[roomId].length); 91 | } else { 92 | socket.emit('enter', '房间不存在!'); 93 | } 94 | } 95 | }) 96 | } else { 97 | socket.emit('enter', '房间不存在!'); 98 | } 99 | }); 100 | 101 | // 监听来自客户端的消息 102 | socket.on('message', function(msg) { 103 | if (!roomList[roomId]) { 104 | return; 105 | } 106 | // 验证如果用户不在房间内则不给发送 107 | for (var i = 0; i < roomList[roomId].length; i++) { 108 | if (roomList[roomId][i].uid == nowConnectUser.uid) { 109 | var msgTime = moment().format('h:mm A'); 110 | socket.to(roomId).emit('message', msg, nowConnectUser, 0, msgTime); 111 | socket.emit('message', msg, nowConnectUser, 1, msgTime); 112 | messageInsert(1, nowConnectUser.userName, decodeURI(decodeURI(query.roomName)), roomId, msg); 113 | return; 114 | } 115 | } 116 | }); 117 | 118 | //监听用户退出 119 | socket.on('disconnect', function() { 120 | // 从房间名单中移除 121 | socket.leave(roomId, function(err) { 122 | if (err) { 123 | log.error(err); 124 | } else { 125 | if (!roomList[roomId] || !nowConnectUser.uid) { 126 | return; 127 | } 128 | for (var i = 0; i < roomList[roomId].length; i++) { 129 | if (roomList[roomId][i].uid == nowConnectUser.uid) { 130 | roomList[roomId].splice(i, 1); 131 | allConnectUserNum--; 132 | roomUserRemove(roomId, nowConnectUser); 133 | console.log('匹配到退出用户,总人数' + allConnectUserNum); 134 | console.log('匹配到退出用户,当前房间人数' + roomList[roomId].length); 135 | break; 136 | } 137 | } 138 | //向当前房间客户端广播用户退出 139 | socket.to(roomId).emit('break', roomList[roomId].length); 140 | } 141 | }) 142 | }); 143 | 144 | }); 145 | 146 | //将用户发送的消息保存在服务器 147 | var messageInsert = function(type, userName, roomName, roomId, message) { 148 | var content = { 149 | type: type, 150 | userName: userName, 151 | roomName: roomName, 152 | roomId: roomId, 153 | message: message 154 | } 155 | var newMessage = new MessageRecord(content); 156 | newMessage.save(function(err) { 157 | if (err) { 158 | console.log(err); 159 | } else { 160 | console.log('保存成功一条用户发送的信息'); 161 | } 162 | }) 163 | } 164 | 165 | //将连接用户存储到用户列表数据库 166 | var roomUserInsert = function(roomId, obj) { 167 | RoomUserList.findOne({ 168 | roomId: roomId 169 | }, function(err, result) { 170 | if (err) { 171 | console.log(err); 172 | } else { 173 | if (result) { 174 | result.roomUserList.push(obj); 175 | result.save(function(err) { 176 | if (err) { 177 | console.log(err); 178 | } else { 179 | console.log("保存到用户列表成功"); 180 | } 181 | }); 182 | } else { 183 | console.log("未找到该房间用户列表,无法插入该用户"); 184 | } 185 | } 186 | }) 187 | } 188 | 189 | //将连接用户从用户列表数据库中删除 190 | var roomUserRemove = function(roomId, obj) { 191 | RoomUserList.findOne({ 192 | roomId: roomId 193 | }, function(err, result) { 194 | if (err) { 195 | console.log(err); 196 | } else { 197 | if (result) { 198 | for (var i = 0; i < result.roomUserList.length; i++) { 199 | if (result.roomUserList[i].uid == obj.uid) { 200 | result.roomUserList.splice(i, 1); 201 | result.save(function(err) { 202 | if (err) { 203 | console.log(err); 204 | } else { 205 | console.log("删除用户列表成功"); 206 | } 207 | }); 208 | } 209 | } 210 | } else { 211 | console.log("未找到该房间用户列表,无法删除该用户"); 212 | } 213 | } 214 | }) 215 | } 216 | } 217 | 218 | module.exports = router; -------------------------------------------------------------------------------- /routes/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function(app, express, path) { 2 | /* 3 | * 页面的url请求 4 | * GET请求 5 | */ 6 | //index 首页 7 | var index = require('./index'); 8 | app.use('/', index); 9 | app.use('/index', index); 10 | //login 登录和注册 11 | var login = require('./login'); 12 | app.use('/login', login); 13 | //room 房间 14 | var room = require('./room'); 15 | app.use('/room', room); 16 | app.ready = function(server) { 17 | room.roomSocketIo(server); 18 | }; 19 | 20 | /* 21 | * 页面的api请求 22 | * GET,POST请求 23 | * 所有api下放到专门的api文件下 24 | */ 25 | var loginApi = require('./api/login'); 26 | app.use('/api', loginApi); 27 | var registerApi = require('./api/register'); 28 | app.use('/api', registerApi); 29 | var resetApi = require('./api/reset.js'); 30 | app.use('/api', resetApi); 31 | var forgetApi = require('./api/forget.js'); 32 | app.use('/api', forgetApi); 33 | var creatRoomApi = require('./api/creatRoom.js'); 34 | app.use('/api', creatRoomApi); 35 | var getRoomList = require('./api/getRoomList.js'); 36 | app.use('/api', getRoomList); 37 | 38 | 39 | app.use(express.static(path.join(__dirname, '../www'), { 40 | maxAge: 0 41 | })); 42 | 43 | //404和错误程序处理 44 | app.use(function(req, res, next) { 45 | var err = new Error('目录不存在,请检查'); 46 | err.status = 404; 47 | next(err); 48 | }); 49 | 50 | //错误程序处理 51 | app.use(function(err, req, res, next) { 52 | // set locals, only providing error in development 53 | res.locals.message = err.message; 54 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 55 | 56 | //显示错误页面 57 | res.status(err.status || 500); 58 | res.render('./error/error'); 59 | }); 60 | } -------------------------------------------------------------------------------- /routes/utils/mail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /*--发送邮件--*/ 4 | var Nodemailer = require('nodemailer'); 5 | /*--基本配置--*/ 6 | var Config = require('../../config/config.js'); 7 | 8 | var smtpTransport = Nodemailer.createTransport(Config.MAIL); 9 | 10 | /** 11 | * [sendMail 发送邮件] 12 | * @param {String} subject:发送的主题 13 | * @param {String} html:发送的 html 内容 14 | */ 15 | var sendMail = function(emailAddress, subject, html, callback) { 16 | var emailAddressArr = []; 17 | emailAddressArr.push(emailAddress); 18 | var mailOptions = { 19 | from: '希希里岸