├── .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 | ![image](https://github.com/LCJ-MinYa/chat/blob/master/www/img/login.PNG)
18 | ![image](https://github.com/LCJ-MinYa/chat/blob/master/www/img/index.PNG)
19 | ![image](https://github.com/LCJ-MinYa/chat/blob/master/www/img/room.PNG)
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 += '

' + url + '

'; 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 += '

' + url + '

'; 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: '希希里岸 ', 20 | to: emailAddressArr, 21 | subject: subject, 22 | html: html 23 | }; 24 | 25 | smtpTransport.sendMail(mailOptions, function(error, response) { 26 | if (error) { 27 | callback({ 28 | status: 404, 29 | message: '邮件发送失败', 30 | data: error 31 | }); 32 | } else { 33 | callback({ 34 | status: 200, 35 | message: '邮件发送成功', 36 | data: response 37 | }); 38 | } 39 | smtpTransport.close(); 40 | }); 41 | }; 42 | 43 | module.exports = { 44 | sendMail 45 | } -------------------------------------------------------------------------------- /routes/utils/utils.js: -------------------------------------------------------------------------------- 1 | //返回json的数据结构 2 | var sendJson = function(res, status, message, data) { 3 | var result = data || new Array(); 4 | res.json({ 5 | status: status, 6 | message: message, 7 | data: result 8 | }); 9 | } 10 | 11 | /** 12 | * [generateUUID 生成全球唯一标识UUID] 13 | * @return {[type]} [uuid字符串] 14 | */ 15 | var generateUUID = function() { 16 | var d = new Date().getTime(); 17 | var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 18 | var r = (d + Math.random() * 16) % 16 | 0; 19 | d = Math.floor(d / 16); 20 | return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16); 21 | }); 22 | return uuid; 23 | }; 24 | 25 | /** 26 | * [parseURI 解析URL,可获得相关参数] 27 | * @description [url中拼接的参数在params中] 28 | * @param {[string]} url [需要解析的url,node中必选] 29 | * @return {[object]} [对象返回url中的相关参数信息] 30 | */ 31 | var parseURI = function(url) { 32 | var query = {}; 33 | var urlArr = url.split('?'); 34 | if (urlArr.length > 1) { 35 | var queryArr = urlArr[1].split('&'); 36 | for (var i = 0; i < queryArr.length; i++) { 37 | var someKeyValue = queryArr[i].split('='); 38 | query[someKeyValue[0]] = someKeyValue[1]; 39 | } 40 | } 41 | return query; 42 | } 43 | 44 | /* 45 | * [creatRandomNum 生成随机数,依据时间戳] 46 | * @description [依据时间戳,加上随机数作为房间ID,避免重复] 47 | * @return {[string]} [返回生成的随机数] 48 | */ 49 | var creatRandomNum = function() { 50 | return new Date().getTime() + "" + Math.floor(Math.random() * 899 + 100); 51 | } 52 | 53 | module.exports = { 54 | sendJson, 55 | generateUUID, 56 | parseURI, 57 | creatRandomNum 58 | } -------------------------------------------------------------------------------- /views/common/allPopupWrap.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
-------------------------------------------------------------------------------- /views/common/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /views/common/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <%= pageName%> 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /views/common/loading.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
-------------------------------------------------------------------------------- /views/common/messageBox.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
提示
4 |
5 |
6 | 7 | 8 |
9 |
10 |
-------------------------------------------------------------------------------- /views/common/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /views/error/error.html: -------------------------------------------------------------------------------- 1 |

<%= message %>

2 |

<%= error.status %>

3 |
<%= error.stack %>
4 | -------------------------------------------------------------------------------- /views/index.html: -------------------------------------------------------------------------------- 1 | <%include ./common/header.html%> 2 |
3 | 4 | 5 | <%include ./common/loading.html%> 6 | 7 | 8 |
9 | 10 |
11 | 12 | Talk 13 |
14 | 欢迎:{{userName}} 15 | 登录 16 |
17 |
18 | 19 |
20 | 房间列表 21 | 在线人数:{{onLineUser}}人 22 |
23 | 24 |
25 |
26 |
27 | 【推荐】 28 | 29 | 30 |
31 | 32 |
33 |
34 | 35 |
36 | 37 | 38 | 43 | 44 | <%include ./common/popup.html%> 45 | 46 | 47 | <%include ./common/allPopupWrap.html%> 48 | 49 | 50 | <%include ./common/messageBox.html%> 51 | 52 | 53 |
54 |
55 | 创建房间 56 | 57 |
58 | 59 | 60 | 66 |
67 |
68 | 69 |
70 | <%include ./common/footer.html%> -------------------------------------------------------------------------------- /views/login.html: -------------------------------------------------------------------------------- 1 | <%include ./common/header.html%> 2 |
3 | 4 | <%include ./common/loading.html%> 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 30 | 31 | 32 | 33 | 34 | 50 | 51 | 52 | 53 | 54 | 70 | 71 | 72 | 73 | 74 | 90 | 91 | 92 | 93 | 98 |
99 |
100 | 101 | <%include ./common/popup.html%> 102 | 103 |
104 | <%include ./common/footer.html%> -------------------------------------------------------------------------------- /views/room.html: -------------------------------------------------------------------------------- 1 | <%include ./common/header.html%> 2 |
3 | 4 | <%include ./common/loading.html%> 5 | 6 |
7 |
8 | 9 | 10 | 11 |
12 |
13 |
    14 |
  • 15 |
    16 | 17 |
    18 |
    19 | 20 | 21 |
    22 |
    23 |
    24 |
    25 |
    26 | 27 |
    28 |
    29 | ME 30 | 31 |
    32 |
    33 |
    34 |
    35 |
  • 36 |
37 | 38 |
39 | 40 | 41 |
42 |
43 | 44 | 45 | <%include ./common/allPopupWrap.html%> 46 | 47 | 48 | <%include ./common/messageBox.html%> 49 | 50 |
51 | 52 | <%include ./common/footer.html%> -------------------------------------------------------------------------------- /www/css/index.css: -------------------------------------------------------------------------------- 1 | html{ 2 | width: 100%; 3 | min-height: 100%; 4 | } 5 | body{ 6 | width: 100%; 7 | min-height: 100%; 8 | background-attachment: fixed; 9 | background: url(https://imio.oss-cn-shanghai.aliyuncs.com/chat/img/index-bg.jpg) no-repeat center center/cover; 10 | } 11 | 12 | #js_index_body{ 13 | width: 100%; 14 | min-height: 100%; 15 | overflow: hidden; 16 | color: #fff; 17 | } 18 | 19 | 20 | .index-content{ 21 | width: 100%; 22 | overflow: hidden; 23 | position: relative; 24 | z-index: 10; 25 | margin-bottom: 2.5rem; 26 | } 27 | .index-header{ 28 | width: 100%; 29 | height: 2.2rem; 30 | overflow: hidden; 31 | position: relative; 32 | z-index: 10; 33 | background: rgba(50,50,50,0.5); 34 | font-size: 0.65rem; 35 | line-height: 2.2rem; 36 | color: #eacb20; 37 | } 38 | .index-header span{ 39 | text-align: left; 40 | } 41 | .header-right-box{ 42 | height: 2.2rem; 43 | line-height: 2.2rem; 44 | float: right; 45 | padding-right: 0.5rem; 46 | overflow: hidden; 47 | font-size: 0.5rem; 48 | } 49 | .header-right-text{ 50 | padding: 0.1rem 0.4rem; 51 | color: #e1e1e1; 52 | border-radius: 0.2rem; 53 | line-height: 1; 54 | } 55 | .index-header i{ 56 | display: inline-block; 57 | float: left; 58 | padding: 0 0.5rem; 59 | font-size: 0.9rem; 60 | } 61 | .index-content-title{ 62 | position: relative; 63 | width: 100%; 64 | padding: 1rem 0.5rem; 65 | font-size: 0.55rem; 66 | box-shadow:0px -1px 2px #666; 67 | -webkit-box-shadow:0px -1px 2px #666; 68 | } 69 | .title-right{ 70 | display: inline-block; 71 | float: right; 72 | } 73 | .index-content-list-box{ 74 | position: relative; 75 | width: 100%; 76 | overflow: hidden; 77 | padding: 0 0.5rem; 78 | } 79 | .index-content-list{ 80 | position: relative; 81 | width: 100%; 82 | overflow: hidden; 83 | margin-bottom: 1rem; 84 | padding-left: 0.5rem; 85 | font-size: 0.6rem; 86 | background: rgba(30,30,30,0.5); 87 | } 88 | .index-content-list:nth-child(1n){ 89 | border-left: 1px solid #fcab53; 90 | } 91 | .index-content-list:nth-child(2n){ 92 | border-left: 1px solid #ff3366; 93 | } 94 | .index-content-list:nth-child(3n){ 95 | border-left: 1px solid #449a10; 96 | } 97 | .index-content-list:nth-child(4n){ 98 | border-left: 1px solid #0b4bcc; 99 | } 100 | .index-content-list:nth-child(5n){ 101 | border-left: 1px solid #3e08d8; 102 | } 103 | .list-top{ 104 | font-size: 0.55rem; 105 | padding-right: 0.5rem; 106 | line-height: 300%; 107 | } 108 | .recommend{ 109 | color: #eacb20; 110 | } 111 | .list-top i{ 112 | display: inline-block; 113 | float: right; 114 | margin-left: 0.4rem; 115 | font-size: 0.55rem; 116 | } 117 | .font-size-color{ 118 | color: #e1e1e1; 119 | } 120 | .list-top i span{ 121 | display: inline-block; 122 | padding-left: 0.2rem; 123 | font-size: 0.6rem; 124 | color: #e1e1e1; 125 | } 126 | .list-detail{ 127 | display: inline-block; 128 | font-size: 0.55rem; 129 | line-height: 150%; 130 | padding-right: 0.5rem; 131 | padding-bottom: 0.5rem; 132 | color: #e1e1e1; 133 | } 134 | .index-footer{ 135 | position: fixed; 136 | left: 0; 137 | bottom: 0; 138 | width: 100%; 139 | height: 2.5rem; 140 | z-index: 9999; 141 | background: rgba(50,50,50,0.8); 142 | } 143 | .login-foot-box{ 144 | position: relative; 145 | width: 100%; 146 | height: 2.5rem; 147 | text-align: center; 148 | line-height: 2.5rem; 149 | border-top:1px solid rgba(234,203,32,0.8); 150 | left: 50%; 151 | margin-left: -50%; 152 | display: box; 153 | display:-moz-box; 154 | display: -webkit-box; 155 | } 156 | .login-foot-box span{ 157 | display:block; 158 | box-flex:1; 159 | -moz-box-flex:1; 160 | -webkit-box-flex:1; 161 | position: relative; 162 | font-size: 0.7rem; 163 | color:#fff; 164 | } 165 | 166 | /*creat-room-dom*/ 167 | .creat-room-box{ 168 | position: fixed; 169 | width: 80%; 170 | overflow: hidden; 171 | top: 50%; 172 | left: 50%; 173 | font-size: 0.6rem; 174 | background: #f1f1f1; 175 | color: #111; 176 | -webkit-transform: translate3d(-50%,-50%,0); 177 | transform: translate3d(-50%,-50%,0); 178 | border-radius: 0.2rem; 179 | z-index: 1000; 180 | } 181 | .creat-room-header{ 182 | position: relative; 183 | width: 100%; 184 | overflow: hidden; 185 | color: #555; 186 | font-size: 0.6rem; 187 | border-bottom: 1px solid #e1e1e1; 188 | } 189 | .creat-room-header span{ 190 | display: inline-block; 191 | padding-left: 0.5rem; 192 | height: 2rem; 193 | line-height: 2rem; 194 | } 195 | .icon-chuangjianxiaozu{ 196 | font-size: 1rem; 197 | padding-right: 0.2rem; 198 | } 199 | .icon-guanbi{ 200 | height: 2rem; 201 | line-height: 2rem; 202 | display: inline-block; 203 | float: right; 204 | padding: 0 0.5rem; 205 | } 206 | .creat-room-name{ 207 | display: block; 208 | width: 80%; 209 | height: 1.5rem; 210 | margin: 0.5rem auto; 211 | border: 1px solid #e1e1e1; 212 | color:#333; 213 | font-size: 0.6rem; 214 | padding: 0 0.5rem; 215 | } 216 | .creat-room-detail{ 217 | display: block; 218 | width: 80%; 219 | margin: 0 auto 0.5rem auto; 220 | resize: none; 221 | border-radius: 4px; 222 | border: 1px solid #e1e1e1; 223 | height: 3.25rem; 224 | font-size: 0.55rem; 225 | padding: 0.2rem; 226 | } 227 | .creat-room-btn{ 228 | display: block; 229 | width: 80%; 230 | margin: 0.8rem auto 1rem auto; 231 | background: #eacb20; 232 | overflow: hidden; 233 | color:#fff; 234 | border-radius: 4px; 235 | } 236 | .loading-box{ 237 | display: inline-block; 238 | height: 1.5rem; 239 | line-height: 1.5rem; 240 | } 241 | .css-loading{ 242 | margin: 0.4rem 0.2rem 0 0; 243 | } 244 | .css-loading-text{ 245 | display: inline-block; 246 | height: 1.5rem; 247 | line-height: 1.5rem; 248 | font-size: 0.75rem; 249 | } 250 | .room-enter{ 251 | opacity: 0; 252 | transform: translate3d(-50%,-50%,0) scale(1.2); 253 | -webkit-transform: translate3d(-50%,-50%,0) scale(1.2); 254 | } 255 | .room-enter-active{ 256 | transition: opacity 0.5s, transform 0.5s; 257 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 258 | } 259 | .room-leave-active{ 260 | opacity: 0; 261 | transform: translate3d(-50%,-50%,0) scale(0.8); 262 | -webkit-transform: translate3d(-50%,-50%,0) scale(0.8); 263 | transition: opacity 0.5s, transform 0.5s; 264 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 265 | } 266 | .popup-text{ 267 | background: rgba(0,0,0,0.8); 268 | color:#fff; 269 | } -------------------------------------------------------------------------------- /www/css/login.css: -------------------------------------------------------------------------------- 1 | html,body{ 2 | width: 100%; 3 | height: 100%; 4 | overflow: hidden; 5 | } 6 | 7 | #js_login_body{ 8 | width: 100%; 9 | height: 100%; 10 | overflow: hidden; 11 | background: url(https://imio.oss-cn-shanghai.aliyuncs.com/chat/img/ba.jpg) no-repeat center center/cover; 12 | } 13 | .js_login_content{ 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | overflow: hidden; 18 | z-index: 10; 19 | width: 100%; 20 | height: 100%; 21 | } 22 | .icon-githublogo{ 23 | position: absolute; 24 | display: block; 25 | top: 5%; 26 | width: 5rem; 27 | height: 5rem; 28 | left: 50%; 29 | margin-left: -2.5rem; 30 | color: #eacb20; 31 | font-size: 5rem; 32 | } 33 | .login-input-box{ 34 | position: absolute; 35 | top:40%; 36 | left: 50%; 37 | width: 80%; 38 | overflow: hidden; 39 | margin-left: -40%; 40 | padding-bottom: 1.5rem; 41 | color: #f1f1f1; 42 | font-size: 1.6rem; 43 | } 44 | .register-input-box{ 45 | top:35%; 46 | } 47 | .login-username{ 48 | position: relative; 49 | width: 100%; 50 | height: 2rem; 51 | background: rgba(0,0,0,0.5); 52 | } 53 | .login-password{ 54 | margin-top: 1rem; 55 | } 56 | .register-password{ 57 | margin-top: 0.6rem; 58 | } 59 | .login-input{ 60 | display: block; 61 | float: left; 62 | height: 2rem; 63 | width: 75%; 64 | background: rgba(0,0,0,0); 65 | color:#fff; 66 | } 67 | .icon-username, .icon-password, .icon-1{ 68 | color: #eacb20; 69 | font-size: 1rem; 70 | text-align: center; 71 | line-height: 2rem; 72 | float: left; 73 | padding: 0 0.75rem; 74 | } 75 | .login-btn{ 76 | position: relative; 77 | width: 60%; 78 | height: 2rem; 79 | background: #eacb20; 80 | border-radius: 1rem; 81 | color: #fff; 82 | font-size: 0.75rem; 83 | line-height: 2rem; 84 | margin-top: 1.5rem; 85 | left: 50%; 86 | margin-left: -30%; 87 | } 88 | .login-btn-box{ 89 | position: relative; 90 | width: 2rem; 91 | height: 2rem; 92 | line-height: 2rem; 93 | margin: 0 auto; 94 | } 95 | .register-btn{ 96 | margin-top: 1rem; 97 | } 98 | 99 | .login-foot-box{ 100 | position: absolute; 101 | bottom: 2%; 102 | width: 80%; 103 | height: 2.5rem; 104 | text-align: center; 105 | line-height: 2.5rem; 106 | border-top:1px solid #eacb20; 107 | left: 50%; 108 | margin-left: -40%; 109 | display: box; 110 | display:-moz-box; 111 | display: -webkit-box; 112 | } 113 | .login-foot-box span{ 114 | display:block; 115 | box-flex:1; 116 | -moz-box-flex:1; 117 | -webkit-box-flex:1; 118 | position: relative; 119 | font-size: 0.7rem; 120 | color:#fff; 121 | } 122 | .login-foot-box span:hover{background-color: #eacb20;} 123 | .login-btn-text{ 124 | width: 2rem; 125 | height: 2rem; 126 | line-height: 2rem; 127 | float: right; 128 | font-size: 0.75rem; 129 | } 130 | .btn-width{ 131 | width: 2.7rem; 132 | } 133 | 134 | /*loginShow动画*/ 135 | .loginShow-enter{ 136 | transform: translateX(-100%); 137 | opacity: 0; 138 | } 139 | .loginShow-enter-active { 140 | transition: all .5s ease; 141 | } 142 | .loginShow-leave-active { 143 | transform: translateX(-100%); 144 | opacity: 0; 145 | transition: all .5s ease; 146 | } 147 | 148 | /*registerShow动画*/ 149 | .registerShow-enter{ 150 | transform: translateX(100%); 151 | opacity: 0; 152 | } 153 | .registerShow-enter-active { 154 | transition: all .5s ease; 155 | } 156 | .registerShow-leave-active { 157 | transform: translateX(100%); 158 | opacity: 0; 159 | transition: all .5s ease; 160 | } 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /www/css/mint.css: -------------------------------------------------------------------------------- 1 | /* Cell Component */ 2 | /* Header Component */ 3 | /* Button Component */ 4 | /* Tab Item Component */ 5 | /* Tabbar Component */ 6 | /* Navbar Component */ 7 | /* Checklist Component */ 8 | /* Radio Component */ 9 | /* z-index */ 10 | .mint-header { 11 | -webkit-box-align: center; 12 | -ms-flex-align: center; 13 | align-items: center; 14 | background-color: #26a2ff; 15 | box-sizing: border-box; 16 | color: #fff; 17 | display: -webkit-box; 18 | display: -ms-flexbox; 19 | display: flex; 20 | font-size: 14px; 21 | height: 40px; 22 | line-height: 1; 23 | padding: 0 10px; 24 | position: relative; 25 | text-align: center; 26 | white-space: nowrap; 27 | } 28 | .mint-header .mint-button { 29 | background-color: transparent; 30 | border: 0; 31 | box-shadow: none; 32 | color: inherit; 33 | display: inline-block; 34 | padding: 0; 35 | font-size: inherit 36 | } 37 | .mint-header .mint-button::after { 38 | content: none; 39 | } 40 | .mint-header.is-fixed { 41 | top: 0; 42 | right: 0; 43 | left: 0; 44 | position: fixed; 45 | z-index: 1; 46 | } 47 | .mint-header-button { 48 | -webkit-box-flex: .5; 49 | -ms-flex: .5; 50 | flex: .5; 51 | } 52 | .mint-header-button > a { 53 | color: inherit; 54 | } 55 | .mint-header-button.is-right { 56 | text-align: right; 57 | } 58 | .mint-header-button.is-left { 59 | text-align: left; 60 | } 61 | .mint-header-title { 62 | overflow: hidden; 63 | text-overflow: ellipsis; 64 | white-space: nowrap; 65 | font-size: inherit; 66 | font-weight: 400; 67 | -webkit-box-flex: 1; 68 | -ms-flex: 1; 69 | flex: 1; 70 | } 71 | /* Cell Component */ 72 | /* Header Component */ 73 | /* Button Component */ 74 | /* Tab Item Component */ 75 | /* Tabbar Component */ 76 | /* Navbar Component */ 77 | /* Checklist Component */ 78 | /* Radio Component */ 79 | /* z-index */ 80 | .mint-button { 81 | -webkit-appearance: none; 82 | -moz-appearance: none; 83 | appearance: none; 84 | border-radius: 4px; 85 | border: 0; 86 | box-sizing: border-box; 87 | color: inherit; 88 | display: block; 89 | font-size: 18px; 90 | height: 41px; 91 | outline: 0; 92 | overflow: hidden; 93 | position: relative; 94 | text-align: center 95 | } 96 | .mint-button::after { 97 | background-color: #000; 98 | content: " "; 99 | opacity: 0; 100 | top: 0; 101 | right: 0; 102 | bottom: 0; 103 | left: 0; 104 | position: absolute 105 | } 106 | .mint-button:not(.is-disabled):active::after { 107 | opacity: .4 108 | } 109 | .mint-button.is-disabled { 110 | opacity: .6 111 | } 112 | .mint-button-icon { 113 | vertical-align: middle; 114 | display: inline-block 115 | } 116 | .mint-button--default { 117 | color: #656b79; 118 | background-color: #f6f8fa; 119 | box-shadow: 0 0 1px #b8bbbf 120 | } 121 | .mint-button--default.is-plain { 122 | border: 1px solid #5a5a5a; 123 | background-color: transparent; 124 | box-shadow: none; 125 | color: #5a5a5a 126 | } 127 | .mint-button--primary { 128 | color: #fff; 129 | background-color: #26a2ff 130 | } 131 | .mint-button--primary.is-plain { 132 | border: 1px solid #26a2ff; 133 | background-color: transparent; 134 | color: #26a2ff 135 | } 136 | .mint-button--danger { 137 | color: #fff; 138 | background-color: #ef4f4f 139 | } 140 | .mint-button--danger.is-plain { 141 | border: 1px solid #ef4f4f; 142 | background-color: transparent; 143 | color: #ef4f4f 144 | } 145 | .mint-button--large { 146 | display: block; 147 | width: 100% 148 | } 149 | .mint-button--normal { 150 | display: inline-block; 151 | padding: 0 12px 152 | } 153 | .mint-button--small { 154 | display: inline-block; 155 | font-size: 14px; 156 | padding: 0 12px; 157 | height: 33px 158 | } 159 | /* Cell Component */ 160 | /* Header Component */ 161 | /* Button Component */ 162 | /* Tab Item Component */ 163 | /* Tabbar Component */ 164 | /* Navbar Component */ 165 | /* Checklist Component */ 166 | /* Radio Component */ 167 | /* z-index */ 168 | .mint-cell { 169 | background-color:#fff; 170 | box-sizing:border-box; 171 | color:inherit; 172 | min-height:48px; 173 | display:block; 174 | overflow:hidden; 175 | position:relative; 176 | text-decoration:none; 177 | } 178 | .mint-cell img { 179 | vertical-align:middle; 180 | } 181 | .mint-cell:first-child .mint-cell-wrapper { 182 | background-origin:border-box; 183 | } 184 | .mint-cell:last-child { 185 | background-image:-webkit-linear-gradient(bottom, #d9d9d9, #d9d9d9 50%, transparent 50%); 186 | background-image:linear-gradient(0deg, #d9d9d9, #d9d9d9 50%, transparent 50%); 187 | background-size:100% 1px; 188 | background-repeat:no-repeat; 189 | background-position:bottom; 190 | } 191 | .mint-cell-wrapper { 192 | background-image:-webkit-linear-gradient(top, #d9d9d9, #d9d9d9 50%, transparent 50%); 193 | background-image:linear-gradient(180deg, #d9d9d9, #d9d9d9 50%, transparent 50%); 194 | background-size: 120% 1px; 195 | background-repeat: no-repeat; 196 | background-position: top left; 197 | background-origin: content-box; 198 | -webkit-box-align: center; 199 | -ms-flex-align: center; 200 | align-items: center; 201 | box-sizing: border-box; 202 | display: -webkit-box; 203 | display: -ms-flexbox; 204 | display: flex; 205 | font-size: 16px; 206 | line-height: 1; 207 | min-height: inherit; 208 | overflow: hidden; 209 | padding: 0 10px; 210 | width: 100%; 211 | } 212 | .mint-cell-mask {} 213 | .mint-cell-mask::after { 214 | background-color:#000; 215 | content:" "; 216 | opacity:0; 217 | top:0; 218 | right:0; 219 | bottom:0; 220 | left:0; 221 | position:absolute; 222 | } 223 | .mint-cell-mask:active::after { 224 | opacity:.1; 225 | } 226 | .mint-cell-text { 227 | vertical-align: middle; 228 | } 229 | .mint-cell-label { 230 | color: #888; 231 | display: block; 232 | font-size: 12px; 233 | margin-top: 6px; 234 | } 235 | .mint-cell-title { 236 | -webkit-box-flex: 1; 237 | -ms-flex: 1; 238 | flex: 1; 239 | } 240 | .mint-cell-value { 241 | color: #888; 242 | display: -webkit-box; 243 | display: -ms-flexbox; 244 | display: flex; 245 | -webkit-box-align: center; 246 | -ms-flex-align: center; 247 | align-items: center; 248 | } 249 | .mint-cell-value.is-link { 250 | margin-right:24px; 251 | } 252 | .mint-cell-left { 253 | position: absolute; 254 | height: 100%; 255 | left: 0; 256 | -webkit-transform: translate3d(-100%, 0, 0); 257 | transform: translate3d(-100%, 0, 0); 258 | } 259 | .mint-cell-right { 260 | position: absolute; 261 | height: 100%; 262 | right: 0; 263 | top: 0; 264 | -webkit-transform: translate3d(100%, 0, 0); 265 | transform: translate3d(100%, 0, 0); 266 | } 267 | .mint-cell-allow-right::after { 268 | border: solid 2px #c8c8cd; 269 | border-bottom-width: 0; 270 | border-left-width: 0; 271 | content: " "; 272 | top:50%; 273 | right:20px; 274 | position: absolute; 275 | width:5px; 276 | height:5px; 277 | -webkit-transform: translateY(-50%) rotate(45deg); 278 | transform: translateY(-50%) rotate(45deg); 279 | } 280 | /* Cell Component */ 281 | /* Header Component */ 282 | /* Button Component */ 283 | /* Tab Item Component */ 284 | /* Tabbar Component */ 285 | /* Navbar Component */ 286 | /* Checklist Component */ 287 | /* Radio Component */ 288 | /* z-index */ 289 | .mint-cell-swipe .mint-cell-wrapper, .mint-cell-swipe .mint-cell-left, .mint-cell-swipe .mint-cell-right { 290 | -webkit-transition: -webkit-transform 150ms ease-in-out; 291 | transition: -webkit-transform 150ms ease-in-out; 292 | transition: transform 150ms ease-in-out; 293 | transition: transform 150ms ease-in-out, -webkit-transform 150ms ease-in-out; 294 | } 295 | .mint-cell-swipe-buttongroup { 296 | height: 100%; 297 | } 298 | .mint-cell-swipe-button { 299 | height: 100%; 300 | display: inline-block; 301 | padding: 0 10px; 302 | line-height: 48px; 303 | } 304 | /* Cell Component */ 305 | /* Header Component */ 306 | /* Button Component */ 307 | /* Tab Item Component */ 308 | /* Tabbar Component */ 309 | /* Navbar Component */ 310 | /* Checklist Component */ 311 | /* Radio Component */ 312 | /* z-index */ 313 | .mint-field { 314 | display: -webkit-box; 315 | display: -ms-flexbox; 316 | display: flex; 317 | } 318 | .mint-field .mint-cell-title { 319 | width: 105px; 320 | -webkit-box-flex: 0; 321 | -ms-flex: none; 322 | flex: none; 323 | } 324 | .mint-field .mint-cell-value { 325 | -webkit-box-flex: 1; 326 | -ms-flex: 1; 327 | flex: 1; 328 | color: inherit; 329 | display: -webkit-box; 330 | display: -ms-flexbox; 331 | display: flex; 332 | } 333 | .mint-field.is-nolabel .mint-cell-title { 334 | display: none; 335 | } 336 | .mint-field.is-textarea { 337 | -webkit-box-align: inherit; 338 | -ms-flex-align: inherit; 339 | align-items: inherit; 340 | } 341 | .mint-field.is-textarea .mint-cell-title { 342 | padding: 10px 0; 343 | } 344 | .mint-field.is-textarea .mint-cell-value { 345 | padding: 5px 0; 346 | } 347 | .mint-field-core { 348 | -webkit-appearance: none; 349 | -moz-appearance: none; 350 | appearance: none; 351 | border-radius: 0; 352 | border: 0; 353 | -webkit-box-flex: 1; 354 | -ms-flex: 1; 355 | flex: 1; 356 | outline: 0; 357 | line-height: 1.6; 358 | font-size: inherit; 359 | width: 100%; 360 | } 361 | .mint-field-clear { 362 | opacity: .2; 363 | } 364 | .mint-field-state { 365 | color: inherit; 366 | margin-left: 20px; 367 | } 368 | .mint-field-state .mintui { 369 | font-size: 20px; 370 | } 371 | .mint-field-state.is-default { 372 | margin-left: 0; 373 | } 374 | .mint-field-state.is-success { 375 | color: #4caf50; 376 | } 377 | .mint-field-state.is-warning { 378 | color: #ffc107; 379 | } 380 | .mint-field-state.is-error { 381 | color: #f44336; 382 | } 383 | .mint-field-other { 384 | top: 0; 385 | right: 0; 386 | position: absolute; 387 | } 388 | /* Cell Component */ 389 | /* Header Component */ 390 | /* Button Component */ 391 | /* Tab Item Component */ 392 | /* Tabbar Component */ 393 | /* Navbar Component */ 394 | /* Checklist Component */ 395 | /* Radio Component */ 396 | /* z-index */ 397 | .mint-badge { 398 | color: #fff; 399 | text-align: center; 400 | display: inline-block 401 | } 402 | .mint-badge.is-size-large { 403 | border-radius: 14px; 404 | font-size: 18px; 405 | padding: 2px 10px 406 | } 407 | .mint-badge.is-size-small { 408 | border-radius: 8px; 409 | font-size: 12px; 410 | padding: 2px 6px 411 | } 412 | .mint-badge.is-size-normal { 413 | border-radius: 12px; 414 | font-size: 15px; 415 | padding: 2px 8px 416 | } 417 | .mint-badge.is-warning { 418 | background-color: #ffc107 419 | } 420 | .mint-badge.is-error { 421 | background-color: #f44336 422 | } 423 | .mint-badge.is-primary { 424 | background-color: #26a2ff 425 | } 426 | .mint-badge.is-success { 427 | background-color: #4caf50 428 | } 429 | /* Cell Component */ 430 | /* Header Component */ 431 | /* Button Component */ 432 | /* Tab Item Component */ 433 | /* Tabbar Component */ 434 | /* Navbar Component */ 435 | /* Checklist Component */ 436 | /* Radio Component */ 437 | /* z-index */ 438 | .mint-switch { 439 | display: -webkit-box; 440 | display: -ms-flexbox; 441 | display: flex; 442 | -webkit-box-align: center; 443 | -ms-flex-align: center; 444 | align-items: center; 445 | position: relative 446 | } 447 | .mint-switch-label { 448 | margin-left: 10px; 449 | display: inline-block 450 | } 451 | .mint-switch-label:empty { 452 | margin-left: 0 453 | } 454 | .mint-switch-core { 455 | display: inline-block; 456 | position: relative; 457 | width: 52px; 458 | height: 32px; 459 | border: 1px solid #d9d9d9; 460 | border-radius: 16px; 461 | box-sizing: border-box; 462 | background: #d9d9d9 463 | } 464 | .mint-switch-core::after, .mint-switch-core::before { 465 | content: " "; 466 | top: 0; 467 | left: 0; 468 | position: absolute; 469 | -webkit-transition: -webkit-transform .3s; 470 | transition: -webkit-transform .3s; 471 | transition: transform .3s; 472 | transition: transform .3s, -webkit-transform .3s; 473 | border-radius: 15px 474 | } 475 | .mint-switch-core::after { 476 | width: 30px; 477 | height: 30px; 478 | background-color: #fff; 479 | box-shadow: 0 1px 3px rgba(0, 0, 0, .4) 480 | } 481 | .mint-switch-core::before { 482 | width: 50px; 483 | height: 30px; 484 | background-color: #fdfdfd 485 | } 486 | .mint-switch-input { 487 | display: none 488 | } 489 | .mint-switch-input:checked + .mint-switch-core { 490 | border-color: #26a2ff; 491 | background-color: #26a2ff 492 | } 493 | .mint-switch-input:checked + .mint-switch-core::before { 494 | -webkit-transform: scale(0); 495 | transform: scale(0) 496 | } 497 | .mint-switch-input:checked + .mint-switch-core::after { 498 | -webkit-transform: translateX(20px); 499 | transform: translateX(20px) 500 | } 501 | 502 | .mint-spinner-snake { 503 | -webkit-animation: mint-spinner-rotate 0.8s infinite linear; 504 | animation: mint-spinner-rotate 0.8s infinite linear; 505 | border: 4px solid transparent; 506 | border-radius: 50%; 507 | } 508 | @-webkit-keyframes mint-spinner-rotate { 509 | 0% { 510 | -webkit-transform: rotate(0deg); 511 | transform: rotate(0deg); 512 | } 513 | 100% { 514 | -webkit-transform: rotate(360deg); 515 | transform: rotate(360deg); 516 | } 517 | } 518 | @keyframes mint-spinner-rotate { 519 | 0% { 520 | -webkit-transform: rotate(0deg); 521 | transform: rotate(0deg); 522 | } 523 | 100% { 524 | -webkit-transform: rotate(360deg); 525 | transform: rotate(360deg); 526 | } 527 | } 528 | 529 | .mint-spinner-double-bounce { 530 | position: relative; 531 | } 532 | .mint-spinner-double-bounce-bounce1, .mint-spinner-double-bounce-bounce2 { 533 | width: 100%; 534 | height: 100%; 535 | border-radius: 50%; 536 | opacity: 0.6; 537 | position: absolute; 538 | top: 0; 539 | left: 0; 540 | -webkit-animation: mint-spinner-double-bounce 2.0s infinite ease-in-out; 541 | animation: mint-spinner-double-bounce 2.0s infinite ease-in-out; 542 | } 543 | .mint-spinner-double-bounce-bounce2 { 544 | -webkit-animation-delay: -1.0s; 545 | animation-delay: -1.0s; 546 | } 547 | @-webkit-keyframes mint-spinner-double-bounce { 548 | 0%, 100% { 549 | -webkit-transform: scale(0.0); 550 | transform: scale(0.0); 551 | } 552 | 50% { 553 | -webkit-transform: scale(1.0); 554 | transform: scale(1.0); 555 | } 556 | } 557 | @keyframes mint-spinner-double-bounce { 558 | 0%, 100% { 559 | -webkit-transform: scale(0.0); 560 | transform: scale(0.0); 561 | } 562 | 50% { 563 | -webkit-transform: scale(1.0); 564 | transform: scale(1.0); 565 | } 566 | } 567 | 568 | .mint-spinner-triple-bounce {} 569 | .mint-spinner-triple-bounce-bounce1, .mint-spinner-triple-bounce-bounce2, .mint-spinner-triple-bounce-bounce3 { 570 | border-radius: 100%; 571 | display: inline-block; 572 | -webkit-animation: mint-spinner-triple-bounce 1.4s infinite ease-in-out both; 573 | animation: mint-spinner-triple-bounce 1.4s infinite ease-in-out both; 574 | } 575 | .mint-spinner-triple-bounce-bounce1 { 576 | -webkit-animation-delay: -0.32s; 577 | animation-delay: -0.32s; 578 | } 579 | .mint-spinner-triple-bounce-bounce2 { 580 | -webkit-animation-delay: -0.16s; 581 | animation-delay: -0.16s; 582 | } 583 | @-webkit-keyframes mint-spinner-triple-bounce { 584 | 0%, 80%, 100% { 585 | -webkit-transform: scale(0); 586 | transform: scale(0); 587 | } 588 | 40% { 589 | -webkit-transform: scale(1.0); 590 | transform: scale(1.0); 591 | } 592 | } 593 | @keyframes mint-spinner-triple-bounce { 594 | 0%, 80%, 100% { 595 | -webkit-transform: scale(0); 596 | transform: scale(0); 597 | } 598 | 40% { 599 | -webkit-transform: scale(1.0); 600 | transform: scale(1.0); 601 | } 602 | } 603 | 604 | .mint-spinner-fading-circle { 605 | position: relative 606 | } 607 | .mint-spinner-fading-circle-circle { 608 | width: 100%; 609 | height: 100%; 610 | top: 0; 611 | left: 0; 612 | position: absolute 613 | } 614 | .mint-spinner-fading-circle-circle::before { 615 | content: " "; 616 | display: block; 617 | margin: 0 auto; 618 | width: 15%; 619 | height: 15%; 620 | border-radius: 100%; 621 | -webkit-animation: mint-fading-circle 1.2s infinite ease-in-out both; 622 | animation: mint-fading-circle 1.2s infinite ease-in-out both 623 | } 624 | .mint-spinner-fading-circle-circle.is-circle2 { 625 | -webkit-transform: rotate(30deg); 626 | transform: rotate(30deg) 627 | } 628 | .mint-spinner-fading-circle-circle.is-circle2::before { 629 | -webkit-animation-delay: -1.1s; 630 | animation-delay: -1.1s 631 | } 632 | .mint-spinner-fading-circle-circle.is-circle3 { 633 | -webkit-transform: rotate(60deg); 634 | transform: rotate(60deg) 635 | } 636 | .mint-spinner-fading-circle-circle.is-circle3::before { 637 | -webkit-animation-delay: -1s; 638 | animation-delay: -1s 639 | } 640 | .mint-spinner-fading-circle-circle.is-circle4 { 641 | -webkit-transform: rotate(90deg); 642 | transform: rotate(90deg) 643 | } 644 | .mint-spinner-fading-circle-circle.is-circle4::before { 645 | -webkit-animation-delay: -0.9s; 646 | animation-delay: -0.9s 647 | } 648 | .mint-spinner-fading-circle-circle.is-circle5 { 649 | -webkit-transform: rotate(120deg); 650 | transform: rotate(120deg) 651 | } 652 | .mint-spinner-fading-circle-circle.is-circle5::before { 653 | -webkit-animation-delay: -0.8s; 654 | animation-delay: -0.8s 655 | } 656 | .mint-spinner-fading-circle-circle.is-circle6 { 657 | -webkit-transform: rotate(150deg); 658 | transform: rotate(150deg) 659 | } 660 | .mint-spinner-fading-circle-circle.is-circle6::before { 661 | -webkit-animation-delay: -0.7s; 662 | animation-delay: -0.7s 663 | } 664 | .mint-spinner-fading-circle-circle.is-circle7 { 665 | -webkit-transform: rotate(180deg); 666 | transform: rotate(180deg) 667 | } 668 | .mint-spinner-fading-circle-circle.is-circle7::before { 669 | -webkit-animation-delay: -0.6s; 670 | animation-delay: -0.6s 671 | } 672 | .mint-spinner-fading-circle-circle.is-circle8 { 673 | -webkit-transform: rotate(210deg); 674 | transform: rotate(210deg) 675 | } 676 | .mint-spinner-fading-circle-circle.is-circle8::before { 677 | -webkit-animation-delay: -0.5s; 678 | animation-delay: -0.5s 679 | } 680 | .mint-spinner-fading-circle-circle.is-circle9 { 681 | -webkit-transform: rotate(240deg); 682 | transform: rotate(240deg) 683 | } 684 | .mint-spinner-fading-circle-circle.is-circle9::before { 685 | -webkit-animation-delay: -0.4s; 686 | animation-delay: -0.4s 687 | } 688 | .mint-spinner-fading-circle-circle.is-circle10 { 689 | -webkit-transform: rotate(270deg); 690 | transform: rotate(270deg) 691 | } 692 | .mint-spinner-fading-circle-circle.is-circle10::before { 693 | -webkit-animation-delay: -0.3s; 694 | animation-delay: -0.3s 695 | } 696 | .mint-spinner-fading-circle-circle.is-circle11 { 697 | -webkit-transform: rotate(300deg); 698 | transform: rotate(300deg) 699 | } 700 | .mint-spinner-fading-circle-circle.is-circle11::before { 701 | -webkit-animation-delay: -0.2s; 702 | animation-delay: -0.2s 703 | } 704 | .mint-spinner-fading-circle-circle.is-circle12 { 705 | -webkit-transform: rotate(330deg); 706 | transform: rotate(330deg) 707 | } 708 | .mint-spinner-fading-circle-circle.is-circle12::before { 709 | -webkit-animation-delay: -0.1s; 710 | animation-delay: -0.1s 711 | } 712 | @-webkit-keyframes mint-fading-circle { 713 | 0%, 39%, 100% { 714 | opacity: 0 715 | } 716 | 40% { 717 | opacity: 1 718 | } 719 | } 720 | @keyframes mint-fading-circle { 721 | 0%, 39%, 100% { 722 | opacity: 0 723 | } 724 | 40% { 725 | opacity: 1 726 | } 727 | } 728 | /* Cell Component */ 729 | /* Header Component */ 730 | /* Button Component */ 731 | /* Tab Item Component */ 732 | /* Tabbar Component */ 733 | /* Navbar Component */ 734 | /* Checklist Component */ 735 | /* Radio Component */ 736 | /* z-index */ 737 | .mint-tab-item { 738 | display: block; 739 | padding: 7px 0; 740 | -webkit-box-flex: 1; 741 | -ms-flex: 1; 742 | flex: 1; 743 | text-decoration: none 744 | } 745 | .mint-tab-item-icon { 746 | width: 24px; 747 | height: 24px; 748 | margin: 0 auto 5px 749 | } 750 | .mint-tab-item-icon:empty { 751 | display: none 752 | } 753 | .mint-tab-item-icon > * { 754 | display: block; 755 | width: 100%; 756 | height: 100% 757 | } 758 | .mint-tab-item-label { 759 | color: inherit; 760 | font-size: 12px; 761 | line-height: 1 762 | } 763 | 764 | .mint-tab-container-item { 765 | -ms-flex-negative: 0; 766 | flex-shrink: 0; 767 | width: 100% 768 | } 769 | 770 | .mint-tab-container { 771 | overflow: hidden; 772 | position: relative; 773 | } 774 | .mint-tab-container .swipe-transition { 775 | -webkit-transition: -webkit-transform 150ms ease-in-out; 776 | transition: -webkit-transform 150ms ease-in-out; 777 | transition: transform 150ms ease-in-out; 778 | transition: transform 150ms ease-in-out, -webkit-transform 150ms ease-in-out; 779 | } 780 | .mint-tab-container-wrap { 781 | display: -webkit-box; 782 | display: -ms-flexbox; 783 | display: flex; 784 | } 785 | /* Cell Component */ 786 | /* Header Component */ 787 | /* Button Component */ 788 | /* Tab Item Component */ 789 | /* Tabbar Component */ 790 | /* Navbar Component */ 791 | /* Checklist Component */ 792 | /* Radio Component */ 793 | /* z-index */ 794 | .mint-navbar { 795 | background-color: #fff; 796 | display: -webkit-box; 797 | display: -ms-flexbox; 798 | display: flex; 799 | text-align: center; 800 | } 801 | .mint-navbar .mint-tab-item { 802 | padding: 17px 0; 803 | font-size: 15px 804 | } 805 | .mint-navbar .mint-tab-item:last-child { 806 | border-right: 0; 807 | } 808 | .mint-navbar .mint-tab-item.is-selected { 809 | border-bottom: 3px solid #26a2ff; 810 | color: #26a2ff; 811 | margin-bottom: -3px; 812 | } 813 | .mint-navbar.is-fixed { 814 | top: 0; 815 | right: 0; 816 | left: 0; 817 | position: fixed; 818 | z-index: 1; 819 | } 820 | /* Cell Component */ 821 | /* Header Component */ 822 | /* Button Component */ 823 | /* Tab Item Component */ 824 | /* Tabbar Component */ 825 | /* Navbar Component */ 826 | /* Checklist Component */ 827 | /* Radio Component */ 828 | /* z-index */ 829 | .mint-tabbar { 830 | background-image: -webkit-linear-gradient(top, #d9d9d9, #d9d9d9 50%, transparent 50%); 831 | background-image: linear-gradient(180deg, #d9d9d9, #d9d9d9 50%, transparent 50%); 832 | background-size: 100% 1px; 833 | background-repeat: no-repeat; 834 | background-position: top left; 835 | position: relative; 836 | background-color: #fafafa; 837 | display: -webkit-box; 838 | display: -ms-flexbox; 839 | display: flex; 840 | right: 0; 841 | bottom: 0; 842 | left: 0; 843 | position: absolute; 844 | text-align: center; 845 | } 846 | .mint-tabbar > .mint-tab-item.is-selected { 847 | background-color: #eaeaea; 848 | color: #26a2ff; 849 | } 850 | .mint-tabbar.is-fixed { 851 | right: 0; 852 | bottom: 0; 853 | left: 0; 854 | position: fixed; 855 | z-index: 1; 856 | } 857 | /* Cell Component */ 858 | /* Header Component */ 859 | /* Button Component */ 860 | /* Tab Item Component */ 861 | /* Tabbar Component */ 862 | /* Navbar Component */ 863 | /* Checklist Component */ 864 | /* Radio Component */ 865 | /* z-index */ 866 | .mint-search { 867 | height: 100%; 868 | height: 100vh; 869 | overflow: hidden; 870 | } 871 | .mint-searchbar { 872 | position: relative; 873 | -webkit-box-align: center; 874 | -ms-flex-align: center; 875 | align-items: center; 876 | background-color: #d9d9d9; 877 | box-sizing: border-box; 878 | display: -webkit-box; 879 | display: -ms-flexbox; 880 | display: flex; 881 | padding: 8px 10px; 882 | z-index: 1; 883 | } 884 | .mint-searchbar-inner { 885 | -webkit-box-align: center; 886 | -ms-flex-align: center; 887 | align-items: center; 888 | background-color: #fff; 889 | border-radius: 2px; 890 | display: -webkit-box; 891 | display: -ms-flexbox; 892 | display: flex; 893 | -webkit-box-flex: 1; 894 | -ms-flex: 1; 895 | flex: 1; 896 | height: 28px; 897 | padding: 4px 6px; 898 | } 899 | .mint-searchbar-inner .mintui-search { 900 | font-size: 12px; 901 | color: #d9d9d9; 902 | } 903 | .mint-searchbar-core { 904 | -webkit-appearance: none; 905 | -moz-appearance: none; 906 | appearance: none; 907 | border: 0; 908 | box-sizing: border-box; 909 | height: 100%; 910 | outline: 0; 911 | } 912 | .mint-searchbar-placeholder { 913 | -webkit-box-align: center; 914 | -ms-flex-align: center; 915 | align-items: center; 916 | color: #9b9b9b; 917 | display: -webkit-box; 918 | display: -ms-flexbox; 919 | display: flex; 920 | font-size: 12px; 921 | -webkit-box-pack: center; 922 | -ms-flex-pack: center; 923 | justify-content: center; 924 | top: 0; 925 | right: 0; 926 | bottom: 0; 927 | left: 0; 928 | position: absolute; 929 | } 930 | .mint-searchbar-placeholder .mintui-search { 931 | font-size: 12px; 932 | } 933 | .mint-searchbar-cancel { 934 | color: #26a2ff; 935 | margin-left: 10px; 936 | text-decoration: none; 937 | } 938 | .mint-search-list { 939 | overflow: auto; 940 | padding-top: 44px; 941 | top: 0; 942 | right: 0; 943 | bottom: 0; 944 | left: 0; 945 | position: absolute; 946 | } 947 | /* Cell Component */ 948 | /* Header Component */ 949 | /* Button Component */ 950 | /* Tab Item Component */ 951 | /* Tabbar Component */ 952 | /* Navbar Component */ 953 | /* Checklist Component */ 954 | /* Radio Component */ 955 | /* z-index */ 956 | .mint-checklist .mint-cell { 957 | padding: 0; 958 | } 959 | .mint-checklist.is-limit .mint-checkbox-core:not(:checked) { 960 | background-color: #d9d9d9; 961 | border-color: #d9d9d9; 962 | } 963 | .mint-checklist-label { 964 | display: block; 965 | padding: 0 10px; 966 | } 967 | .mint-checklist-title { 968 | color: #888; 969 | display: block; 970 | font-size: 12px; 971 | margin: 8px; 972 | } 973 | .mint-checkbox {} 974 | .mint-checkbox.is-right { 975 | float: right; 976 | } 977 | .mint-checkbox-label { 978 | vertical-align: middle; 979 | margin-left: 6px; 980 | } 981 | .mint-checkbox-input { 982 | display: none; 983 | } 984 | .mint-checkbox-input:checked + .mint-checkbox-core { 985 | background-color: #26a2ff; 986 | border-color: #26a2ff; 987 | } 988 | .mint-checkbox-input:checked + .mint-checkbox-core::after { 989 | border-color: #fff; 990 | -webkit-transform: rotate(45deg) scale(1); 991 | transform: rotate(45deg) scale(1); 992 | } 993 | .mint-checkbox-input[disabled] + .mint-checkbox-core { 994 | background-color: #d9d9d9; 995 | border-color: #ccc; 996 | } 997 | .mint-checkbox-core { 998 | display: inline-block; 999 | background-color: #fff; 1000 | border-radius: 100%; 1001 | border: 1px solid #ccc; 1002 | position: relative; 1003 | width: 20px; 1004 | height: 20px; 1005 | vertical-align: middle; 1006 | } 1007 | .mint-checkbox-core::after { 1008 | border: 2px solid transparent; 1009 | border-left: 0; 1010 | border-top: 0; 1011 | content: " "; 1012 | top: 3px; 1013 | left: 6px; 1014 | position: absolute; 1015 | width: 4px; 1016 | height: 8px; 1017 | -webkit-transform: rotate(45deg) scale(0); 1018 | transform: rotate(45deg) scale(0); 1019 | -webkit-transition: -webkit-transform .2s; 1020 | transition: -webkit-transform .2s; 1021 | transition: transform .2s; 1022 | transition: transform .2s, -webkit-transform .2s; 1023 | } 1024 | /* Cell Component */ 1025 | /* Header Component */ 1026 | /* Button Component */ 1027 | /* Tab Item Component */ 1028 | /* Tabbar Component */ 1029 | /* Navbar Component */ 1030 | /* Checklist Component */ 1031 | /* Radio Component */ 1032 | /* z-index */ 1033 | .mint-radiolist .mint-cell { 1034 | padding: 0; 1035 | } 1036 | .mint-radiolist-label { 1037 | display: block; 1038 | padding: 0 10px; 1039 | } 1040 | .mint-radiolist-title { 1041 | font-size: 12px; 1042 | margin: 8px; 1043 | display: block; 1044 | color: #888; 1045 | } 1046 | .mint-radio {} 1047 | .mint-radio.is-right { 1048 | float: right; 1049 | } 1050 | .mint-radio-label { 1051 | vertical-align: middle; 1052 | margin-left: 6px; 1053 | } 1054 | .mint-radio-input { 1055 | display: none; 1056 | } 1057 | .mint-radio-input:checked + .mint-radio-core { 1058 | background-color: #26a2ff; 1059 | border-color: #26a2ff; 1060 | } 1061 | .mint-radio-input:checked + .mint-radio-core::after { 1062 | background-color: #fff; 1063 | -webkit-transform: scale(1); 1064 | transform: scale(1); 1065 | } 1066 | .mint-radio-input[disabled] + .mint-radio-core { 1067 | background-color: #d9d9d9; 1068 | border-color: #ccc; 1069 | } 1070 | .mint-radio-core { 1071 | display: inline-block; 1072 | background-color: #fff; 1073 | border-radius: 100%; 1074 | border: 1px solid #ccc; 1075 | position: relative; 1076 | width: 20px; 1077 | height: 20px; 1078 | vertical-align: middle; 1079 | } 1080 | .mint-radio-core::after { 1081 | content: " "; 1082 | border-radius: 100%; 1083 | top: 5px; 1084 | left: 5px; 1085 | position: absolute; 1086 | width: 8px; 1087 | height: 8px; 1088 | -webkit-transition: -webkit-transform .2s; 1089 | transition: -webkit-transform .2s; 1090 | transition: transform .2s; 1091 | transition: transform .2s, -webkit-transform .2s; 1092 | -webkit-transform: scale(0); 1093 | transform: scale(0); 1094 | } 1095 | 1096 | .mint-loadmore { 1097 | overflow: hidden 1098 | } 1099 | .mint-loadmore-content {} 1100 | .mint-loadmore-content.is-dropped { 1101 | -webkit-transition: .2s; 1102 | transition: .2s 1103 | } 1104 | .mint-loadmore-top, .mint-loadmore-bottom { 1105 | text-align: center; 1106 | height: 50px; 1107 | line-height: 50px 1108 | } 1109 | .mint-loadmore-top { 1110 | margin-top: -50px 1111 | } 1112 | .mint-loadmore-bottom { 1113 | margin-bottom: -50px 1114 | } 1115 | .mint-loadmore-spinner { 1116 | display: inline-block; 1117 | margin-right: 5px; 1118 | vertical-align: middle 1119 | } 1120 | .mint-loadmore-text { 1121 | vertical-align: middle 1122 | } 1123 | 1124 | .mint-actionsheet { 1125 | position: fixed; 1126 | background: #e0e0e0; 1127 | width: 100%; 1128 | text-align: center; 1129 | bottom: 0; 1130 | left: 50%; 1131 | -webkit-transform: translate3d(-50%, 0, 0); 1132 | transform: translate3d(-50%, 0, 0); 1133 | -webkit-backface-visibility: hidden; 1134 | backface-visibility: hidden; 1135 | -webkit-transition: -webkit-transform .3s ease-out; 1136 | transition: -webkit-transform .3s ease-out; 1137 | transition: transform .3s ease-out; 1138 | transition: transform .3s ease-out, -webkit-transform .3s ease-out; 1139 | } 1140 | .mint-actionsheet-list { 1141 | list-style: none; 1142 | padding: 0; 1143 | margin: 0; 1144 | } 1145 | .mint-actionsheet-listitem { 1146 | border-bottom: solid 1px #e0e0e0; 1147 | } 1148 | .mint-actionsheet-listitem, .mint-actionsheet-button { 1149 | display: block; 1150 | width: 100%; 1151 | height: 45px; 1152 | line-height: 45px; 1153 | font-size: 18px; 1154 | color: #333; 1155 | background-color: #fff; 1156 | } 1157 | .mint-actionsheet-listitem:active, .mint-actionsheet-button:active { 1158 | background-color: #f0f0f0; 1159 | } 1160 | .actionsheet-float-enter, .actionsheet-float-leave-active { 1161 | -webkit-transform: translate3d(-50%, 100%, 0); 1162 | transform: translate3d(-50%, 100%, 0); 1163 | } 1164 | .v-modal-enter { 1165 | -webkit-animation: v-modal-in .2s ease; 1166 | animation: v-modal-in .2s ease; 1167 | } 1168 | 1169 | .v-modal-leave { 1170 | -webkit-animation: v-modal-out .2s ease forwards; 1171 | animation: v-modal-out .2s ease forwards; 1172 | } 1173 | 1174 | @-webkit-keyframes v-modal-in { 1175 | 0% { 1176 | opacity: 0; 1177 | } 1178 | 100% { 1179 | } 1180 | } 1181 | 1182 | @keyframes v-modal-in { 1183 | 0% { 1184 | opacity: 0; 1185 | } 1186 | 100% { 1187 | } 1188 | } 1189 | 1190 | @-webkit-keyframes v-modal-out { 1191 | 0% { 1192 | } 1193 | 100% { 1194 | opacity: 0; 1195 | } 1196 | } 1197 | 1198 | @keyframes v-modal-out { 1199 | 0% { 1200 | } 1201 | 100% { 1202 | opacity: 0; 1203 | } 1204 | } 1205 | 1206 | .v-modal { 1207 | position: fixed; 1208 | left: 0; 1209 | top: 0; 1210 | width: 100%; 1211 | height: 100%; 1212 | opacity: 0.5; 1213 | background: #000; 1214 | } 1215 | 1216 | .mint-popup { 1217 | position: fixed; 1218 | background: #fff; 1219 | top: 50%; 1220 | left: 50%; 1221 | -webkit-transform: translate3d(-50%, -50%, 0); 1222 | transform: translate3d(-50%, -50%, 0); 1223 | -webkit-backface-visibility: hidden; 1224 | backface-visibility: hidden; 1225 | -webkit-transition: .2s ease-out; 1226 | transition: .2s ease-out; 1227 | } 1228 | .mint-popup-top { 1229 | top: 0; 1230 | right: auto; 1231 | bottom: auto; 1232 | left: 50%; 1233 | -webkit-transform: translate3d(-50%, 0, 0); 1234 | transform: translate3d(-50%, 0, 0); 1235 | } 1236 | .mint-popup-right { 1237 | top: 50%; 1238 | right: 0; 1239 | bottom: auto; 1240 | left: auto; 1241 | -webkit-transform: translate3d(0, -50%, 0); 1242 | transform: translate3d(0, -50%, 0); 1243 | } 1244 | .mint-popup-bottom { 1245 | top: auto; 1246 | right: auto; 1247 | bottom: 0; 1248 | left: 50%; 1249 | -webkit-transform: translate3d(-50%, 0, 0); 1250 | transform: translate3d(-50%, 0, 0); 1251 | } 1252 | .mint-popup-left { 1253 | top: 50%; 1254 | right: auto; 1255 | bottom: auto; 1256 | left: 0; 1257 | -webkit-transform: translate3d(0, -50%, 0); 1258 | transform: translate3d(0, -50%, 0); 1259 | } 1260 | .popup-slide-top-enter, .popup-slide-top-leave-active { 1261 | -webkit-transform: translate3d(-50%, -100%, 0); 1262 | transform: translate3d(-50%, -100%, 0); 1263 | } 1264 | .popup-slide-right-enter, .popup-slide-right-leave-active { 1265 | -webkit-transform: translate3d(100%, -50%, 0); 1266 | transform: translate3d(100%, -50%, 0); 1267 | } 1268 | .popup-slide-bottom-enter, .popup-slide-bottom-leave-active { 1269 | -webkit-transform: translate3d(-50%, 100%, 0); 1270 | transform: translate3d(-50%, 100%, 0); 1271 | } 1272 | .popup-slide-left-enter, .popup-slide-left-leave-active { 1273 | -webkit-transform: translate3d(-100%, -50%, 0); 1274 | transform: translate3d(-100%, -50%, 0); 1275 | } 1276 | .popup-fade-enter, .popup-fade-leave-active { 1277 | opacity: 0; 1278 | } 1279 | 1280 | .mint-swipe { 1281 | overflow: hidden; 1282 | position: relative; 1283 | height: 100%; 1284 | } 1285 | .mint-swipe-items-wrap { 1286 | position: relative; 1287 | overflow: hidden; 1288 | height: 100%; 1289 | } 1290 | .mint-swipe-items-wrap > div { 1291 | position: absolute; 1292 | -webkit-transform: translateX(-100%); 1293 | transform: translateX(-100%); 1294 | width: 100%; 1295 | height: 100%; 1296 | display: none 1297 | } 1298 | .mint-swipe-items-wrap > div.is-active { 1299 | display: block; 1300 | -webkit-transform: none; 1301 | transform: none; 1302 | } 1303 | .mint-swipe-indicators { 1304 | position: absolute; 1305 | bottom: 10px; 1306 | left: 50%; 1307 | -webkit-transform: translateX(-50%); 1308 | transform: translateX(-50%); 1309 | } 1310 | .mint-swipe-indicator { 1311 | width: 8px; 1312 | height: 8px; 1313 | display: inline-block; 1314 | border-radius: 100%; 1315 | background: #000; 1316 | opacity: 0.2; 1317 | margin: 0 3px; 1318 | } 1319 | .mint-swipe-indicator.is-active { 1320 | background: #fff; 1321 | } 1322 | 1323 | 1324 | .mt-range { 1325 | position: relative; 1326 | display: -webkit-box; 1327 | display: -ms-flexbox; 1328 | display: flex; 1329 | height: 30px; 1330 | line-height: 30px 1331 | } 1332 | .mt-range > * { 1333 | display: -ms-flexbox; 1334 | display: flex; 1335 | display: -webkit-box 1336 | } 1337 | .mt-range *[slot=start] { 1338 | margin-right: 5px 1339 | } 1340 | .mt-range *[slot=end] { 1341 | margin-left: 5px 1342 | } 1343 | .mt-range-content { 1344 | position: relative; 1345 | -webkit-box-flex: 1; 1346 | -ms-flex: 1; 1347 | flex: 1; 1348 | margin-right: 30px 1349 | } 1350 | .mt-range-runway { 1351 | position: absolute; 1352 | top: 50%; 1353 | -webkit-transform: translateY(-50%); 1354 | transform: translateY(-50%); 1355 | left: 0; 1356 | right: -30px; 1357 | border-top-color: #a9acb1; 1358 | border-top-style: solid 1359 | } 1360 | .mt-range-thumb { 1361 | background-color: #fff; 1362 | position: absolute; 1363 | left: 0; 1364 | top: 0; 1365 | width: 30px; 1366 | height: 30px; 1367 | border-radius: 100%; 1368 | cursor: move; 1369 | box-shadow: 0 1px 3px rgba(0,0,0,.4) 1370 | } 1371 | .mt-range-progress { 1372 | position: absolute; 1373 | display: block; 1374 | background-color: #26a2ff; 1375 | top: 50%; 1376 | -webkit-transform: translateY(-50%); 1377 | transform: translateY(-50%); 1378 | width: 0 1379 | } 1380 | .mt-range--disabled { 1381 | opacity: 0.5 1382 | } 1383 | 1384 | .picker { 1385 | overflow: hidden; 1386 | } 1387 | .picker-toolbar { 1388 | height: 40px; 1389 | } 1390 | .picker-items { 1391 | display: -webkit-box; 1392 | display: -ms-flexbox; 1393 | display: flex; 1394 | -webkit-box-pack: center; 1395 | -ms-flex-pack: center; 1396 | justify-content: center; 1397 | padding: 0; 1398 | text-align: right; 1399 | font-size: 24px; 1400 | position: relative; 1401 | } 1402 | .picker-center-highlight { 1403 | height: 36px; 1404 | box-sizing: border-box; 1405 | position: absolute; 1406 | left: 0; 1407 | width: 100%; 1408 | top: 50%; 1409 | margin-top: -18px; 1410 | pointer-events: none 1411 | } 1412 | .picker-center-highlight:before, .picker-center-highlight:after { 1413 | content: ''; 1414 | position: absolute; 1415 | height: 1px; 1416 | width: 100%; 1417 | background-color: #eaeaea; 1418 | display: block; 1419 | z-index: 15; 1420 | -webkit-transform: scaleY(0.5); 1421 | transform: scaleY(0.5); 1422 | } 1423 | .picker-center-highlight:before { 1424 | left: 0; 1425 | top: 0; 1426 | bottom: auto; 1427 | right: auto; 1428 | } 1429 | .picker-center-highlight:after { 1430 | left: 0; 1431 | bottom: 0; 1432 | right: auto; 1433 | top: auto; 1434 | } 1435 | 1436 | .picker-slot { 1437 | font-size: 18px; 1438 | overflow: hidden; 1439 | position: relative; 1440 | max-height: 100% 1441 | } 1442 | .picker-slot.picker-slot-left { 1443 | text-align: left; 1444 | } 1445 | .picker-slot.picker-slot-center { 1446 | text-align: center; 1447 | } 1448 | .picker-slot.picker-slot-right { 1449 | text-align: right; 1450 | } 1451 | .picker-slot.picker-slot-divider { 1452 | color: #000; 1453 | display: -webkit-box; 1454 | display: -ms-flexbox; 1455 | display: flex; 1456 | -webkit-box-align: center; 1457 | -ms-flex-align: center; 1458 | align-items: center 1459 | } 1460 | .picker-slot-wrapper { 1461 | -webkit-transition-duration: 0.3s; 1462 | transition-duration: 0.3s; 1463 | -webkit-transition-timing-function: ease-out; 1464 | transition-timing-function: ease-out; 1465 | -webkit-backface-visibility: hidden; 1466 | backface-visibility: hidden; 1467 | } 1468 | .picker-slot-wrapper.dragging, .picker-slot-wrapper.dragging .picker-item { 1469 | -webkit-transition-duration: 0s; 1470 | transition-duration: 0s; 1471 | } 1472 | .picker-item { 1473 | height: 36px; 1474 | line-height: 36px; 1475 | padding: 0 10px; 1476 | white-space: nowrap; 1477 | position: relative; 1478 | overflow: hidden; 1479 | text-overflow: ellipsis; 1480 | color: #707274; 1481 | left: 0; 1482 | top: 0; 1483 | width: 100%; 1484 | box-sizing: border-box; 1485 | -webkit-transition-duration: .3s; 1486 | transition-duration: .3s; 1487 | -webkit-backface-visibility: hidden; 1488 | backface-visibility: hidden; 1489 | } 1490 | .picker-slot-absolute .picker-item { 1491 | position: absolute; 1492 | } 1493 | .picker-item.picker-item-far { 1494 | pointer-events: none 1495 | } 1496 | .picker-item.picker-selected { 1497 | color: #000; 1498 | -webkit-transform: translate3d(0, 0, 0) rotateX(0); 1499 | transform: translate3d(0, 0, 0) rotateX(0); 1500 | } 1501 | .picker-3d .picker-items { 1502 | overflow: hidden; 1503 | -webkit-perspective: 700px; 1504 | perspective: 700px; 1505 | } 1506 | .picker-3d .picker-item, .picker-3d .picker-slot, .picker-3d .picker-slot-wrapper { 1507 | -webkit-transform-style: preserve-3d; 1508 | transform-style: preserve-3d 1509 | } 1510 | .picker-3d .picker-slot { 1511 | overflow: visible 1512 | } 1513 | .picker-3d .picker-item { 1514 | -webkit-transform-origin: center center; 1515 | transform-origin: center center; 1516 | -webkit-backface-visibility: hidden; 1517 | backface-visibility: hidden; 1518 | -webkit-transition-timing-function: ease-out; 1519 | transition-timing-function: ease-out 1520 | } 1521 | 1522 | .mt-progress { 1523 | position: relative; 1524 | display: -webkit-box; 1525 | display: -ms-flexbox; 1526 | display: flex; 1527 | height: 30px; 1528 | line-height: 30px 1529 | } 1530 | .mt-progress > * { 1531 | display: -ms-flexbox; 1532 | display: flex; 1533 | display: -webkit-box 1534 | } 1535 | .mt-progress *[slot="start"] { 1536 | margin-right: 5px 1537 | } 1538 | .mt-progress *[slot="end"] { 1539 | margin-left: 5px 1540 | } 1541 | .mt-progress-content { 1542 | position: relative; 1543 | -webkit-box-flex: 1; 1544 | -ms-flex: 1; 1545 | flex: 1 1546 | } 1547 | .mt-progress-runway { 1548 | position: absolute; 1549 | -webkit-transform: translate(0, -50%); 1550 | transform: translate(0, -50%); 1551 | top: 50%; 1552 | left: 0; 1553 | right: 0; 1554 | background-color: #ebebeb; 1555 | height: 3px 1556 | } 1557 | .mt-progress-progress { 1558 | position: absolute; 1559 | display: block; 1560 | background-color: #26a2ff; 1561 | top: 50%; 1562 | -webkit-transform: translate(0, -50%); 1563 | transform: translate(0, -50%); 1564 | width: 0 1565 | } 1566 | 1567 | .mint-toast { 1568 | position: fixed; 1569 | max-width: 80%; 1570 | border-radius: 5px; 1571 | background: rgba(0, 0, 0, 0.7); 1572 | color: #fff; 1573 | box-sizing: border-box; 1574 | text-align: center; 1575 | z-index: 1000; 1576 | -webkit-transition: opacity .3s linear; 1577 | transition: opacity .3s linear 1578 | } 1579 | .mint-toast.is-placebottom { 1580 | bottom: 50px; 1581 | left: 50%; 1582 | -webkit-transform: translate(-50%, 0); 1583 | transform: translate(-50%, 0) 1584 | } 1585 | .mint-toast.is-placemiddle { 1586 | left: 50%; 1587 | top: 50%; 1588 | -webkit-transform: translate(-50%, -50%); 1589 | transform: translate(-50%, -50%) 1590 | } 1591 | .mint-toast.is-placetop { 1592 | top: 50px; 1593 | left: 50%; 1594 | -webkit-transform: translate(-50%, 0); 1595 | transform: translate(-50%, 0) 1596 | } 1597 | .mint-toast-icon { 1598 | display: block; 1599 | text-align: center; 1600 | font-size: 56px 1601 | } 1602 | .mint-toast-text { 1603 | font-size: 14px; 1604 | display: block; 1605 | text-align: center 1606 | } 1607 | .mint-toast-pop-enter, .mint-toast-pop-leave-active { 1608 | opacity: 0 1609 | } 1610 | 1611 | .mint-indicator { 1612 | -webkit-transition: opacity .2s linear; 1613 | transition: opacity .2s linear; 1614 | } 1615 | .mint-indicator-wrapper { 1616 | top: 50%; 1617 | left: 50%; 1618 | position: fixed; 1619 | -webkit-transform: translate(-50%, -50%); 1620 | transform: translate(-50%, -50%); 1621 | border-radius: 5px; 1622 | background: rgba(0, 0, 0, 0.7); 1623 | color: white; 1624 | box-sizing: border-box; 1625 | text-align: center; 1626 | } 1627 | .mint-indicator-text { 1628 | display: block; 1629 | color: #fff; 1630 | text-align: center; 1631 | margin-top: 10px; 1632 | font-size: 16px; 1633 | } 1634 | .mint-indicator-spin { 1635 | display: inline-block; 1636 | text-align: center; 1637 | } 1638 | .mint-indicator-mask { 1639 | top: 0; 1640 | left: 0; 1641 | position: fixed; 1642 | width: 100%; 1643 | height: 100%; 1644 | opacity: 0; 1645 | background: transparent; 1646 | } 1647 | .mint-indicator-enter, .mint-indicator-leave-active { 1648 | opacity: 0; 1649 | } 1650 | 1651 | .mint-msgbox { 1652 | position: fixed; 1653 | top: 50%; 1654 | left: 50%; 1655 | -webkit-transform: translate3d(-50%, -50%, 0); 1656 | transform: translate3d(-50%, -50%, 0); 1657 | background-color: #fff; 1658 | width: 85%; 1659 | border-radius: 3px; 1660 | font-size: 16px; 1661 | -webkit-user-select: none; 1662 | overflow: hidden; 1663 | -webkit-backface-visibility: hidden; 1664 | backface-visibility: hidden; 1665 | -webkit-transition: .2s; 1666 | transition: .2s; 1667 | } 1668 | .mint-msgbox-header { 1669 | padding: 15px 0 0; 1670 | } 1671 | .mint-msgbox-content { 1672 | padding: 10px 20px 15px; 1673 | border-bottom: 1px solid #ddd; 1674 | min-height: 36px; 1675 | position: relative; 1676 | } 1677 | .mint-msgbox-input { 1678 | padding-top: 15px; 1679 | } 1680 | .mint-msgbox-input input { 1681 | border: 1px solid #dedede; 1682 | border-radius: 5px; 1683 | padding: 4px 5px; 1684 | width: 100%; 1685 | -webkit-appearance: none; 1686 | -moz-appearance: none; 1687 | appearance: none; 1688 | outline: none; 1689 | } 1690 | .mint-msgbox-input input.invalid { 1691 | border-color: #ff4949; 1692 | } 1693 | .mint-msgbox-input input.invalid:focus { 1694 | border-color: #ff4949; 1695 | } 1696 | .mint-msgbox-errormsg { 1697 | color: red; 1698 | font-size: 12px; 1699 | min-height: 18px; 1700 | margin-top: 2px; 1701 | } 1702 | .mint-msgbox-title { 1703 | text-align: center; 1704 | padding-left: 0; 1705 | margin-bottom: 0; 1706 | font-size: 16px; 1707 | font-weight: 700; 1708 | color: #333; 1709 | } 1710 | .mint-msgbox-message { 1711 | color: #999; 1712 | margin: 0; 1713 | text-align: center; 1714 | line-height: 36px; 1715 | } 1716 | .mint-msgbox-btns { 1717 | display: -webkit-box; 1718 | display: -ms-flexbox; 1719 | display: flex; 1720 | height: 40px; 1721 | line-height: 40px; 1722 | } 1723 | .mint-msgbox-btn { 1724 | line-height: 35px; 1725 | display: block; 1726 | background-color: #fff; 1727 | -webkit-box-flex: 1; 1728 | -ms-flex: 1; 1729 | flex: 1; 1730 | margin: 0; 1731 | border: 0; 1732 | } 1733 | .mint-msgbox-btn:focus { 1734 | outline: none; 1735 | } 1736 | .mint-msgbox-btn:active { 1737 | background-color: #fff; 1738 | } 1739 | .mint-msgbox-cancel { 1740 | width: 50%; 1741 | border-right: 1px solid #ddd; 1742 | } 1743 | .mint-msgbox-cancel:active { 1744 | color: #000; 1745 | } 1746 | .mint-msgbox-confirm { 1747 | color: #26a2ff; 1748 | width: 50%; 1749 | } 1750 | .mint-msgbox-confirm:active { 1751 | color: #26a2ff; 1752 | } 1753 | .msgbox-bounce-enter { 1754 | opacity: 0; 1755 | -webkit-transform: translate3d(-50%, -50%, 0) scale(0.7); 1756 | transform: translate3d(-50%, -50%, 0) scale(0.7); 1757 | } 1758 | .msgbox-bounce-leave-active { 1759 | opacity: 0; 1760 | -webkit-transform: translate3d(-50%, -50%, 0) scale(0.9); 1761 | transform: translate3d(-50%, -50%, 0) scale(0.9); 1762 | } 1763 | 1764 | .v-modal-enter { 1765 | -webkit-animation: v-modal-in .2s ease; 1766 | animation: v-modal-in .2s ease; 1767 | } 1768 | .v-modal-leave { 1769 | -webkit-animation: v-modal-out .2s ease forwards; 1770 | animation: v-modal-out .2s ease forwards; 1771 | } 1772 | @-webkit-keyframes v-modal-in { 1773 | 0% { 1774 | opacity: 0; 1775 | } 1776 | 100% { 1777 | } 1778 | } 1779 | @keyframes v-modal-in { 1780 | 0% { 1781 | opacity: 0; 1782 | } 1783 | 100% { 1784 | } 1785 | } 1786 | @-webkit-keyframes v-modal-out { 1787 | 0% { 1788 | } 1789 | 100% { 1790 | opacity: 0; 1791 | } 1792 | } 1793 | @keyframes v-modal-out { 1794 | 0% { 1795 | } 1796 | 100% { 1797 | opacity: 0; 1798 | } 1799 | } 1800 | .v-modal { 1801 | position: fixed; 1802 | left: 0; 1803 | top: 0; 1804 | width: 100%; 1805 | height: 100%; 1806 | opacity: 0.5; 1807 | background: #000; 1808 | } 1809 | /* Cell Component */ 1810 | /* Header Component */ 1811 | /* Button Component */ 1812 | /* Tab Item Component */ 1813 | /* Tabbar Component */ 1814 | /* Navbar Component */ 1815 | /* Checklist Component */ 1816 | /* Radio Component */ 1817 | /* z-index */ 1818 | .mint-datetime { 1819 | width: 100%; 1820 | } 1821 | .mint-datetime .picker-slot-wrapper, .mint-datetime .picker-item { 1822 | -webkit-backface-visibility: hidden; 1823 | backface-visibility: hidden; 1824 | } 1825 | .mint-datetime .picker-toolbar { 1826 | border-bottom: solid 1px #eaeaea; 1827 | } 1828 | .mint-datetime-action { 1829 | display: inline-block; 1830 | width: 50%; 1831 | text-align: center; 1832 | line-height: 40px; 1833 | font-size: 16px; 1834 | color: #26a2ff; 1835 | } 1836 | .mint-datetime-cancel { 1837 | float: left; 1838 | } 1839 | .mint-datetime-confirm { 1840 | float: right; 1841 | } 1842 | /* Cell Component */ 1843 | /* Header Component */ 1844 | /* Button Component */ 1845 | /* Tab Item Component */ 1846 | /* Tabbar Component */ 1847 | /* Navbar Component */ 1848 | /* Checklist Component */ 1849 | /* Radio Component */ 1850 | /* z-index */ 1851 | .mint-indexlist { 1852 | width: 100%; 1853 | position: relative; 1854 | overflow: hidden 1855 | } 1856 | .mint-indexlist-content { 1857 | margin: 0; 1858 | padding: 0; 1859 | overflow: auto 1860 | } 1861 | .mint-indexlist-nav { 1862 | position: absolute; 1863 | top: 0; 1864 | bottom: 0; 1865 | right: 0; 1866 | margin: 0; 1867 | background-color: #fff; 1868 | border-left: solid 1px #ddd; 1869 | text-align: center; 1870 | max-height: 100%; 1871 | display: -webkit-box; 1872 | display: -ms-flexbox; 1873 | display: flex; 1874 | -webkit-box-orient: vertical; 1875 | -webkit-box-direction: normal; 1876 | -ms-flex-direction: column; 1877 | flex-direction: column; 1878 | -webkit-box-pack: center; 1879 | -ms-flex-pack: center; 1880 | justify-content: center 1881 | } 1882 | .mint-indexlist-navlist { 1883 | padding: 0; 1884 | margin: 0; 1885 | list-style: none; 1886 | max-height: 100%; 1887 | display: -webkit-box; 1888 | display: -ms-flexbox; 1889 | display: flex; 1890 | -webkit-box-orient: vertical; 1891 | -webkit-box-direction: normal; 1892 | -ms-flex-direction: column; 1893 | flex-direction: column 1894 | } 1895 | .mint-indexlist-navitem { 1896 | padding: 2px 6px; 1897 | font-size: 12px; 1898 | -webkit-user-select: none; 1899 | -moz-user-select: none; 1900 | -ms-user-select: none; 1901 | user-select: none; 1902 | -webkit-touch-callout: none 1903 | } 1904 | .mint-indexlist-indicator { 1905 | position: absolute; 1906 | width: 50px; 1907 | height: 50px; 1908 | top: 50%; 1909 | left: 50%; 1910 | -webkit-transform: translate(-50%, -50%); 1911 | transform: translate(-50%, -50%); 1912 | text-align: center; 1913 | line-height: 50px; 1914 | background-color: rgba(0, 0, 0, .7); 1915 | border-radius: 5px; 1916 | color: #fff; 1917 | font-size: 22px 1918 | } 1919 | 1920 | .mint-indexsection { 1921 | padding: 0; 1922 | margin: 0 1923 | } 1924 | .mint-indexsection-index { 1925 | margin: 0; 1926 | padding: 10px; 1927 | background-color: #fafafa 1928 | } 1929 | .mint-indexsection-index + ul { 1930 | padding: 0 1931 | } 1932 | 1933 | .mint-palette-button{ 1934 | display:inline-block; 1935 | position:relative; 1936 | border-radius:50%; 1937 | width: 56px; 1938 | height:56px; 1939 | line-height:56px; 1940 | text-align:center; 1941 | -webkit-transition:-webkit-transform .1s ease-in-out; 1942 | transition:-webkit-transform .1s ease-in-out; 1943 | transition:transform .1s ease-in-out; 1944 | transition:transform .1s ease-in-out, -webkit-transform .1s ease-in-out; 1945 | } 1946 | .mint-main-button{ 1947 | position:absolute; 1948 | top:0; 1949 | left:0; 1950 | width:100%; 1951 | height:100%; 1952 | border-radius:50%; 1953 | background-color:blue; 1954 | font-size:2em; 1955 | } 1956 | .mint-palette-button-active{ 1957 | -webkit-animation: mint-zoom 0.5s ease-in-out; 1958 | animation: mint-zoom 0.5s ease-in-out; 1959 | } 1960 | .mint-sub-button-container>*{ 1961 | position:absolute; 1962 | top:15px; 1963 | left:15px; 1964 | width:25px; 1965 | height:25px; 1966 | -webkit-transition:-webkit-transform .3s ease-in-out; 1967 | transition:-webkit-transform .3s ease-in-out; 1968 | transition:transform .3s ease-in-out; 1969 | transition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out; 1970 | } 1971 | @-webkit-keyframes mint-zoom{ 1972 | 0% {-webkit-transform:scale(1);transform:scale(1) 1973 | } 1974 | 10% {-webkit-transform:scale(1.1);transform:scale(1.1) 1975 | } 1976 | 30% {-webkit-transform:scale(0.9);transform:scale(0.9) 1977 | } 1978 | 50% {-webkit-transform:scale(1.05);transform:scale(1.05) 1979 | } 1980 | 70% {-webkit-transform:scale(0.95);transform:scale(0.95) 1981 | } 1982 | 90% {-webkit-transform:scale(1.01);transform:scale(1.01) 1983 | } 1984 | 100% {-webkit-transform:scale(1);transform:scale(1) 1985 | } 1986 | } 1987 | @keyframes mint-zoom{ 1988 | 0% {-webkit-transform:scale(1);transform:scale(1) 1989 | } 1990 | 10% {-webkit-transform:scale(1.1);transform:scale(1.1) 1991 | } 1992 | 30% {-webkit-transform:scale(0.9);transform:scale(0.9) 1993 | } 1994 | 50% {-webkit-transform:scale(1.05);transform:scale(1.05) 1995 | } 1996 | 70% {-webkit-transform:scale(0.95);transform:scale(0.95) 1997 | } 1998 | 90% {-webkit-transform:scale(1.01);transform:scale(1.01) 1999 | } 2000 | 100% {-webkit-transform:scale(1);transform:scale(1) 2001 | } 2002 | } 2003 | 2004 | @font-face {font-family: "mintui"; 2005 | src: url(data:application/x-font-ttf;base64,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) 2006 | } 2007 | 2008 | .mintui { 2009 | font-family:"mintui" !important; 2010 | font-size:16px; 2011 | font-style:normal; 2012 | -webkit-font-smoothing: antialiased; 2013 | -webkit-text-stroke-width: 0.2px; 2014 | -moz-osx-font-smoothing: grayscale; 2015 | } 2016 | .mintui-search:before { content: "\E604"; } 2017 | .mintui-more:before { content: "\E601"; } 2018 | .mintui-back:before { content: "\E600"; } 2019 | .mintui-field-error:before { content: "\E605"; } 2020 | .mintui-field-warning:before { content: "\E608"; } 2021 | .mintui-success:before { content: "\E602"; } 2022 | .mintui-field-success:before { content: "\E609"; } 2023 | -------------------------------------------------------------------------------- /www/css/reset.css: -------------------------------------------------------------------------------- 1 | @charset 'utf-8'; 2 | *{box-sizing: border-box; border: 0; margin:0; padding: 0;} 3 | html,body,div,span,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,a,address,em,img,ol,ul,li,fieldset,form,label,legend,table,tbody,tfoot,thead,tr,th,td,i,b,s{font-family:Helvetica,Arial,sans-serif;font-size:125%;font-weight:inherit;font-style:inherit;margin:0;padding:0;border:0}ul,ol{list-style:none}a img{vertical-align:top;border:none}a{text-decoration:none}button{overflow:visible;margin:0;padding:0;border:0 none;background-color:transparent}button::-moz-focus-inner{padding:0}input[type=password]{-webkit-text-security:disc}textarea:focus,input:focus,button:focus{outline:none}body{word-wrap:break-word}*{-webkit-tap-highlight-color:rgba(0,0,0,0)}.icon{display:inline-block;zoom:1;vertical-align:middle;background-repeat:no-repeat;background-position:left top}.btn{display:inline-block;zoom:1;text-align:center;vertical-align:middle}.none{display:none} 4 | html{font-size:20px} 5 | @media screen and (min-width:321px) and (max-width:375px){html{font-size:22px}} 6 | @media screen and (min-width:376px) and (max-width:414px){html{font-size:24px}} 7 | @media screen and (min-width:415px) and (max-width:639px){html{font-size:30px}} 8 | textarea,select,input{-webkit-appearance: none; -moz-appearance: none; -o-appearance: none; appearance: none;} 9 | .loading-leave-active { 10 | transition: opacity 0.8s; 11 | } 12 | .loading-leave-active { 13 | opacity: 0; 14 | } 15 | #loader{ 16 | background: #000; 17 | background: -webkit-radial-gradient(#353535, #111); 18 | background: radial-gradient(#353535, #111); 19 | overflow: hidden; 20 | position: absolute; 21 | width: 100%; 22 | height: 100%; 23 | z-index: 99999; 24 | } 25 | .loader-inner { 26 | bottom: 0; 27 | height: 30%; 28 | left: 0; 29 | margin: auto; 30 | position: absolute; 31 | right: 0; 32 | top: 0; 33 | width: 100px; 34 | } 35 | 36 | .loader-line-wrap { 37 | -webkit-animation: 38 | spin 2000ms cubic-bezier(.175, .885, .32, 1.275) infinite; 39 | animation: 40 | spin 2000ms cubic-bezier(.175, .885, .32, 1.275) infinite; 41 | box-sizing: border-box; 42 | height: 50px; 43 | left: 0; 44 | overflow: hidden; 45 | position: absolute; 46 | top: 0; 47 | -webkit-transform-origin: 50% 100%; 48 | transform-origin: 50% 100%; 49 | width: 100px; 50 | } 51 | .loader-line { 52 | border: 4px solid transparent; 53 | border-radius: 100%; 54 | box-sizing: border-box; 55 | height: 100px; 56 | left: 0; 57 | margin: 0 auto; 58 | position: absolute; 59 | right: 0; 60 | top: 0; 61 | width: 100px; 62 | } 63 | .loader-line-wrap:nth-child(1) { -webkit-animation-delay: -50ms; animation-delay: -50ms; } 64 | .loader-line-wrap:nth-child(2) { -webkit-animation-delay: -100ms; animation-delay: -100ms; } 65 | .loader-line-wrap:nth-child(3) { -webkit-animation-delay: -150ms; animation-delay: -150ms; } 66 | .loader-line-wrap:nth-child(4) { -webkit-animation-delay: -200ms; animation-delay: -200ms; } 67 | .loader-line-wrap:nth-child(5) { -webkit-animation-delay: -250ms; animation-delay: -250ms; } 68 | 69 | .loader-line-wrap:nth-child(1) .loader-line { 70 | border-color: hsl(0, 80%, 60%); 71 | height: 90px; 72 | width: 90px; 73 | top: 7px; 74 | } 75 | .loader-line-wrap:nth-child(2) .loader-line { 76 | border-color: hsl(60, 80%, 60%); 77 | height: 76px; 78 | width: 76px; 79 | top: 14px; 80 | } 81 | .loader-line-wrap:nth-child(3) .loader-line { 82 | border-color: hsl(120, 80%, 60%); 83 | height: 62px; 84 | width: 62px; 85 | top: 21px; 86 | } 87 | .loader-line-wrap:nth-child(4) .loader-line { 88 | border-color: hsl(180, 80%, 60%); 89 | height: 48px; 90 | width: 48px; 91 | top: 28px; 92 | } 93 | .loader-line-wrap:nth-child(5) .loader-line { 94 | border-color: hsl(240, 80%, 60%); 95 | height: 34px; 96 | width: 34px; 97 | top: 35px; 98 | } 99 | 100 | @-webkit-keyframes spin { 101 | 0%, 15% { 102 | -webkit-transform: rotate(0); 103 | transform: rotate(0); 104 | } 105 | 100% { 106 | -webkit-transform: rotate(360deg); 107 | transform: rotate(360deg); 108 | } 109 | } 110 | 111 | @keyframes spin { 112 | 0%, 15% { 113 | -webkit-transform: rotate(0); 114 | transform: rotate(0); 115 | } 116 | 100% { 117 | -webkit-transform: rotate(360deg); 118 | transform: rotate(360deg); 119 | } 120 | } 121 | 122 | /*all-popup*/ 123 | .all-popup-wrap{ 124 | position: fixed; 125 | top: 0; 126 | left: 0; 127 | bottom: 0; 128 | right: 0; 129 | background: rgba(0,0,0,.6); 130 | z-index: 999; 131 | } 132 | 133 | .wrap-enter-active, .wrap-leave-active { 134 | transition: opacity .5s 135 | } 136 | .wrap-enter, .wrap-leave-active { 137 | opacity: 0 138 | } 139 | 140 | /*popup*/ 141 | .popup-text{ 142 | position: fixed; 143 | display: inline-block; 144 | background: rgba(255,255,255,0.8); 145 | width: 60%; 146 | overflow: hidden; 147 | font-size: 0.75rem; 148 | color: #111; 149 | border-radius: 1rem; 150 | top: 45%; 151 | margin-left: 20%; 152 | text-align: center; 153 | height: 2rem; 154 | line-height: 2rem; 155 | z-index: 9999; 156 | } 157 | .popup-enter{ 158 | opacity: 0; 159 | transform: translate3d(0,0,0) scale(1.2); 160 | -webkit-transform: translate3d(0,0,0) scale(1.2); 161 | } 162 | .popup-enter-active{ 163 | transition: opacity 0.5s, transform 0.5s; 164 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 165 | } 166 | .popup-leave-active{ 167 | opacity: 0; 168 | transform: translate3d(0,0,0) scale(0.8); 169 | -webkit-transform: translate3d(0,0,0) scale(0.8); 170 | transition: opacity 0.5s, transform 0.5s; 171 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 172 | } 173 | 174 | /*message-box*/ 175 | .message-box{ 176 | position: fixed; 177 | width: 80%; 178 | overflow: hidden; 179 | top: 50%; 180 | left: 50%; 181 | font-size: 0.6rem; 182 | background: #f1f1f1; 183 | color: #111; 184 | -webkit-transform: translate3d(-50%,-50%,0); 185 | transform: translate3d(-50%,-50%,0); 186 | border-radius: 0.2rem; 187 | text-align: center; 188 | z-index: 1000; 189 | } 190 | .message-header{ 191 | padding-top: 0.8rem; 192 | } 193 | .message-text{ 194 | padding: 0.5rem; 195 | line-height: 1.5rem; 196 | color:#999; 197 | } 198 | .message-btn{ 199 | border-top: 1px solid #ddd; 200 | display: flex; 201 | display: -webkit-flex; 202 | display: -ms-flex; 203 | } 204 | .message-btn .line{ 205 | border-right: 1px solid #ddd; 206 | } 207 | .message-btn .color{ 208 | color:#eacb20; 209 | } 210 | .message-btn-cancel, .message-btn-confirm{ 211 | height: 2rem; 212 | line-height: 2rem; 213 | width: 50%; 214 | -webkit-box-flex: 1; 215 | -ms-flex: 1; 216 | flex: 1; 217 | font-size: 0.7rem; 218 | } 219 | .message-enter{ 220 | opacity: 0; 221 | transform: translate3d(-50%,-50%,0) scale(1.2); 222 | -webkit-transform: translate3d(-50%,-50%,0) scale(1.2); 223 | } 224 | .message-enter-active{ 225 | transition: opacity 0.5s, transform 0.5s; 226 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 227 | } 228 | .message-leave-active{ 229 | opacity: 0; 230 | transform: translate3d(-50%,-50%,0) scale(0.8); 231 | -webkit-transform: translate3d(-50%,-50%,0) scale(0.8); 232 | transition: opacity 0.5s, transform 0.5s; 233 | -webkit-transition: opacity 0.5s, -webkit-transform 0.5s; 234 | } 235 | 236 | .css-loading{ 237 | width: 0.7rem; 238 | height: 0.7rem; 239 | display: block; 240 | position: relative; 241 | float: left; 242 | margin-top: 0.65rem; 243 | border: 2px solid transparent; 244 | border-top-color: #f1f1f1; 245 | border-left-color: #f1f1f1; 246 | border-bottom-color: #f1f1f1; 247 | border-radius: 50%; 248 | -webkit-animation: rotate 1s linear infinite; 249 | animation: rotate 1s linear infinite; 250 | } 251 | 252 | @keyframes rotate{ 253 | 0%{ 254 | transform: rotate(0deg); 255 | } 256 | 100% { 257 | transform: rotate(360deg); 258 | } 259 | } 260 | @-webkit-keyframes rotate{ 261 | 0%{ 262 | -webkit-transform: rotate(0deg); 263 | } 264 | 100% { 265 | -webkit-transform: rotate(360deg); 266 | } 267 | } -------------------------------------------------------------------------------- /www/css/room.css: -------------------------------------------------------------------------------- 1 | html{ 2 | min-height: 100%; 3 | } 4 | body{ 5 | background-attachment: fixed; 6 | background: url(https://imio.oss-cn-shanghai.aliyuncs.com/chat/img/index-bg.jpg) no-repeat center center/cover; 7 | } 8 | 9 | #js_room_body{ 10 | width: 100%; 11 | overflow: hidden; 12 | color: #fff; 13 | } 14 | 15 | .index-content{ 16 | width: 100%; 17 | overflow: hidden; 18 | position: relative; 19 | z-index: 10; 20 | } 21 | .room-header{ 22 | width: 100%; 23 | height: 3rem; 24 | line-height: 3rem; 25 | overflow: hidden; 26 | position: relative; 27 | z-index: 10; 28 | font-size: 0.75rem; 29 | color: #f6f5f1; 30 | text-align: center; 31 | } 32 | .room-header span{ 33 | display: inline-block; 34 | } 35 | .room-header i{ 36 | background: rgba(0,0,0,0.5); 37 | border-radius: 100%; 38 | margin: 0.5rem; 39 | display: inline-block; 40 | float: left; 41 | width: 2rem; 42 | height: 2rem; 43 | line-height: 2rem; 44 | text-align: center; 45 | font-size: 0.75rem; 46 | } 47 | .icon-icon{ 48 | float: right!important; 49 | font-size: 0.85rem!important; 50 | } 51 | 52 | .room-time{ 53 | width: 60%; 54 | position: relative; 55 | font-size: 0.6rem; 56 | margin: 1.5rem auto; 57 | padding: 0.5rem 0; 58 | text-align: center; 59 | border: 1px solid #ada49b; 60 | color: #f6f5f1; 61 | border-radius: 1rem; 62 | letter-spacing: 0.1rem; 63 | } 64 | 65 | ul.room-list{ 66 | overflow: hidden; 67 | position: relative; 68 | margin: 0 0.5rem 2.5rem 0.5rem; 69 | } 70 | 71 | ul.room-list li{ 72 | width: 100%; 73 | overflow: hidden; 74 | position: relative; 75 | } 76 | .icon-username{ 77 | display: block; 78 | width: 1.5rem; 79 | height: 1.5rem; 80 | font-size: 1.4rem; 81 | float: left; 82 | } 83 | .room-list-content{ 84 | margin: 0 0.5rem 1rem 2rem; 85 | background: rgba(0,0,0,0.8); 86 | border-radius: 0.2rem; 87 | color: #f1f1f1; 88 | } 89 | .room-list-msg span{ 90 | font-size: 0.65rem; 91 | display: inline-block; 92 | float: left; 93 | padding: 0.5rem 0.5rem; 94 | letter-spacing: 0.05rem; 95 | } 96 | .room-list-msg{ 97 | width: 100%; 98 | overflow: hidden; 99 | } 100 | .msg-time{ 101 | float: right!important; 102 | } 103 | .msg-detail{ 104 | font-size: 0.6rem; 105 | padding: 0 0.5rem 0.5rem 0.5rem; 106 | line-height: 120%; 107 | } 108 | .icon-myself{ 109 | float: right; 110 | } 111 | .content-myself{ 112 | margin: 0 2rem 1rem 0.5rem; 113 | background: #eacb20; 114 | color: #000; 115 | } 116 | 117 | .send-box{ 118 | position: fixed; 119 | bottom: 0; 120 | left: 0; 121 | width: 100%; 122 | height: 2.5rem; 123 | background: rgba(50,50,50,0.8); 124 | border-top: 1px solid rgba(234,203,32,0.6); 125 | } 126 | .send-box input{ 127 | display: block; 128 | background: rgba(0,0,0,0); 129 | height: 1.8rem; 130 | margin: 0.35rem 0 0.35rem 0.5rem; 131 | color: #f1f1f1; 132 | font-size: 0.7rem; 133 | float: left; 134 | } 135 | .send-box button{ 136 | display: inline-block; 137 | margin: 0.25rem 0.5rem; 138 | height: 2rem; 139 | width: 3.5rem; 140 | text-align: center; 141 | float: right; 142 | border-radius: 0.2rem; 143 | color: #f1f1f1; 144 | background: #eacb20; 145 | } -------------------------------------------------------------------------------- /www/font/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1482396691947'); /* IE9*/ 4 | src: url('iconfont.eot?t=1482396691947#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('iconfont.woff?t=1482396691947') format('woff'), /* chrome, firefox */ 6 | url('iconfont.ttf?t=1482396691947') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1482396691947#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-hometablogo:before { content: "\e675"; } 19 | 20 | .icon-githublogo:before { content: "\e697"; } 21 | 22 | .icon-memberlogo:before { content: "\e70d"; } 23 | 24 | -------------------------------------------------------------------------------- /www/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/font/iconfont.eot -------------------------------------------------------------------------------- /www/font/iconfont.js: -------------------------------------------------------------------------------- 1 | ;(function(window) { 2 | 3 | var svgSprite = '' + 4 | '' + 5 | '' + 18 | '' + 19 | '' + 24 | '' + 25 | '' + 36 | '' + 37 | '' 38 | var script = function() { 39 | var scripts = document.getElementsByTagName('script') 40 | return scripts[scripts.length - 1] 41 | }() 42 | var shouldInjectCss = script.getAttribute("data-injectcss") 43 | 44 | /** 45 | * document ready 46 | */ 47 | var ready = function(fn) { 48 | if (document.addEventListener) { 49 | if (~["complete", "loaded", "interactive"].indexOf(document.readyState)) { 50 | setTimeout(fn, 0) 51 | } else { 52 | var loadFn = function() { 53 | document.removeEventListener("DOMContentLoaded", loadFn, false) 54 | fn() 55 | } 56 | document.addEventListener("DOMContentLoaded", loadFn, false) 57 | } 58 | } else if (document.attachEvent) { 59 | IEContentLoaded(window, fn) 60 | } 61 | 62 | function IEContentLoaded(w, fn) { 63 | var d = w.document, 64 | done = false, 65 | // only fire once 66 | init = function() { 67 | if (!done) { 68 | done = true 69 | fn() 70 | } 71 | } 72 | // polling for no errors 73 | var polling = function() { 74 | try { 75 | // throws errors until after ondocumentready 76 | d.documentElement.doScroll('left') 77 | } catch (e) { 78 | setTimeout(polling, 50) 79 | return 80 | } 81 | // no errors, fire 82 | 83 | init() 84 | }; 85 | 86 | polling() 87 | // trying to always fire before onload 88 | d.onreadystatechange = function() { 89 | if (d.readyState == 'complete') { 90 | d.onreadystatechange = null 91 | init() 92 | } 93 | } 94 | } 95 | } 96 | 97 | /** 98 | * Insert el before target 99 | * 100 | * @param {Element} el 101 | * @param {Element} target 102 | */ 103 | 104 | var before = function(el, target) { 105 | target.parentNode.insertBefore(el, target) 106 | } 107 | 108 | /** 109 | * Prepend el to target 110 | * 111 | * @param {Element} el 112 | * @param {Element} target 113 | */ 114 | 115 | var prepend = function(el, target) { 116 | if (target.firstChild) { 117 | before(el, target.firstChild) 118 | } else { 119 | target.appendChild(el) 120 | } 121 | } 122 | 123 | function appendSvg() { 124 | var div, svg 125 | 126 | div = document.createElement('div') 127 | div.innerHTML = svgSprite 128 | svgSprite = null 129 | svg = div.getElementsByTagName('svg')[0] 130 | if (svg) { 131 | svg.setAttribute('aria-hidden', 'true') 132 | svg.style.position = 'absolute' 133 | svg.style.width = 0 134 | svg.style.height = 0 135 | svg.style.overflow = 'hidden' 136 | prepend(svg, document.body) 137 | } 138 | } 139 | 140 | if (shouldInjectCss && !window.__iconfont__svg__cssinject__) { 141 | window.__iconfont__svg__cssinject__ = true 142 | try { 143 | document.write(""); 144 | } catch (e) { 145 | console && console.log(e) 146 | } 147 | } 148 | 149 | ready(appendSvg) 150 | 151 | 152 | })(window) -------------------------------------------------------------------------------- /www/font/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Created by FontForge 20120731 at Thu Dec 22 16:51:31 2016 6 | By admin 7 | 8 | 9 | 10 | 24 | 26 | 28 | 30 | 32 | 34 | 38 | 49 | 53 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /www/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/font/iconfont.ttf -------------------------------------------------------------------------------- /www/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/font/iconfont.woff -------------------------------------------------------------------------------- /www/img/index.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/img/index.PNG -------------------------------------------------------------------------------- /www/img/login.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/img/login.PNG -------------------------------------------------------------------------------- /www/img/room.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LCJ-MinYa/chat/e3daa5eb0a35e8b9ab43f0b390d1f0d25a6d0ac0/www/img/room.PNG -------------------------------------------------------------------------------- /www/js/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * =========================== 3 | * 4 | * 首页 => index 5 | * @author : LiChaoJun 6 | * @datetime : 2016/12/27 7 | * 8 | * =========================== 9 | */ 10 | (function() { 11 | var indexModel = new Vue({ 12 | el: '#js_index_body', 13 | data: function() { 14 | return { 15 | firstLoading: true, 16 | uid: GZL.getCookie("uid"), 17 | userName: GZL.getCookie("userName"), 18 | roomList: [], 19 | onLineUser: 0, 20 | message: { 21 | isShowMessageBox: false, 22 | messageText: "提示信息", 23 | leftBtnText: "取消", 24 | rightBtnText: "确认" 25 | }, 26 | creatRoom: { 27 | showCreatRoom: false, 28 | roomName: "", 29 | roomDetail: "", 30 | roomId: "", 31 | }, 32 | popup: { 33 | showPopupText: false, 34 | popupText: "", 35 | }, 36 | reqLoading: false, 37 | } 38 | }, 39 | mounted: function() { 40 | var _this = this; 41 | this.getRoomListMsg(); 42 | }, 43 | computed: { 44 | isLogin: function() { 45 | if (this.uid != "undefined" && this.userName != "undefined") { 46 | return true; 47 | } 48 | return false; 49 | } 50 | }, 51 | methods: { 52 | getRoomListMsg: function() { 53 | var _this = this; 54 | GZL.ajax({ 55 | url: GZL.CONFIG.ROOMLIST, 56 | method: 'POST', 57 | data: { 58 | pageIndex: 1, 59 | }, 60 | success: function(result) { 61 | _this.firstLoading = false; 62 | _this.roomList = result.data; 63 | _this.onLineUser = result.message; 64 | } 65 | }, this); 66 | }, 67 | goRoomPage: function(roomList) { 68 | if (this.isLogin) { 69 | if (roomList.roomId) window.location.href = encodeURI(encodeURI("room?roomId=" + roomList.roomId + '&roomName=' + roomList.roomName)); 70 | } else { 71 | this.message.isShowMessageBox = true; 72 | this.message.messageText = "您还未登录,是否登录?" 73 | } 74 | }, 75 | goLogin: function() { 76 | window.location.href = 'login'; 77 | }, 78 | openCreatRoomDom: function() { 79 | if (this.isLogin) { 80 | this.creatRoom.showCreatRoom = true; 81 | } else { 82 | this.message.isShowMessageBox = true; 83 | this.message.messageText = "您还未登录,是否登录?"; 84 | } 85 | }, 86 | cancelMessageBox: function() { 87 | this.message.isShowMessageBox = false; 88 | }, 89 | confirmMessageBox: function() { 90 | this.message.isShowMessageBox = false; 91 | if (this.isLogin) window.location.href = encodeURI(encodeURI("room?roomId=" + this.creatRoom.roomId + '&roomName=' + this.creatRoom.roomName)); 92 | else window.location.href = "login"; 93 | }, 94 | closeCreatRoomDom: function() { 95 | this.creatRoom.showCreatRoom = false; 96 | }, 97 | goCreatRoom: function() { 98 | var _this = this; 99 | if (!this.creatRoom.roomName) { 100 | GZL.popue(this, "房间名称不能为空"); 101 | } else if (!this.creatRoom.roomDetail) { 102 | GZL.popue(this, "房间介绍不能为空"); 103 | } else { 104 | GZL.ajax({ 105 | url: GZL.CONFIG.CREATROOM, 106 | method: "POST", 107 | data: { 108 | userName: this.userName, 109 | uid: this.uid, 110 | roomName: this.creatRoom.roomName, 111 | roomDetail: this.creatRoom.roomDetail, 112 | }, 113 | success: function(result) { 114 | if (result.status === 200) { 115 | _this.creatRoom.roomId = result.data.roomId; 116 | _this.creatRoom.showCreatRoom = false; 117 | _this.message.isShowMessageBox = true; 118 | _this.message.messageText = result.message + ",是否进入房间?"; 119 | } else { 120 | GZL.popue(_this, result.message); 121 | } 122 | } 123 | }, this) 124 | } 125 | } 126 | } 127 | }); 128 | }()); -------------------------------------------------------------------------------- /www/js/login.js: -------------------------------------------------------------------------------- 1 | /* 2 | * =========================== 3 | * 4 | * 登录 => login 5 | * @author : LiChaoJun 6 | * @datetime : 2016/12/23 7 | * 8 | * =========================== 9 | */ 10 | (function() { 11 | var loginModel = new Vue({ 12 | el: '#js_login_body', 13 | data: function() { 14 | return { 15 | firstLoading: true, 16 | login: false, 17 | register: false, 18 | forget: false, 19 | reqLoading: false, 20 | reset: false, 21 | userName: "", 22 | password: "", 23 | email: '', 24 | confirmPassword: "", 25 | isShowFooter: true, 26 | popup: { 27 | showPopupText: false, 28 | popupText: "", 29 | }, 30 | } 31 | }, 32 | mounted: function() { 33 | var uid = GZL.getCookie("uid"); 34 | if (uid != "undefined") { 35 | window.location.href = 'index'; 36 | } 37 | var _this = this; 38 | this.$nextTick(function() { 39 | _this.firstLoading = false; 40 | if (GZL.GetQueryString('uid')) { 41 | _this.reset = true; 42 | } else { 43 | _this.login = true; 44 | } 45 | 46 | //处理安卓顶起视图 47 | var height = document.body.scrollHeight; 48 | window.onresize = function() { 49 | if (document.body.scrollHeight < height) { 50 | _this.isShowFooter = false; 51 | } else { 52 | _this.isShowFooter = true; 53 | } 54 | }; 55 | }) 56 | }, 57 | methods: { 58 | toggleShow: function(name) { 59 | this.login = !this.login; 60 | if (name == 'register' || this.register) { 61 | this.register = !this.register; 62 | } 63 | if (name == 'forget' || this.forget) { 64 | this.forget = !this.forget; 65 | } 66 | if (this.reset) { 67 | this.reset = false; 68 | } 69 | }, 70 | checkOutMsg: function(type) { 71 | var _this = this; 72 | if (type == 'register' || type == 'login' || type == 'forget') { 73 | if (!this.email) { 74 | GZL.popue(_this, "邮箱地址不能为空"); 75 | return; 76 | } 77 | if (!GZL.MatchEmail(this.email)) { 78 | GZL.popue(_this, "请输入正确的邮箱地址"); 79 | return; 80 | } 81 | } 82 | 83 | if (type == 'register' || type == 'forget') { 84 | if (!this.userName) { 85 | GZL.popue(_this, "昵称不能为空"); 86 | return; 87 | } 88 | if (this.userName.length < 2) { 89 | GZL.popue(_this, "昵称不能小于两个字符"); 90 | return; 91 | } 92 | } 93 | 94 | if (type == 'password' || type == 'login') { 95 | if (!this.password) { 96 | GZL.popue(_this, "密码不能为空"); 97 | return; 98 | } 99 | if (this.password.length < 6) { 100 | GZL.popue(_this, "密码不能小于6位数"); 101 | return; 102 | } 103 | if (type == 'password') { 104 | if (this.confirmPassword != this.password) { 105 | GZL.popue(_this, "两次密码不相等"); 106 | return; 107 | } 108 | } 109 | } 110 | 111 | this.userBtnClick(type); 112 | }, 113 | userBtnClick: function(type) { 114 | var _this = this; 115 | var url = ''; 116 | if (type == 'login') { 117 | url = GZL.CONFIG.LOGIN; 118 | } else if (type == 'register') { 119 | url = GZL.CONFIG.REGISTER; 120 | } else if (type == 'password') { 121 | url = GZL.CONFIG.RESET; 122 | } else if (type == 'forget') { 123 | url = GZL.CONFIG.FORGET; 124 | } 125 | GZL.ajax({ 126 | url: url, 127 | method: "POST", 128 | data: { 129 | email: this.email, 130 | userName: this.userName, 131 | password: this.password, 132 | uid: GZL.GetQueryString('uid') 133 | }, 134 | success: function(result) { 135 | if (result.status === 200) { 136 | if (type == 'login' || type == 'password') { 137 | GZL.setCookie("uid", result.data.uid, { 138 | expires: 24 * 7 139 | }) 140 | GZL.setCookie("userName", result.data.userName, { 141 | expires: 24 * 7 142 | }) 143 | window.location.href = 'index'; 144 | } else { 145 | GZL.popue(_this, result.message); 146 | } 147 | } else { 148 | GZL.popue(_this, result.message); 149 | } 150 | } 151 | }, _this); 152 | } 153 | } 154 | }); 155 | }()); -------------------------------------------------------------------------------- /www/js/room.js: -------------------------------------------------------------------------------- 1 | /* 2 | * =========================== 3 | * 4 | * 房间 => room 5 | * @author : LiChaoJun 6 | * @datetime : 2017/01/04 7 | * 8 | * =========================== 9 | */ 10 | (function() { 11 | var socket = io('wss://chat.ziyiu.com'); 12 | var uid = GZL.getCookie('uid'); 13 | var userName = GZL.getCookie('userName'); 14 | var roomModel = new Vue({ 15 | el: "#js_room_body", 16 | data: function() { 17 | return { 18 | firstLoading: true, 19 | userNum: '', 20 | sendMsg: '', 21 | msgList: [], 22 | roomName: '', 23 | message: { 24 | isShowMessageBox: false, 25 | messageText: "提示信息", 26 | leftBtnText: "返回", 27 | rightBtnText: "确认" 28 | }, 29 | creatRoom: { 30 | showCreatRoom: false, 31 | } 32 | } 33 | }, 34 | mounted: function() { 35 | var _this = this; 36 | _this.roomName = decodeURI(GZL.GetQueryString("roomName")); 37 | this.$nextTick(function() { 38 | _this.firstLoading = false; 39 | }) 40 | socket.on('connect', function() { 41 | socket.emit('enter', { 42 | uid: uid, 43 | userName: userName, 44 | roomId: GZL.GetQueryString("roomId") 45 | }); 46 | }) 47 | 48 | //做进入时其他状态console打印信息调试用 49 | socket.on('enter', function(msg) { 50 | console.log(msg); 51 | _this.message.isShowMessageBox = true; 52 | _this.message.messageText = msg; 53 | }) 54 | 55 | //确认进入房间,页面输出信息告知其他用户 56 | socket.on('enterSuccess', function(num) { 57 | _this.userNum = num + '人在线'; 58 | }) 59 | 60 | //接收服务端推送的用户发送信息 61 | socket.on('message', function(msg, obj, isMyself, time) { 62 | _this.msgList.push({ 63 | msg: msg, 64 | userName: obj.userName, 65 | isMyself: isMyself, 66 | time: time 67 | }); 68 | _this.$nextTick(function() { 69 | window.scrollTo(0, document.body.scrollHeight); 70 | }); 71 | }) 72 | 73 | //做进入时其他状态console打印信息调试用 74 | socket.on('break', function(num) { 75 | _this.userNum = num + '人在线'; 76 | }) 77 | }, 78 | methods: { 79 | doSendMsg: function() { 80 | if (this.sendMsg) { 81 | socket.emit('message', this.sendMsg); 82 | this.sendMsg = ""; 83 | } 84 | }, 85 | goBack: function() { 86 | window.location.href = 'index'; 87 | }, 88 | cancelMessageBox: function() { 89 | window.location.href = 'index'; 90 | }, 91 | confirmMessageBox: function() { 92 | window.location.href = 'index'; 93 | } 94 | } 95 | }) 96 | }()); -------------------------------------------------------------------------------- /www/server.js: -------------------------------------------------------------------------------- 1 | var app = require('../app'); 2 | var debug = require('debug')('express-demo:server'); 3 | var http = require('http'); 4 | var config = require('../config/config.js'); 5 | var port = config.port || '3000'; 6 | app.set('port', port); 7 | app.disable('x-powered-by'); 8 | 9 | var server = http.createServer(app); 10 | app.ready(server); //room房间 11 | server.listen(port, function() { 12 | console.log("监听端口:" + port); 13 | }); 14 | server.on('error', onError); 15 | server.on('listening', onListening); 16 | 17 | function onError(error) { 18 | if (error.syscall !== 'listen') { 19 | throw error; 20 | } 21 | 22 | var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; 23 | 24 | // handle specific listen errors with friendly messages 25 | switch (error.code) { 26 | case 'EACCES': 27 | console.error(bind + ' requires elevated privileges'); 28 | process.exit(1); 29 | break; 30 | case 'EADDRINUSE': 31 | console.error(bind + ' is already in use'); 32 | process.exit(1); 33 | break; 34 | default: 35 | throw error; 36 | } 37 | } 38 | 39 | function onListening() { 40 | var addr = server.address(); 41 | var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; 42 | debug('Listening on ' + bind); 43 | } -------------------------------------------------------------------------------- /www/utils/utils.js: -------------------------------------------------------------------------------- 1 | var GZL = (function(root, factory) { 2 | "use strict"; 3 | 4 | //模块名称 5 | var _MODULE_NAME = "[Godzilla]"; 6 | //模块版本 7 | var _MODULE_VERSION = "1.2.1"; 8 | 9 | /** 10 | * [settings 默认参数设置] 11 | * @param {[boolean]} DEBUG [是否开启调试模式,默认false] 12 | */ 13 | factory.settings = { 14 | DEBUG: false 15 | }; 16 | 17 | /* 18 | * 接口请求配置 19 | */ 20 | factory.CONFIG = { 21 | BASE_API: "http://127.0.0.1:8083", 22 | LOGIN: "/api/login", 23 | REGISTER: "/api/register", 24 | CREATROOM: "/api/creatRoom", 25 | ROOMLIST: "/api/getRoomList", 26 | RESET: "/api/reset", 27 | FORGET: "/api/forget", 28 | }; 29 | 30 | factory.popue = function(_this, text) { 31 | _this.popup.showPopupText = true; 32 | _this.popup.popupText = text; 33 | setTimeout(function() { 34 | _this.popup.showPopupText = false; 35 | }, 1500); 36 | }; 37 | 38 | //定向获取url参数 39 | factory.GetQueryString = function(name) { 40 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); 41 | var r = window.location.search.substr(1).match(reg); 42 | if (r != null) 43 | return unescape(r[2]); 44 | return null; 45 | }; 46 | 47 | //邮箱地址正则表达式判断 48 | factory.MatchEmail = function(string) { 49 | var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; 50 | return reg.test(string); 51 | } 52 | 53 | /** 54 | * [ajax 封装ajax] 55 | * @param {[object]} options 56 | * options.url:请求接口地址 57 | * options.method:请求类型,默认为GET 58 | * options.data:请求参数 59 | * options.success:请求成功回调函数 60 | * options.error:请求失败回调函数 61 | * @return {[object]} [JSON Object] 62 | */ 63 | factory.ajax = function(options, _this) { 64 | _this.reqLoading = true; 65 | var xhr = null; 66 | options = options || null; 67 | if (!options) { 68 | if (factory.settings.DEBUG) { 69 | console.info(_MODULE_NAME, options); 70 | } 71 | console.error(_MODULE_NAME, "options is required"); 72 | return false; 73 | } 74 | options.method = options.method || "GET"; 75 | options.data = options.data || {}; 76 | options.url = options.url || null; 77 | options.success = options.success || function() {}; 78 | options.error = options.error || function() {}; 79 | if (!options.url) { 80 | if (factory.settings.DEBUG) { 81 | console.info(_MODULE_NAME, url); 82 | } 83 | console.error(_MODULE_NAME, "options url is required"); 84 | return false; 85 | } 86 | if (root.XMLHttpRequest) { 87 | xhr = new XMLHttpRequest(); 88 | if (factory.settings.DEBUG) { 89 | console.info(_MODULE_NAME, "Browser ajax supported"); 90 | } 91 | } else { 92 | if (factory.settings.DEBUG) { 93 | console.error(_MODULE_NAME, "Browser not support ajax"); 94 | } 95 | xhr = null; 96 | } 97 | var type = options.method.toUpperCase(); 98 | var random = Math.random(); 99 | if (typeof options.data == 'object') { 100 | var query = ''; 101 | for (var key in options.data) { 102 | query += key + '=' + options.data[key] + '&'; 103 | } 104 | options.data = query.replace(/&$/, ''); 105 | } 106 | if (type == 'GET') { 107 | if (options.data) { 108 | xhr.open('GET', options.url + '?' + options.data, true); 109 | } else { 110 | xhr.open('GET', options.url + '?t=' + random, true); 111 | } 112 | xhr.send(); 113 | } else if (type == 'POST') { 114 | xhr.open('POST', options.url, true); 115 | xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 116 | xhr.send(options.data); 117 | } 118 | xhr.onreadystatechange = function() { 119 | if (xhr.readyState == 4) { 120 | if (factory.settings.DEBUG) { 121 | console.log(_MODULE_NAME, "request status:", xhr.status); 122 | } 123 | if (xhr.status == 200) { 124 | var resultData = xhr.responseText; 125 | try { 126 | resultData = JSON.parse(resultData); 127 | } catch (e) { 128 | if (factory.settings.DEBUG) { 129 | console.log(_MODULE_NAME, "Error:", e); 130 | } 131 | resultData = resultData; 132 | } 133 | if (factory.settings.DEBUG) { 134 | console.log(_MODULE_NAME, "Ajax Result:", resultData); 135 | } 136 | _this.reqLoading = false; 137 | options.success(resultData); 138 | } else { 139 | if (factory.settings.DEBUG) { 140 | console.log(_MODULE_NAME, "Ajax Result:", xhr.responseText); 141 | } 142 | options.error(xhr.status); 143 | } 144 | } 145 | }; 146 | }; 147 | 148 | /** 149 | * [setCookie 设置cookie] 150 | * @param {[string]} key [cookie的name] 151 | * @param {[string]} value [cookie的值] 152 | * @param {[object]} options [可选][设置cookie相关的属性,expires:过期小时数,path:路径,domain:域名,secure:是否是安全传输] 153 | */ 154 | factory.setCookie = function(key, value) { 155 | var options = null; 156 | if (arguments.length > 2) { 157 | options = arguments[2]; 158 | } else { 159 | options = null; 160 | } 161 | if (key && value) { 162 | var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value); 163 | if (options !== null) { 164 | if (options.expires) { 165 | var times = new Date(); 166 | times.setTime(times.getTime() + options.expires * 60 * 60 * 1000); 167 | cookie += ';expires=' + times.toGMTString(); 168 | } 169 | if (options.path) { 170 | cookie += ';path=' + options.path; 171 | } 172 | if (options.domain) { 173 | cookie += ';domain=' + options.domain; 174 | } 175 | if (options.secure) { 176 | cookie += ';secure'; 177 | } 178 | } 179 | document.cookie = cookie; 180 | if (factory.settings.DEBUG) { 181 | console.log(document.cookie); 182 | } 183 | return cookie; 184 | } else { 185 | return ""; 186 | } 187 | }; 188 | /** 189 | * [getCookie 获取cookie] 190 | * @param {[string]} name [cookie的name] 191 | * @return {[sting]} [cookie的value] 192 | */ 193 | factory.getCookie = function(name) { 194 | var cookies = parseCookie(); 195 | var current = decodeURIComponent(cookies[name]) || null; 196 | if (factory.settings.DEBUG) { 197 | console.log("[INFO]" + _MODULE_NAME + ": Cookie " + name + " value is " + current); 198 | } 199 | return current; 200 | }; 201 | /** 202 | * [removeCookie 删除cookie的值] 203 | * @param {[string]} name [cookie的关键字] 204 | * @return {[void]} [无] 205 | */ 206 | factory.removeCookie = function(name) { 207 | var cookies = parseCookie(); 208 | if (cookies[name]) { 209 | document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT'; 210 | } 211 | if (factory.settings.DEBUG) { 212 | console.log(document.cookie); 213 | } 214 | }; 215 | /** 216 | * [clearCookie 清除全部cookie] 217 | * @return {[void]} [无] 218 | */ 219 | factory.clearCookie = function() { 220 | var cookies = parseCookie(); 221 | for (var key in cookies) { 222 | document.cookie = key + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; 223 | } 224 | }; 225 | /** 226 | * [getAllCookies 获取当前全部cookie] 227 | * @return {[void]} [无] 228 | */ 229 | factory.getAllCookies = function() { 230 | var cookies = parseCookie(); 231 | var tmpCookies = {}; 232 | for (var key in cookies) { 233 | tmpCookies[key] = decodeURIComponent(cookies[key]); 234 | } 235 | if (factory.settings.DEBUG) { 236 | console.log(tmpCookies); 237 | } 238 | return tmpCookies; 239 | }; 240 | 241 | /** 242 | * [parseCookie 解析cookie,将cookie的字符串解析为Object] 243 | * @return {[object]} [object的cookie] 244 | */ 245 | var parseCookie = function() { 246 | var cookies = {}; 247 | if (factory.settings.DEBUG) { 248 | console.log("[INFO]" + _MODULE_NAME + ": Cookie infomation:"); 249 | console.log(document.cookie); 250 | } 251 | if (document.cookie) { 252 | var tmpCookies = document.cookie.split(";"); 253 | for (var key in tmpCookies) { 254 | if (key === '$remove') { 255 | continue; 256 | } 257 | var index = tmpCookies[key].indexOf("="); 258 | var name = tmpCookies[key].substr(0, index).replace(/\s+/g, ""); 259 | var value = tmpCookies[key].substr(index + 1, tmpCookies[key].length).replace(/\s+/g, ""); 260 | cookies[name] = value; 261 | } 262 | } 263 | if (factory.settings.DEBUG) { 264 | console.log(cookies); 265 | } 266 | return cookies; 267 | }; 268 | 269 | /* 暴露 API 工厂*/ 270 | return factory; 271 | 272 | })(window, window.GZL = window.GZL || {}); 273 | --------------------------------------------------------------------------------