├── .babelrc ├── .gitignore ├── .project ├── LICENSE ├── README.md ├── homestay.sql ├── index.html ├── package-lock.json ├── package.json ├── src ├── api │ ├── .project │ ├── app.js │ ├── package-lock.json │ ├── package.json │ └── router │ │ ├── del.js │ │ ├── deleteRelease.js │ │ ├── insert.js │ │ ├── myRelease.js │ │ ├── orderlist.js │ │ ├── register.js │ │ ├── release.js │ │ ├── select.js │ │ ├── selecthotel.js │ │ ├── share.js │ │ ├── sorthotel.js │ │ ├── update.js │ │ ├── userchange.js │ │ ├── userlogin.js │ │ └── userregister.js ├── app.js ├── components │ ├── control │ │ ├── ControlComponent.js │ │ ├── control.scss │ │ └── controlAction.js │ ├── controldetalist │ │ ├── checkAction.js │ │ ├── checkHomestay.js │ │ ├── checkReducer.js │ │ ├── editAction.js │ │ ├── editComponent.js │ │ ├── employee.js │ │ ├── employeeAction.js │ │ ├── getPlanAction.js │ │ ├── getPlanComponent.js │ │ ├── goodTalk.js │ │ ├── performance.js │ │ ├── performanceAction.js │ │ ├── performanceReducer.js │ │ ├── sell.js │ │ ├── setPlanAction.js │ │ └── setPlanComponent.js │ ├── home │ │ └── homeComponent.js │ ├── login │ │ ├── loginAction.js │ │ ├── loginComponent.js │ │ └── loginReducer.js │ └── register │ │ ├── registerAction.js │ │ └── registerCompoent.js ├── constaints │ ├── ajaxConstants.js │ ├── loginConstants.js │ └── performanceConstants.js ├── redux │ ├── configstore.js │ ├── middleware.js │ └── rootReducer.js ├── router │ └── index.js └── utils │ ├── base.scss │ └── httpclient.js └── webpack.config.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["es2015", { "modules": false }], 4 | "react", 5 | "latest", 6 | "stage-2" 7 | ], 8 | "plugins": ["transform-decorators-legacy"] 9 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | npm-debug.log 4 | yarn-error.log 5 | 6 | # Editor directories and files 7 | .idea 8 | *.suo 9 | *.ntvs* 10 | *.njsproj 11 | *.sln 12 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | REACT 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | 19 | 1517190201914 20 | 21 | 26 22 | 23 | org.eclipse.ui.ide.multiFilter 24 | 1.0-name-matches-false-false-node_modules 25 | 26 | 27 | 28 | 1517619175854 29 | 30 | 26 31 | 32 | org.eclipse.ui.ide.multiFilter 33 | 1.0-name-matches-false-false-node_modules 34 | 35 | 36 | 37 | 1517622593523 38 | 39 | 26 40 | 41 | org.eclipse.ui.ide.multiFilter 42 | 1.0-name-matches-false-false-node_modules 43 | 44 | 45 | 46 | 1518325900286 47 | 48 | 26 49 | 50 | org.eclipse.ui.ide.multiFilter 51 | 1.0-name-matches-false-false-node_modules 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 bobo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React_BM_Project 2 | react+redux+MySQL+nodeJS开发的一个简单的民宿后台管理系统 3 | 4 | 把项目克隆下来,在MySQL可视化工具里,导入homestay.sql文件 5 | 6 | npm insatll安装后台管理系统的页面依赖,npm start 启动项目 7 | 8 | 再打开src ->api->npm install 安装nodejs的依赖,node app 启动服务器 9 | 10 | 这样你就可以愉快地玩耍了 11 | 12 | 已实现基本的增删查改,登录权限控制,permission不为1的,不能对进行增删查改 13 | 14 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 民宿后台管理系统 8 | 9 | 10 |
11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "course-react", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "build": "webpack --progress --colors", 9 | "start": "webpack-dev-server --devtool eval --progress --port 3002 --colors --content-base ./" 10 | 11 | }, 12 | "devDependencies": { 13 | "babel-core": "^6.0.0", 14 | "babel-loader": "^6.0.0", 15 | "babel-plugin-transform-decorators-legacy": "^1.3.4", 16 | "babel-preset-latest": "^6.0.0", 17 | "babel-preset-react": "^6.24.1", 18 | "babel-preset-stage-2": "^6.24.1", 19 | "css-loader": "^0.25.0", 20 | "extract-text-webpack-plugin": "^2.1.0", 21 | "file-loader": "^0.9.0", 22 | "image-webpack-loader": "^3.3.0", 23 | "node-sass": "^4.5.0", 24 | "progress-bar-webpack-plugin": "^1.9.3", 25 | "react": "^15.5.4", 26 | "react-dom": "^15.5.4", 27 | "react-redux": "^5.0.6", 28 | "react-router": "^3.0.2", 29 | "react-router-redux": "^4.0.8", 30 | "redux": "^3.6.0", 31 | "redux-thunk": "^2.2.0", 32 | "sass-loader": "^5.0.1", 33 | "style-loader": "^0.16.1", 34 | "superagent": "^3.5.2", 35 | "url-loader": "^0.5.8", 36 | "webpack": "^2.2.0", 37 | "webpack-dev-server": "^2.2.0" 38 | }, 39 | "author": "DK.Lan", 40 | "license": "ISC", 41 | "dependencies": { 42 | "antd": "^3.1.6", 43 | "echarts": "^4.0.2", 44 | "events": "^1.1.1", 45 | "express": "^4.16.2", 46 | "flux": "^3.1.2", 47 | "jquery": "^3.3.1", 48 | "react-desktop": "^0.3.3", 49 | "react-router-dom": "^4.2.2" 50 | } 51 | } 52 | 53 | 54 | -------------------------------------------------------------------------------- /src/api/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | app模板 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | 19 | 1517119409527 20 | 21 | 26 22 | 23 | org.eclipse.ui.ide.multiFilter 24 | 1.0-name-matches-false-false-node_modules 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/api/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | //链接数据库模块 4 | var mysql = require("mysql"); 5 | 6 | 7 | //连接服务器配置....................................................................... 8 | function createConnection() { 9 | var connection = mysql.createConnection({ 10 | host: 'localhost',// 127.0.0.1 11 | user: 'root', 12 | password: '', 13 | database: 'homestay' 14 | }); 15 | return connection 16 | } 17 | //解决跨域 18 | app.all('*', function(req, res, next) { 19 | res.header("Access-Control-Allow-Origin", "*"); 20 | res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); 21 | res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); 22 | res.header("X-Powered-By",' 3.2.1') 23 | next(); 24 | }); 25 | 26 | 27 | app.use(express.static('public')); 28 | // parse application/json 29 | 30 | //get请求................................................................................. 31 | //更新民宿信息的接口 32 | app.get('/edithhomestay', function(req, res) { 33 | //然后请求的很快的时候才能正常关闭链接、 34 | var connection = createConnection(); 35 | connection.connect(); 36 | //引入查找模块 37 | require('./router/update').edithhomestay(req,res,connection); 38 | console.log(req.query) 39 | }) 40 | 41 | 42 | //.......................赖俊豪写的两个接口........................................... 43 | 44 | 45 | app.get('/userlogin',function(req,res){ 46 | // res.append("Access-Control-Allow-Origin", "*"); 47 | var connection = createConnection(); 48 | connection.connect(); 49 | require('./router/userlogin.js').userlogin(req,res,connection); 50 | }) 51 | //.......................赖俊豪写的两个接口................................................ 52 | 53 | //通过aid寻找管理员的信息 54 | app.get('/selectaid', function(req, res) { 55 | 56 | var connection = createConnection(); 57 | connection.connect(); 58 | //引入查找模块 59 | require('./router/select').selectAid(req,res,connection); 60 | console.log(req.query) 61 | }) 62 | //订单插入 63 | app.get('/insertord', function(req, res) { 64 | 65 | var connection = createConnection(); 66 | connection.connect(); 67 | //引入插入模块 68 | require('./router/insert').inserthzj(req,res,connection) 69 | console.log(req.query) 70 | }) 71 | 72 | //工作计划制定 73 | app.get('/setplan', function(req, res) { 74 | 75 | var connection = createConnection(); 76 | connection.connect(); 77 | //引入插入模块 78 | require('./router/insert').setPlan(req,res,connection) 79 | console.log(req.query) 80 | }) 81 | 82 | 83 | //删除工作计划 84 | app.get('/closeplan', function(req, res) { 85 | 86 | var connection = createConnection(); 87 | connection.connect(); 88 | //引入查找模块 89 | require('./router/del').closePlan(req,res,connection); 90 | console.log(req.query) 91 | }) 92 | 93 | //解雇员工 94 | app.get('/dismissal', function(req, res) { 95 | 96 | var connection = createConnection(); 97 | connection.connect(); 98 | //引入查找模块 99 | require('./router/del').disMissal(req,res,connection); 100 | console.log(req.query) 101 | }) 102 | 103 | //删除homestary里面的民宿信息 104 | app.get('/delethomestray', function(req, res) { 105 | 106 | var connection = createConnection(); 107 | connection.connect(); 108 | //引入查找模块 109 | require('./router/del').delSelf(req,res,connection); 110 | console.log(req.query) 111 | }) 112 | 113 | //删除checkhomestay里面的民宿信息 114 | app.get('/deletcheck', function(req, res) { 115 | 116 | var connection = createConnection(); 117 | connection.connect(); 118 | //引入查找模块 119 | require('./router/del').delCheck(req,res,connection); 120 | console.log(req.query) 121 | }) 122 | 123 | //增加审核过关的民宿信息 124 | app.get('/insertcheck', function(req, res) { 125 | 126 | var connection = createConnection(); 127 | connection.connect(); 128 | //引入插入模块 129 | require('./router/insert').insertCheck(req,res,connection) 130 | console.log(req.query) 131 | }) 132 | 133 | 134 | //增加 135 | app.get('/insert', function(req, res) { 136 | 137 | var connection = createConnection(); 138 | connection.connect(); 139 | //引入插入模块 140 | require('./router/insert').insert(req,res,connection) 141 | console.log(req.query) 142 | }) 143 | 144 | //根据hid获取酒店数据 145 | app.get('/selecthid', function(req, res) { 146 | 147 | var connection = createConnection(); 148 | connection.connect(); 149 | //引入查找模块 150 | require('./router/select').selectId(req,res,connection); 151 | console.log(req.query) 152 | }) 153 | 154 | //获取评论数 155 | app.get('/selectcommon', function(req, res) { 156 | 157 | var connection = createConnection(); 158 | connection.connect(); 159 | //引入查找模块 160 | require('./router/select').selectCommon(req,res,connection); 161 | console.log(req.query) 162 | }) 163 | 164 | 165 | 166 | //分页获取前端页面的商品数据 167 | app.get('/selectpage', function(req, res) { 168 | 169 | var connection = createConnection(); 170 | connection.connect(); 171 | //引入查找模块 172 | require('./router/select').selectPage(req,res,connection); 173 | console.log(req.query) 174 | }) 175 | 176 | //获取所有前端页面的商品数据 177 | app.get('/selectAll', function(req, res) { 178 | 179 | var connection = createConnection(); 180 | connection.connect(); 181 | //引入查找模块 182 | require('./router/select').selectAll(req,res,connection); 183 | console.log(req.query) 184 | }) 185 | 186 | //获取所有我发布的求租信息 余路的接口(不要在打错名字了各位) 187 | app.get('/myrelease', function(req, res) { 188 | 189 | var connection = createConnection(); 190 | connection.connect(); 191 | //引入查找模块 192 | require('./router/myRelease').myRelease(req,res,connection); 193 | console.log(req.query) 194 | }) 195 | 196 | //删除发布求租的信息 197 | app.get('/deleteRelease', function(req, res) { 198 | var connection = createConnection(); 199 | connection.connect(); 200 | //引入查找模块 201 | require('./router/deleteRelease').deleteRelease(req,res,connection); 202 | console.log(req.query) 203 | }) 204 | 205 | 206 | //查找所有travel里面的东西 207 | app.get('/selectTravel', function(req, res) { 208 | // 解决跨域 209 | 210 | //然后请求的很快的时候才能正常关闭链接、 211 | var connection = createConnection(); 212 | connection.connect(); 213 | //引入查找模块 214 | require('./router/select').selectTravel(req,res,connection); 215 | console.log(req.query) 216 | }) 217 | 218 | // 每次查找十条酒店信息 219 | app.get('/selecthotel', function(req, res) { 220 | // 解决跨域 221 | 222 | //然后请求的很快的时候才能正常关闭链接、 223 | var connection = createConnection(); 224 | connection.connect(); 225 | //引入查找模块 226 | require('./router/selecthotel').selecthotel(req,res,connection); 227 | console.log(req.query) 228 | }) 229 | 230 | // 查找分享 231 | app.get('/selectShare', function(req, res) { 232 | //然后请求的很快的时候才能正常关闭链接、 233 | var connection = createConnection(); 234 | connection.connect(); 235 | //引入查找模块 236 | require('./router/share').selectShare(req,res,connection); 237 | console.log(req.query) 238 | }) 239 | 240 | // 酒店排序 241 | app.get('/sorthotel', function(req, res) { 242 | //然后请求的很快的时候才能正常关闭链接、 243 | var connection = createConnection(); 244 | connection.connect(); 245 | //引入查找模块 246 | require('./router/sorthotel').sorthotel(req,res,connection); 247 | console.log(req.query) 248 | }) 249 | 250 | //查找所有审核表单里的东西 251 | app.get('/checkhomestay', function(req, res) { 252 | // 解决跨域 253 | 254 | //然后请求的很快的时候才能正常关闭链接、 255 | var connection = createConnection(); 256 | connection.connect(); 257 | //引入查找模块 258 | require('./router/select').checkhomestay(req,res,connection); 259 | console.log(req.query) 260 | }) 261 | 262 | //获取所有workplan里面的东西 263 | app.get('/getplan', function(req, res) { 264 | //然后请求的很快的时候才能正常关闭链接、 265 | var connection = createConnection(); 266 | connection.connect(); 267 | //引入查找模块 268 | require('./router/select').getplan(req,res,connection); 269 | console.log(req.query) 270 | }) 271 | //获取所有admin里面的东西 272 | app.get('/getadmin', function(req, res) { 273 | //然后请求的很快的时候才能正常关闭链接、 274 | var connection = createConnection(); 275 | connection.connect(); 276 | //引入查找模块 277 | require('./router/select').getadmin(req,res,connection); 278 | console.log(req.query) 279 | }) 280 | //更新admin的员工评分 281 | app.get('/changerate', function(req, res) { 282 | //然后请求的很快的时候才能正常关闭链接、 283 | var connection = createConnection(); 284 | connection.connect(); 285 | //引入查找模块 286 | require('./router/update').updaterare(req,res,connection); 287 | console.log(req.query) 288 | }) 289 | 290 | //获取订单信息 291 | app.get('/getorder', function(req, res) { 292 | 293 | //然后请求的很快的时候才能正常关闭链接、 294 | var connection = createConnection(); 295 | connection.connect(); 296 | //引入查找模块 297 | require('./router/orderlist').orderlist(req,res,connection); 298 | 299 | console.log(req.query) 300 | }) 301 | 302 | //更新订单状态 303 | app.get('/updateType', function(req, res) { 304 | 305 | var connection = createConnection(); 306 | connection.connect(); 307 | require('./router/update').updateType(req,res,connection); 308 | console.log(req.query) 309 | }) 310 | 311 | 312 | 313 | //要post请求............................................................................... 314 | // parse application/x-www-form-urlencoded 315 | //使用bodyParser模块 316 | //用于post请求获取参数 317 | var bodyParser = require('body-parser') 318 | app.use(bodyParser.urlencoded({ 319 | extended: false 320 | })) 321 | //鱼露 322 | app.post('/release', function(req, res) { 323 | 324 | var connection = createConnection(); 325 | connection.connect(); 326 | //引入插入模块 327 | require('./router/release').release(req,res,connection) 328 | }) 329 | 330 | 331 | //注册管理者 332 | app.post('/registeradmin', function(req, res) { 333 | // 解决跨域 334 | 335 | //然后请求的很快的时候才能正常关闭链接、 336 | var connection = createConnection(); 337 | connection.connect(); 338 | //引入插入模块 339 | require('./router/register').registerAdmin(req,res,connection) 340 | }) 341 | //验证登录者 342 | app.post('/loginadmin', function(req, res) { 343 | // 解决跨域 344 | 345 | //然后请求的很快的时候才能正常关闭链接、 346 | var connection = createConnection(); 347 | connection.connect(); 348 | //引入插入模块 349 | require('./router/register').loginAdmin(req,res,connection) 350 | }) 351 | 352 | 353 | 354 | //赖俊豪写的 355 | app.post('/userregister', function(req, res) { 356 | 357 | //然后请求的很快的时候才能正常关闭链接、 358 | var connection = createConnection(); 359 | connection.connect(); 360 | //引入插入模块 361 | require('./router/userregister.js').userregister(req,res,connection) 362 | }) 363 | app.post('/userchange', function(req, res) { 364 | var connection = createConnection(); 365 | connection.connect(); 366 | //引入插入模块 367 | require('./router/userchange.js').userchange(req,res,connection) 368 | }) 369 | 370 | 371 | //监听该端口.............................................................................. 372 | var server = app.listen(3000, function() { 373 | //测试 374 | //测试 375 | var host = server.address().address 376 | var port = server.address().port 377 | console.log("应用实例,访问地址为 http://%s:%s", host, port) 378 | }) -------------------------------------------------------------------------------- /src/api/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "day03", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.4", 9 | "resolved": "https://registry.npmjs.org/accepts/-/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": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", 19 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" 20 | }, 21 | "array-flatten": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 24 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 25 | }, 26 | "arraybuffer.slice": { 27 | "version": "0.0.7", 28 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", 29 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" 30 | }, 31 | "async-limiter": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 34 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 35 | }, 36 | "backo2": { 37 | "version": "1.0.2", 38 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", 39 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" 40 | }, 41 | "base64-arraybuffer": { 42 | "version": "0.1.5", 43 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", 44 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" 45 | }, 46 | "base64id": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", 49 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" 50 | }, 51 | "better-assert": { 52 | "version": "1.0.2", 53 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", 54 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", 55 | "requires": { 56 | "callsite": "1.0.0" 57 | } 58 | }, 59 | "bignumber.js": { 60 | "version": "4.0.4", 61 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz", 62 | "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==" 63 | }, 64 | "blob": { 65 | "version": "0.0.4", 66 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", 67 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" 68 | }, 69 | "body-parser": { 70 | "version": "1.18.2", 71 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 72 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 73 | "requires": { 74 | "bytes": "3.0.0", 75 | "content-type": "1.0.4", 76 | "debug": "2.6.9", 77 | "depd": "1.1.2", 78 | "http-errors": "1.6.2", 79 | "iconv-lite": "0.4.19", 80 | "on-finished": "2.3.0", 81 | "qs": "6.5.1", 82 | "raw-body": "2.3.2", 83 | "type-is": "1.6.15" 84 | } 85 | }, 86 | "bootstrap": { 87 | "version": "3.3.7", 88 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", 89 | "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" 90 | }, 91 | "bytes": { 92 | "version": "3.0.0", 93 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 94 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 95 | }, 96 | "callsite": { 97 | "version": "1.0.0", 98 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", 99 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" 100 | }, 101 | "component-bind": { 102 | "version": "1.0.0", 103 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", 104 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" 105 | }, 106 | "component-emitter": { 107 | "version": "1.2.1", 108 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 109 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 110 | }, 111 | "component-inherit": { 112 | "version": "0.0.3", 113 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", 114 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" 115 | }, 116 | "content-disposition": { 117 | "version": "0.5.2", 118 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 119 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 120 | }, 121 | "content-type": { 122 | "version": "1.0.4", 123 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 124 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 125 | }, 126 | "cookie": { 127 | "version": "0.3.1", 128 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 129 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 130 | }, 131 | "cookie-signature": { 132 | "version": "1.0.6", 133 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 134 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 135 | }, 136 | "core-util-is": { 137 | "version": "1.0.2", 138 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 139 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 140 | }, 141 | "debug": { 142 | "version": "2.6.9", 143 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 144 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 145 | "requires": { 146 | "ms": "2.0.0" 147 | } 148 | }, 149 | "depd": { 150 | "version": "1.1.2", 151 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 152 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 153 | }, 154 | "destroy": { 155 | "version": "1.0.4", 156 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 157 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 158 | }, 159 | "ee-first": { 160 | "version": "1.1.1", 161 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 162 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 163 | }, 164 | "encodeurl": { 165 | "version": "1.0.2", 166 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 167 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 168 | }, 169 | "engine.io": { 170 | "version": "3.1.4", 171 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.4.tgz", 172 | "integrity": "sha1-PQIRtwpVLOhB/8fahiezAamkFi4=", 173 | "requires": { 174 | "accepts": "1.3.3", 175 | "base64id": "1.0.0", 176 | "cookie": "0.3.1", 177 | "debug": "2.6.9", 178 | "engine.io-parser": "2.1.2", 179 | "uws": "0.14.5", 180 | "ws": "3.3.3" 181 | }, 182 | "dependencies": { 183 | "accepts": { 184 | "version": "1.3.3", 185 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", 186 | "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", 187 | "requires": { 188 | "mime-types": "2.1.17", 189 | "negotiator": "0.6.1" 190 | } 191 | } 192 | } 193 | }, 194 | "engine.io-client": { 195 | "version": "3.1.4", 196 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz", 197 | "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=", 198 | "requires": { 199 | "component-emitter": "1.2.1", 200 | "component-inherit": "0.0.3", 201 | "debug": "2.6.9", 202 | "engine.io-parser": "2.1.2", 203 | "has-cors": "1.1.0", 204 | "indexof": "0.0.1", 205 | "parseqs": "0.0.5", 206 | "parseuri": "0.0.5", 207 | "ws": "3.3.3", 208 | "xmlhttprequest-ssl": "1.5.5", 209 | "yeast": "0.1.2" 210 | } 211 | }, 212 | "engine.io-parser": { 213 | "version": "2.1.2", 214 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", 215 | "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", 216 | "requires": { 217 | "after": "0.8.2", 218 | "arraybuffer.slice": "0.0.7", 219 | "base64-arraybuffer": "0.1.5", 220 | "blob": "0.0.4", 221 | "has-binary2": "1.0.2" 222 | } 223 | }, 224 | "escape-html": { 225 | "version": "1.0.3", 226 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 227 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 228 | }, 229 | "etag": { 230 | "version": "1.8.1", 231 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 232 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 233 | }, 234 | "express": { 235 | "version": "4.16.2", 236 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", 237 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", 238 | "requires": { 239 | "accepts": "1.3.4", 240 | "array-flatten": "1.1.1", 241 | "body-parser": "1.18.2", 242 | "content-disposition": "0.5.2", 243 | "content-type": "1.0.4", 244 | "cookie": "0.3.1", 245 | "cookie-signature": "1.0.6", 246 | "debug": "2.6.9", 247 | "depd": "1.1.2", 248 | "encodeurl": "1.0.2", 249 | "escape-html": "1.0.3", 250 | "etag": "1.8.1", 251 | "finalhandler": "1.1.0", 252 | "fresh": "0.5.2", 253 | "merge-descriptors": "1.0.1", 254 | "methods": "1.1.2", 255 | "on-finished": "2.3.0", 256 | "parseurl": "1.3.2", 257 | "path-to-regexp": "0.1.7", 258 | "proxy-addr": "2.0.2", 259 | "qs": "6.5.1", 260 | "range-parser": "1.2.0", 261 | "safe-buffer": "5.1.1", 262 | "send": "0.16.1", 263 | "serve-static": "1.13.1", 264 | "setprototypeof": "1.1.0", 265 | "statuses": "1.3.1", 266 | "type-is": "1.6.15", 267 | "utils-merge": "1.0.1", 268 | "vary": "1.1.2" 269 | } 270 | }, 271 | "finalhandler": { 272 | "version": "1.1.0", 273 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 274 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", 275 | "requires": { 276 | "debug": "2.6.9", 277 | "encodeurl": "1.0.2", 278 | "escape-html": "1.0.3", 279 | "on-finished": "2.3.0", 280 | "parseurl": "1.3.2", 281 | "statuses": "1.3.1", 282 | "unpipe": "1.0.0" 283 | } 284 | }, 285 | "forwarded": { 286 | "version": "0.1.2", 287 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 288 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 289 | }, 290 | "fresh": { 291 | "version": "0.5.2", 292 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 293 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 294 | }, 295 | "has-binary2": { 296 | "version": "1.0.2", 297 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", 298 | "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", 299 | "requires": { 300 | "isarray": "2.0.1" 301 | }, 302 | "dependencies": { 303 | "isarray": { 304 | "version": "2.0.1", 305 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 306 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 307 | } 308 | } 309 | }, 310 | "has-cors": { 311 | "version": "1.1.0", 312 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", 313 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" 314 | }, 315 | "http-errors": { 316 | "version": "1.6.2", 317 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 318 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 319 | "requires": { 320 | "depd": "1.1.1", 321 | "inherits": "2.0.3", 322 | "setprototypeof": "1.0.3", 323 | "statuses": "1.3.1" 324 | }, 325 | "dependencies": { 326 | "depd": { 327 | "version": "1.1.1", 328 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 329 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 330 | }, 331 | "setprototypeof": { 332 | "version": "1.0.3", 333 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 334 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 335 | } 336 | } 337 | }, 338 | "iconv-lite": { 339 | "version": "0.4.19", 340 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 341 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 342 | }, 343 | "indexof": { 344 | "version": "0.0.1", 345 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 346 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" 347 | }, 348 | "inherits": { 349 | "version": "2.0.3", 350 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 351 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 352 | }, 353 | "ipaddr.js": { 354 | "version": "1.5.2", 355 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", 356 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" 357 | }, 358 | "isarray": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 361 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 362 | }, 363 | "jquery": { 364 | "version": "3.3.1", 365 | "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", 366 | "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" 367 | }, 368 | "media-typer": { 369 | "version": "0.3.0", 370 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 371 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 372 | }, 373 | "merge-descriptors": { 374 | "version": "1.0.1", 375 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 376 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 377 | }, 378 | "methods": { 379 | "version": "1.1.2", 380 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 381 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 382 | }, 383 | "mime": { 384 | "version": "1.4.1", 385 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 386 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 387 | }, 388 | "mime-db": { 389 | "version": "1.30.0", 390 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 391 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 392 | }, 393 | "mime-types": { 394 | "version": "2.1.17", 395 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 396 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 397 | "requires": { 398 | "mime-db": "1.30.0" 399 | } 400 | }, 401 | "ms": { 402 | "version": "2.0.0", 403 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 404 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 405 | }, 406 | "mysql": { 407 | "version": "2.15.0", 408 | "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.15.0.tgz", 409 | "integrity": "sha512-C7tjzWtbN5nzkLIV+E8Crnl9bFyc7d3XJcBAvHKEVkjrYjogz3llo22q6s/hw+UcsE4/844pDob9ac+3dVjQSA==", 410 | "requires": { 411 | "bignumber.js": "4.0.4", 412 | "readable-stream": "2.3.3", 413 | "safe-buffer": "5.1.1", 414 | "sqlstring": "2.3.0" 415 | } 416 | }, 417 | "negotiator": { 418 | "version": "0.6.1", 419 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 420 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 421 | }, 422 | "object-component": { 423 | "version": "0.0.3", 424 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", 425 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" 426 | }, 427 | "on-finished": { 428 | "version": "2.3.0", 429 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 430 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 431 | "requires": { 432 | "ee-first": "1.1.1" 433 | } 434 | }, 435 | "parseqs": { 436 | "version": "0.0.5", 437 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", 438 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", 439 | "requires": { 440 | "better-assert": "1.0.2" 441 | } 442 | }, 443 | "parseuri": { 444 | "version": "0.0.5", 445 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", 446 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", 447 | "requires": { 448 | "better-assert": "1.0.2" 449 | } 450 | }, 451 | "parseurl": { 452 | "version": "1.3.2", 453 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 454 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 455 | }, 456 | "path-to-regexp": { 457 | "version": "0.1.7", 458 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 459 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 460 | }, 461 | "process-nextick-args": { 462 | "version": "1.0.7", 463 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 464 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 465 | }, 466 | "proxy-addr": { 467 | "version": "2.0.2", 468 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", 469 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", 470 | "requires": { 471 | "forwarded": "0.1.2", 472 | "ipaddr.js": "1.5.2" 473 | } 474 | }, 475 | "qs": { 476 | "version": "6.5.1", 477 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 478 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 479 | }, 480 | "range-parser": { 481 | "version": "1.2.0", 482 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 483 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 484 | }, 485 | "raw-body": { 486 | "version": "2.3.2", 487 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 488 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 489 | "requires": { 490 | "bytes": "3.0.0", 491 | "http-errors": "1.6.2", 492 | "iconv-lite": "0.4.19", 493 | "unpipe": "1.0.0" 494 | } 495 | }, 496 | "readable-stream": { 497 | "version": "2.3.3", 498 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 499 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 500 | "requires": { 501 | "core-util-is": "1.0.2", 502 | "inherits": "2.0.3", 503 | "isarray": "1.0.0", 504 | "process-nextick-args": "1.0.7", 505 | "safe-buffer": "5.1.1", 506 | "string_decoder": "1.0.3", 507 | "util-deprecate": "1.0.2" 508 | } 509 | }, 510 | "safe-buffer": { 511 | "version": "5.1.1", 512 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 513 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 514 | }, 515 | "send": { 516 | "version": "0.16.1", 517 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", 518 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", 519 | "requires": { 520 | "debug": "2.6.9", 521 | "depd": "1.1.2", 522 | "destroy": "1.0.4", 523 | "encodeurl": "1.0.2", 524 | "escape-html": "1.0.3", 525 | "etag": "1.8.1", 526 | "fresh": "0.5.2", 527 | "http-errors": "1.6.2", 528 | "mime": "1.4.1", 529 | "ms": "2.0.0", 530 | "on-finished": "2.3.0", 531 | "range-parser": "1.2.0", 532 | "statuses": "1.3.1" 533 | } 534 | }, 535 | "serve-static": { 536 | "version": "1.13.1", 537 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", 538 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", 539 | "requires": { 540 | "encodeurl": "1.0.2", 541 | "escape-html": "1.0.3", 542 | "parseurl": "1.3.2", 543 | "send": "0.16.1" 544 | } 545 | }, 546 | "setprototypeof": { 547 | "version": "1.1.0", 548 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 549 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 550 | }, 551 | "socket.io": { 552 | "version": "2.0.4", 553 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", 554 | "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", 555 | "requires": { 556 | "debug": "2.6.9", 557 | "engine.io": "3.1.4", 558 | "socket.io-adapter": "1.1.1", 559 | "socket.io-client": "2.0.4", 560 | "socket.io-parser": "3.1.2" 561 | } 562 | }, 563 | "socket.io-adapter": { 564 | "version": "1.1.1", 565 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", 566 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" 567 | }, 568 | "socket.io-client": { 569 | "version": "2.0.4", 570 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", 571 | "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", 572 | "requires": { 573 | "backo2": "1.0.2", 574 | "base64-arraybuffer": "0.1.5", 575 | "component-bind": "1.0.0", 576 | "component-emitter": "1.2.1", 577 | "debug": "2.6.9", 578 | "engine.io-client": "3.1.4", 579 | "has-cors": "1.1.0", 580 | "indexof": "0.0.1", 581 | "object-component": "0.0.3", 582 | "parseqs": "0.0.5", 583 | "parseuri": "0.0.5", 584 | "socket.io-parser": "3.1.2", 585 | "to-array": "0.1.4" 586 | } 587 | }, 588 | "socket.io-parser": { 589 | "version": "3.1.2", 590 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", 591 | "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", 592 | "requires": { 593 | "component-emitter": "1.2.1", 594 | "debug": "2.6.9", 595 | "has-binary2": "1.0.2", 596 | "isarray": "2.0.1" 597 | }, 598 | "dependencies": { 599 | "isarray": { 600 | "version": "2.0.1", 601 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", 602 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" 603 | } 604 | } 605 | }, 606 | "sqlstring": { 607 | "version": "2.3.0", 608 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.0.tgz", 609 | "integrity": "sha1-UluKT9Jtb3GqYegipsr5dtMa0qg=" 610 | }, 611 | "statuses": { 612 | "version": "1.3.1", 613 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 614 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 615 | }, 616 | "string_decoder": { 617 | "version": "1.0.3", 618 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 619 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 620 | "requires": { 621 | "safe-buffer": "5.1.1" 622 | } 623 | }, 624 | "to-array": { 625 | "version": "0.1.4", 626 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", 627 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" 628 | }, 629 | "type-is": { 630 | "version": "1.6.15", 631 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 632 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 633 | "requires": { 634 | "media-typer": "0.3.0", 635 | "mime-types": "2.1.17" 636 | } 637 | }, 638 | "ultron": { 639 | "version": "1.1.1", 640 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 641 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 642 | }, 643 | "unpipe": { 644 | "version": "1.0.0", 645 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 646 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 647 | }, 648 | "util-deprecate": { 649 | "version": "1.0.2", 650 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 651 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 652 | }, 653 | "utils-merge": { 654 | "version": "1.0.1", 655 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 656 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 657 | }, 658 | "uws": { 659 | "version": "0.14.5", 660 | "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", 661 | "integrity": "sha1-Z6rzPEaypYel9mZtAPdpEyjxSdw=", 662 | "optional": true 663 | }, 664 | "vary": { 665 | "version": "1.1.2", 666 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 667 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 668 | }, 669 | "ws": { 670 | "version": "3.3.3", 671 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 672 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 673 | "requires": { 674 | "async-limiter": "1.0.0", 675 | "safe-buffer": "5.1.1", 676 | "ultron": "1.1.1" 677 | } 678 | }, 679 | "xmlhttprequest-ssl": { 680 | "version": "1.5.5", 681 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", 682 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" 683 | }, 684 | "yeast": { 685 | "version": "0.1.2", 686 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", 687 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" 688 | } 689 | } 690 | } 691 | -------------------------------------------------------------------------------- /src/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "day03", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "1.js", 6 | "dependencies": { 7 | "body-parser": "^1.18.2", 8 | "bootstrap": "^3.3.7", 9 | "express": "^4.16.2", 10 | "jquery": "^3.2.1", 11 | "mysql": "^2.15.0", 12 | "socket.io": "^2.0.4" 13 | }, 14 | "devDependencies": {}, 15 | "scripts": { 16 | "test": "echo \"Error: no test specified\" && exit 1" 17 | }, 18 | "author": "", 19 | "license": "ISC" 20 | } 21 | -------------------------------------------------------------------------------- /src/api/router/del.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | //功能:根据传进来的id在数据库中查找并删除该id对应数据。 4 | //前提:先建立对应的数据库的表 5 | //接受参数:用于查找的信息:id:5 6 | //逻辑: 7 | //返回:obj.status为ture 8 | //配置:路由:delSelf require(该文件的路径).delSelf(req, res, connection) 9 | exports.delSelf=function(req,res,connection){ 10 | var hid = req.query.hid; 11 | connection.query(`delete FROM homestary where hid ='${hid}' `, function(error, results, fields) { 12 | if(error) throw error; 13 | //results =>array类型 14 | console.log('The solution is: ', results); 15 | //把数据整理,返回到前端 16 | var obj = { 17 | news: results, 18 | status: true 19 | } 20 | res.send(JSON.stringify(obj)); 21 | connection.end(); 22 | }); 23 | 24 | } 25 | //删除审核表的东西 26 | exports.delCheck=function(req,res,connection){ 27 | var hid = req.query.hid; 28 | connection.query(`delete FROM checkhomestay where hid ='${hid}' `, function(error, results, fields) { 29 | if(error) throw error; 30 | //results =>array类型 31 | console.log('The solution is: ', results); 32 | //把数据整理,返回到前端 33 | var obj = { 34 | news: results, 35 | status: true 36 | } 37 | res.send(JSON.stringify(obj)); 38 | connection.end(); 39 | }); 40 | 41 | } 42 | 43 | //解雇员工 44 | exports.disMissal=function(req,res,connection){ 45 | var aid = req.query.aid; 46 | connection.query(`delete FROM admin where aid ='${aid}' `, function(error, results, fields) { 47 | if(error) throw error; 48 | //results =>array类型 49 | console.log('The solution is: ', results); 50 | //把数据整理,返回到前端 51 | var obj = { 52 | news: results, 53 | status: true 54 | } 55 | res.send(JSON.stringify(obj)); 56 | connection.end(); 57 | }); 58 | 59 | } 60 | 61 | //删除工作计划 62 | exports.closePlan=function(req,res,connection){ 63 | var wid = req.query.wid; 64 | connection.query(`delete FROM workplan where wid ='${wid}' `, function(error, results, fields) { 65 | if(error) throw error; 66 | //results =>array类型 67 | console.log('The solution is: ', results); 68 | //把数据整理,返回到前端 69 | var obj = { 70 | news: results, 71 | status: true 72 | } 73 | res.send(JSON.stringify(obj)); 74 | connection.end(); 75 | }); 76 | 77 | } -------------------------------------------------------------------------------- /src/api/router/deleteRelease.js: -------------------------------------------------------------------------------- 1 | exports.deleteRelease = function(req, res, connection) { 2 | 3 | connection.query(`DELETE FROM wanted WHERE id = ${req.query.id}`, function(error, results, fields) { 4 | if(error) throw error; 5 | results =>array类型 6 | console.log('The solution is: ', results); 7 | //把数据整理,返回到前端 8 | // var obj = { 9 | // news: results, 10 | // status: true 11 | // } 12 | res.send(true); 13 | connection.end(); 14 | }) 15 | } -------------------------------------------------------------------------------- /src/api/router/insert.js: -------------------------------------------------------------------------------- 1 | //例如:register表中增加phone为XX,password为注册XX的数据. 2 | //功能:根据传进来的数据插入到数据库 3 | //前提:先建立对应的数据库的表 4 | //接受参数:需要插入的信息 5 | //逻辑:(以后完善可以能要先判断数据库中是否已存在该数据) 6 | //返回:obj.status为ture 7 | //配置:路由:insert require(该文件的路径).insert(req, res, connection) 8 | //工作计划的插入 9 | exports.setPlan = function(req, res, connection) { 10 | var title = req.query.title; 11 | var content = req.query.content; 12 | var deadline = req.query.deadline; 13 | 14 | connection.query(`INSERT into workplan (title,content,deadline)values('${title}','${content}','${deadline}')`, function(error, results, fields) { 15 | if(error) throw error; 16 | //results =>array类型 17 | console.log('The solution is: ', results); 18 | //把数据整理,返回到前端 19 | var obj = { 20 | news: results, 21 | status: true 22 | } 23 | res.send(JSON.stringify(obj)); 24 | connection.end(); 25 | }) 26 | } 27 | 28 | 29 | exports.insert = function(req, res, connection) { 30 | var phone = req.query.phone; 31 | var password = req.query.password; 32 | connection.query(`INSERT into register (phone,password)values('${phone}','${password}')`, function(error, results, fields) { 33 | if(error) throw error; 34 | //results =>array类型 35 | console.log('The solution is: ', results); 36 | //把数据整理,返回到前端 37 | var obj = { 38 | news: results, 39 | status: true 40 | } 41 | res.send(JSON.stringify(obj)); 42 | connection.end(); 43 | }) 44 | } 45 | //民宿信息验证成功之后,加入 46 | exports.insertCheck = function(req, res, connection) { 47 | var price = req.query.price; 48 | var image_src = req.query.image_src; 49 | var title = req.query.title; 50 | var city = req.query.city; 51 | 52 | 53 | connection.query(`INSERT into homestary (price,image_src,title,city)values('${price}','${image_src}','${title}','${city}')`, function(error, results, fields) { 54 | if(error) throw error; 55 | //results =>array类型 56 | console.log('The solution is: ', results); 57 | //把数据整理,返回到前端 58 | var obj = { 59 | news: results, 60 | status: true 61 | } 62 | res.send(JSON.stringify(obj)); 63 | connection.end(); 64 | }) 65 | } 66 | //订单插入 67 | exports.inserthzj = function(req, res, connection) { 68 | console.log(req.query.room_id) 69 | var room_id = req.query.room_id; 70 | 71 | connection.query(`INSERT into orderform (room_id)values('${room_id}')`, function(error, results, fields) { 72 | if(error) throw error; 73 | //results =>array类型 74 | console.log('The solution is: ', results); 75 | //把数据整理,返回到前端 76 | 77 | res.send(results); 78 | connection.end(); 79 | }) 80 | } -------------------------------------------------------------------------------- /src/api/router/myRelease.js: -------------------------------------------------------------------------------- 1 | //通过id查找homestay里面的东西 2 | exports.myRelease = function(req, res, connection) { 3 | // 查找...................... 4 | connection.query(`SELECT * FROM wanted`, function(error, results, fields) { 5 | if(error) throw error; 6 | //results =>array类型 7 | console.log(results); 8 | //把数据整理,返回到前端 9 | // var obj = { 10 | // news: results, 11 | // } 12 | res.send(results); 13 | connection.end(); 14 | }); 15 | } -------------------------------------------------------------------------------- /src/api/router/orderlist.js: -------------------------------------------------------------------------------- 1 | //查找订单所有的东西 2 | exports.orderlist = function(req, res, connection) { 3 | 4 | connection.query(`SELECT 5 | * 6 | FROM orderform as a 7 | INNER JOIN homestary as b 8 | INNER JOIN ordertype as c 9 | WHERE 10 | a.room_id=b.hid AND a.user_id=${req.query.id} AND a.type=c.type;`, 11 | function(error, results, fields) { 12 | if(error) throw error; 13 | //results =>array类型 14 | 15 | //把数据整理,返回到前端 16 | console.log(results); 17 | res.send(results); 18 | connection.end(); 19 | }); 20 | } -------------------------------------------------------------------------------- /src/api/router/register.js: -------------------------------------------------------------------------------- 1 | //注册登录 2 | 3 | //功能:注册。 4 | //前提:先建立对应的数据库的表 5 | //接受参数:注册的信息 6 | //逻辑:先查数据库是否已注册,没有被注册才允许注册 7 | //返回:注册成功/该手机已注册 8 | //配置:路由:register require(该文件的路径).register(req, res, connection) 9 | 10 | 11 | exports.register = function(req, res, connection) { 12 | //获取注册的手机,密码 13 | var phone = req.query.phone; 14 | var password = req.query.password; 15 | //先查找手机似乎否已被注册 16 | connection.query(`SELECT phone from register where phone = '${phone}'`, function(err, data) { 17 | //数据库中查不到手机号会返回空的数组 18 | if(data.length == 0) { 19 | connection.query(`INSERT into register (phone,password)values('${phone}','${password}')`, function(err, data) { 20 | 21 | res.send('注册成功') 22 | }) 23 | //关闭数据库要写进判断里面 24 | connection.end(); 25 | } else { 26 | res.send('该手机已注册') 27 | //关闭数据库要写进判断里面 28 | connection.end(); 29 | } 30 | 31 | }) 32 | 33 | } 34 | 35 | //注册管理者,就是这个 36 | 37 | //var bodyParser = require('body-parser') 38 | //app.use(bodyParser.urlencoded({ 39 | // extended: false 40 | //})) 41 | exports.registerAdmin = function(req, res, connection) { 42 | //获取注册的手机,密码 43 | console.log(req.body) 44 | var username=req.body.username; 45 | var password = req.body.password; 46 | //先查找手机似乎否已被注册 47 | connection.query(`SELECT username from admin where username = '${username}'`, function(err, data) { 48 | //数据库中查不到手机号会返回空的数组 49 | if(data.length == 0) { 50 | connection.query(`INSERT into admin (username,password)values('${username}','${password}')`, function(err, data) { 51 | 52 | res.send(true) 53 | }) 54 | //关闭数据库要写进判断里面 55 | connection.end(); 56 | } else { 57 | res.send(false) 58 | //关闭数据库要写进判断里面 59 | connection.end(); 60 | } 61 | 62 | }) 63 | 64 | } 65 | //登录 66 | //功能:登录。 67 | //前提:先建立对应的数据库的表 68 | //接受参数:登录的信息。 69 | //逻辑:先查数据库帐号密码是否已注册,查询到有注册才允许登录 70 | //返回:手机没注册或密码错误/登录成功 71 | //配置:路由:login require(该文件的路径).login(req, res, connection) 72 | exports.loginAdmin = function(req, res, connection) { 73 | 74 | 75 | var username = req.body.username; 76 | var password = req.body.password; 77 | console.log(username,password) 78 | //查找手机是否已经注册 79 | connection.query(`SELECT * from admin where username = '${username}' and password='${password}'`, function(err, data) { 80 | if(data.length==0){ 81 | //数据库中没有匹配到帐号密码 82 | res.send(false) 83 | connection.end(); 84 | }else{ 85 | var obj = { 86 | news: data, 87 | } 88 | // res.send(JSON.stringify(obj)); 89 | res.send(data); 90 | connection.end(); 91 | } 92 | }) 93 | } -------------------------------------------------------------------------------- /src/api/router/release.js: -------------------------------------------------------------------------------- 1 | exports.release = function(req, res, connection) { 2 | var city = req.body.city; 3 | var district = req.body.district; 4 | var date = req.body.date; 5 | var room = req.body.room; 6 | console.log(city,district,date,room) 7 | connection.query(`INSERT into wanted (city,district,times,house_type)values('${city}','${district}','${date}','${room}')`, function(error, results, fields) { 8 | if(error) throw error; 9 | //results =>array类型 10 | console.log('The solution is: ', results); 11 | //把数据整理,返回到前端 12 | // var obj = { 13 | // news: results, 14 | // status: true 15 | // } 16 | res.send(true); 17 | connection.end(); 18 | }) 19 | } -------------------------------------------------------------------------------- /src/api/router/select.js: -------------------------------------------------------------------------------- 1 | //通过id查找admin表里面的东西 2 | exports.selectAid = function(req, res, connection) { 3 | //查找...................... 4 | var aid = req.query.aid; 5 | connection.query(`SELECT * FROM admin where aid = '${aid}'`, function(error, results, fields) { 6 | if(error) throw error; 7 | //results =>array类型 8 | console.log('The solution is: ', results); 9 | //把数据整理,返回到前端 10 | var obj = { 11 | news: results, 12 | } 13 | res.send(results); 14 | connection.end(); 15 | }); 16 | } 17 | 18 | 19 | //通过id查找homestay里面的东西 20 | exports.selectId = function(req, res, connection) { 21 | //查找...................... 22 | var hid = req.query.hid; 23 | connection.query(`SELECT * FROM homestary where hid = '${hid}'`, function(error, results, fields) { 24 | if(error) throw error; 25 | //results =>array类型 26 | console.log('The solution is: ', results); 27 | //把数据整理,返回到前端 28 | var obj = { 29 | news: results, 30 | } 31 | res.send(results); 32 | connection.end(); 33 | }); 34 | } 35 | 36 | //查找所有的员工信息 37 | exports.getadmin = function(req, res, connection) { 38 | connection.query(`SELECT * FROM admin`, function(error, results, fields) { 39 | if(error) throw error; 40 | //results =>array类型 41 | console.log('The solution is: ', results); 42 | //把数据整理,返回到前端 43 | var obj = { 44 | news: results, 45 | } 46 | res.send(JSON.stringify(obj)); 47 | connection.end(); 48 | }); 49 | } 50 | 51 | //查找所有审核表单里的东西 52 | exports.checkhomestay = function(req, res, connection) { 53 | connection.query(`SELECT * FROM checkhomestay`, function(error, results, fields) { 54 | if(error) throw error; 55 | //results =>array类型 56 | console.log('The solution is: ', results); 57 | //把数据整理,返回到前端 58 | var obj = { 59 | news: results, 60 | } 61 | res.send(JSON.stringify(obj)); 62 | connection.end(); 63 | }); 64 | } 65 | //获得所有workplan里面的东西 66 | exports.getplan = function(req, res, connection) { 67 | connection.query(`SELECT * FROM workplan`, function(error, results, fields) { 68 | if(error) throw error; 69 | //results =>array类型 70 | console.log('The solution is: ', results); 71 | //把数据整理,返回到前端 72 | var obj = { 73 | news: results, 74 | } 75 | res.send(JSON.stringify(obj)); 76 | connection.end(); 77 | }); 78 | } 79 | 80 | exports.selectAll = function(req, res, connection) { 81 | connection.query(`SELECT * FROM homestary`, function(error, results, fields) { 82 | if(error) throw error; 83 | //results =>array类型 84 | console.log('The solution is: ', results); 85 | //把数据整理,返回到前端 86 | var obj = { 87 | news: results, 88 | } 89 | res.send(results); 90 | connection.end(); 91 | }); 92 | } 93 | 94 | 95 | 96 | //查找travel所有的东西 97 | exports.selectTravel = function(req, res, connection) { 98 | connection.query(`SELECT * FROM travelStrategy`, function(error, results, fields) { 99 | if(error) throw error; 100 | //results =>array类型 101 | console.log('The solution is: ', results); 102 | //把数据整理,返回到前端 103 | 104 | res.send(results); 105 | connection.end(); 106 | }); 107 | } 108 | //分页查找所有的酒店信息 109 | exports.selectPage = function(req,res,connection){ 110 | var pageCount = req.query.pageCount||10; 111 | var page = req.query.page||1; 112 | var pageBegin = pageCount * (page - 1) 113 | //从这里开始显示 显示多少个 114 | connection.query('select * from homestary limit '+ pageBegin + ','+pageCount,function(err,results, fields){ 115 | var obj = { 116 | news: results, 117 | } 118 | res.end(JSON.stringify(obj)) 119 | 120 | 121 | }) 122 | connection.end(); 123 | 124 | } 125 | 126 | //获取所有评论 127 | exports.selectCommon = function(req,res,connection){ 128 | connection.query(`SELECT 129 | * 130 | FROM commons as a 131 | INNER JOIN orderform as b INNER JOIN homestary as c 132 | 133 | WHERE a.order_id = b.id AND b.room_id=c.hid; 134 | 135 | `, function(error, results, fields) { 136 | if(error) throw error; 137 | //results =>array类型 138 | console.log('The solution is: ', results); 139 | //把数据整理,返回到前端 140 | 141 | res.send(results); 142 | connection.end(); 143 | }); 144 | 145 | } -------------------------------------------------------------------------------- /src/api/router/selecthotel.js: -------------------------------------------------------------------------------- 1 | //查找travel所有的东西 2 | exports.selecthotel = function(req, res, connection) { 3 | console.log(111); 4 | var pageCount = 10; 5 | var page = (req.query.page); 6 | var pageEnd = pageCount * (page); 7 | var city=decodeURI(req.query.city); 8 | connection.query(`SELECT * FROM homestary where city='${city}' limit ${pageEnd}`, function(error, results, fields) { 9 | if(error) throw error; 10 | //results =>array类型 11 | console.log('The solution is: ', results); 12 | res.send(results); 13 | connection.end(); 14 | // connection.query(`SELECT count(*) as total FROM homestary where city='${city}'`, function(error, data, fields) { 15 | // if(error) throw error; 16 | // //results =>array类型 17 | // console.log('The solution is: ', results); 18 | // res.send({results,data}); 19 | // connection.end(); 20 | 21 | 22 | // }); 23 | 24 | }); 25 | 26 | // connection.query(` 27 | // select 28 | // SQL_CALC_FOUND_ROWS 29 | // * 30 | // from 31 | // homestary 32 | // WHERE city='${city}' limit ${pageEnd}; 33 | // select count(*) as rowscount from homestary where city='${city}' ;`, function(error, results, fields) { 34 | // if(error) throw error; 35 | // //results =>array类型 36 | // console.log('The solution is: ', results); 37 | // res.send(results); 38 | // connection.end(); 39 | // }); 40 | 41 | } -------------------------------------------------------------------------------- /src/api/router/share.js: -------------------------------------------------------------------------------- 1 | //查找travel所有的东西 2 | exports.selectShare = function(req, res, connection) { 3 | console.log(req.query.uid); 4 | 5 | connection.query(`SELECT * FROM share where uid=${req.query.uid}`, function(error, results, fields) { 6 | if(error) throw error; 7 | //results =>array类型 8 | 9 | //把数据整理,返回到前端 10 | 11 | res.send(results); 12 | connection.end(); 13 | }); 14 | } -------------------------------------------------------------------------------- /src/api/router/sorthotel.js: -------------------------------------------------------------------------------- 1 | //酒店排序 2 | exports.sorthotel = function(req, res, connection) { 3 | var city=req.query.city; 4 | city=decodeURI(city); 5 | var sort=req.query.sort; 6 | connection.query(`SELECT * FROM homestary where city='${city}' order by price ${sort}`, function(error, results, fields) { 7 | if(error) throw error; 8 | //results =>array类型 9 | console.log('The solution is: ', results); 10 | //把数据整理,返回到前端 11 | res.send(results); 12 | connection.end(); 13 | }); 14 | } -------------------------------------------------------------------------------- /src/api/router/update.js: -------------------------------------------------------------------------------- 1 | //修改.......................... 2 | 3 | //功能:更新admin里面的评分 4 | exports.updaterare=function(req,res,connection){ 5 | console.log(req); 6 | var aid = req.query.aid; 7 | var rate = req.query.rate; 8 | //注意数据类型,字符串要加引号,int不要加引号 9 | connection.query(`update admin set rate='${rate}' where aid = '${aid}'`, function(error, results, fields) { 10 | if(error) throw error; 11 | //results =>array类型 12 | console.log('The solution is: ', results); 13 | //把数据整理,返回到前端 14 | var obj = { 15 | news: results, 16 | status: true 17 | } 18 | res.send(JSON.stringify(obj)); 19 | connection.end(); 20 | }) 21 | } 22 | //功能:更新商品列表里面的信息 23 | exports.edithhomestay = function(req,res,connection){ 24 | console.log(req); 25 | var hid = req.query.hid; 26 | var city = req.query.city; 27 | var title = req.query.title; 28 | var price = req.query.price; 29 | //注意数据类型,字符串要加引号,int不要加引号 30 | connection.query(`update homestary set city='${city}',title='${title}',price='${price}' where hid = '${hid}'`, function(error, results, fields) { 31 | if(error) throw error; 32 | //results =>array类型 33 | console.log('The solution is: ', results); 34 | //把数据整理,返回到前端 35 | var obj = { 36 | news: results, 37 | status: true 38 | } 39 | res.send(JSON.stringify(obj)); 40 | connection.end(); 41 | }) 42 | } 43 | //更改订单状态 44 | exports.updateType = function(req,res,connection){ 45 | console.log(req); 46 | var id = req.query.id; 47 | var type = req.query.type; 48 | //注意数据类型,字符串要加引号,int不要加引号 49 | connection.query(`update orderform set type='${type}' where id = '${id}'`, function(error, results, fields) { 50 | if(error) throw error; 51 | //results =>array类型 52 | console.log('The solution is: ', results); 53 | //把数据整理,返回到前端 54 | 55 | res.send(results); 56 | connection.end(); 57 | }) 58 | } -------------------------------------------------------------------------------- /src/api/router/userchange.js: -------------------------------------------------------------------------------- 1 | 2 | exports.userchange = function(req, res, connection) { 3 | var user = req.body.username; 4 | var password = req.body.password; 5 | connection.query(`SELECT * from user where username = '${user}'`, function(err, data) { 6 | if(data.length==0){ 7 | res.send(false) 8 | connection.end(); 9 | }else{ 10 | connection.query(`UPDATE user set password = '${password}' where username = '${user}'`) 11 | res.send(true); 12 | connection.end(); 13 | } 14 | }) 15 | } 16 | 17 | -------------------------------------------------------------------------------- /src/api/router/userlogin.js: -------------------------------------------------------------------------------- 1 | 2 | exports.userlogin = function(req, res, connection) { 3 | var user = req.query.username; 4 | var password = req.query.password; 5 | console.log(user,password); 6 | connection.query(`SELECT * from user where username = '${user}' and password='${password}'`, function(err, data) { 7 | if(data.length==0){ 8 | //数据库中没有匹配到帐号密码 9 | res.send(false) 10 | connection.end(); 11 | }else{ 12 | 13 | res.send(true) 14 | connection.end(); 15 | } 16 | }) 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/api/router/userregister.js: -------------------------------------------------------------------------------- 1 | exports.userregister = function(req, res, connection) { 2 | var username=req.body.username; 3 | var password = req.body.password; 4 | connection.query(`SELECT username from user where username = '${username}'`, function(err, data) { 5 | if(data.length == 0) { 6 | connection.query(`INSERT into user (username,password)values('${username}','${password}')`, function(err, data) { 7 | 8 | res.send(true) 9 | }) 10 | connection.end(); 11 | } else { 12 | res.send(false) 13 | connection.end(); 14 | } 15 | }) 16 | } 17 | 18 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | 4 | 5 | //引入路由 6 | import {Router,hashHistory,Route} from 'react-router'; 7 | import routes from './router/index' 8 | 9 | 10 | 11 | //引入状态管理 12 | import {Provider} from 'react-redux' 13 | 14 | import store from './redux/configStore' 15 | 16 | //引入basecss 17 | import './utils/base.scss' 18 | 19 | 20 | //渲染 21 | ReactDOM.render( 22 | 23 | 24 | , 25 | document.getElementById('app') 26 | ) 27 | // "start": "webpack-dev-server --devtool eval --progress --host 10.3.136.153 --port 3002 --colors --content-base ./" -------------------------------------------------------------------------------- /src/components/control/ControlComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react'; 2 | import { Row, Col ,Menu, Icon,Modal} from 'antd'; 3 | import './control.scss'; 4 | import {Link,hashHistory} from 'react-router' 5 | 6 | import {connect} from 'react-redux'; 7 | import * as actions from './controlAction'; 8 | 9 | const SubMenu = Menu.SubMenu; 10 | const MenuItemGroup = Menu.ItemGroup; 11 | 12 | class ControlComponent extends Component{ 13 | state = { 14 | aidname:'', 15 | permission:window.localStorage.Permission, 16 | top:'none', 17 | public:'none', 18 | } 19 | componentWillMount(){ 20 | var aid = window.localStorage.aid; 21 | if(window.localStorage.Permission=='1'){ 22 | this.setState({ 23 | top:'block', 24 | public:'none', 25 | }) 26 | }else if(window.localStorage.Permission=='0'){ 27 | this.setState({ 28 | top:'none', 29 | public:'block', 30 | }) 31 | } 32 | this.props.getaiddatalist(aid).then(function(res){ 33 | 34 | this.setState({ 35 | aidname:res[0].username||0, 36 | // permission:res[0].permission||0, 37 | }) 38 | 39 | 40 | }.bind(this)); 41 | } 42 | error(){ 43 | Modal.error({ 44 | title: '错误提示', 45 | content: '你不是又酷又帅气能旋转跳跃飞舞的鱼露,你没权进入' 46 | }) 47 | } 48 | success(){ 49 | Modal.success({ 50 | title: '温馨提示', 51 | content: '你已经成功操作', 52 | }); 53 | } 54 | handleClick(e){ 55 | var self = this; 56 | if(e.key=='a10'&&this.state.permission=='1'){ 57 | hashHistory.push({ 58 | pathname:'/control/performance' 59 | }) 60 | 61 | }else if(e.key=='a10'&&this.state.permission!='1'){ 62 | this.error(); 63 | console.log(this.state.permission) 64 | } 65 | } 66 | 67 | render(){ 68 | return( 69 | 70 | 71 | 78 | 工作台}> 79 | 工作备忘录 80 | 审核业主信息 81 | 编辑民宿信息 82 | 83 | 详情页}> 84 | 工作计划 85 | 86 | 营业状态 87 | 好评率 88 | 89 | 90 | 员工详情}> 91 | 在职员工 92 | 员工绩效 93 | 94 | 95 | 96 | 97 | 98 |
99 | 105 |
106 | 107 | {this.props.children} 108 | 109 | 110 |
111 | ) 112 | } 113 | } 114 | 115 | //{this.props.children && React.cloneElement(this.props.children, { 116 | // permission: this.state.permission 117 | //})} 118 | let mapStateToProps = (state) =>{ 119 | // console.log(state); 120 | return{ 121 | ajaxStatus:state.checkReducer.status, 122 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 123 | 124 | } 125 | } 126 | //把组件,状态,方法发射出去(代替export default class Component) 127 | export default connect(mapStateToProps,actions)(ControlComponent); -------------------------------------------------------------------------------- /src/components/control/control.scss: -------------------------------------------------------------------------------- 1 | .controlBox{ 2 | padding-top: 30px; 3 | .head{ 4 | h1{ 5 | font-size: 32px; 6 | font-weight: bold; 7 | padding-bottom: 10px; 8 | } 9 | p{ 10 | color: #ccc; 11 | padding-bottom: 10px; 12 | text-indent: 30px; 13 | } 14 | } 15 | .form{ 16 | p{ 17 | padding: 20px 10px; 18 | label{ 19 | display: block; 20 | } 21 | } 22 | button{ 23 | position: relative; 24 | left: 30px; 25 | } 26 | } 27 | } 28 | .listbox{ 29 | .checkli{ 30 | height: 350px; 31 | margin: 10px 2px; 32 | } 33 | li{ 34 | border: 1px solid #dbdbdb; 35 | padding: 20px; 36 | width: 250px; 37 | 38 | float: left; 39 | margin-left: 10px; 40 | img{ 41 | width: 200px; 42 | height: 150px; 43 | } 44 | p{ 45 | padding: 6px; 46 | padding-right: 4px; 47 | color: cornflowerblue; 48 | font-weight: bold; 49 | span{ 50 | color: #333; 51 | font-weight:200 ; 52 | padding-left: 40px; 53 | } 54 | } 55 | button{ 56 | margin-right: 8px; 57 | } 58 | } 59 | .planlist{ 60 | width: 500px; 61 | margin-left:30px ; 62 | margin-bottom: 30px; 63 | 64 | } 65 | table{ 66 | margin-left: 30px; 67 | margin-top: 30px; 68 | border: 1px solid gainsboro; 69 | text-align: center; 70 | width: 806px; 71 | th{ 72 | border: 1px solid gainsboro; 73 | padding: 15px 9px; 74 | font-size: 18px; 75 | 76 | } 77 | td{ 78 | padding: 15px 5px; 79 | width: 200px; 80 | font-size: 16px; 81 | border: 1px solid gainsboro; 82 | } 83 | tr:nth-child(2n){ 84 | background-color: beige; 85 | } 86 | th{ 87 | background: cornflowerblue; 88 | color:#fff; 89 | } 90 | li{ 91 | border: 0 none; 92 | margin: 0; 93 | padding: 0; 94 | float: left; 95 | width: 32px; 96 | } 97 | } 98 | } 99 | .rbox{ 100 | margin-top: 30px; 101 | border: 1px solid gainsboro; 102 | text-align: center; 103 | td,th{ 104 | border: 1px solid gainsboro; 105 | padding: 15px 35px; 106 | font-size: 20px; 107 | 108 | } 109 | th{ 110 | background: cornflowerblue; 111 | color:#fff; 112 | } 113 | } 114 | .blue{ 115 | color: cornflowerblue; 116 | font-weight: bold; 117 | padding: 6px; 118 | 119 | } 120 | input{ 121 | width: 100%; 122 | } 123 | .adminhead{ 124 | height: 66px; 125 | width: 100%; 126 | background-color:#FFFFFF; 127 | position: fixed; 128 | top: 0px; 129 | right: -256px; 130 | z-index: 1000; 131 | border-bottom: 2px solid #F7F8F8; 132 | ul{ 133 | float: right; 134 | margin-right:290px; 135 | } 136 | li{ 137 | line-height: 66px; 138 | float: left; 139 | width: 150px; 140 | font-size: 16px; 141 | text-align: center; 142 | span{ 143 | padding: 0 10px; 144 | font-weight: bold; 145 | color: #333; 146 | } 147 | } 148 | 149 | } 150 | .top{ 151 | color:red; 152 | } 153 | .public{ 154 | color:#ccc; 155 | } 156 | -------------------------------------------------------------------------------- /src/components/control/controlAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | import * as loginConstants from '../../constaints/loginConstants' 4 | 5 | export function getaiddatalist(aid){ 6 | return{ 7 | url:'selectaid', 8 | types:[loginConstants.LOGIN_REQUESTING,loginConstants.LOGIN_REQUESTED,loginConstants.LOGIN_REQUESTERROR], 9 | data:{aid:aid} 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /src/components/controldetalist/checkAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function getcheck(){ 5 | return{ 6 | url:'checkhomestay' 7 | //假如需要传参 8 | //data:{} 9 | } 10 | } 11 | 12 | export function deletcheck(hid){ 13 | return{ 14 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 15 | url:'deletcheck', 16 | data:{ 17 | hid:hid 18 | } 19 | } 20 | } 21 | 22 | export function insertclick(src,address,budget,city){ 23 | console.log(src,address,budget,city); 24 | return{ 25 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 26 | url:'insertcheck', 27 | data:{ 28 | image_src:src, 29 | title:address, 30 | price:budget, 31 | city:city 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/components/controldetalist/checkHomestay.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { DatePicker,Input, Modal, Button} from 'antd'; 3 | import {connect} from 'react-redux' 4 | import * as actions from './checkAction'; 5 | import $ from 'jquery'; 6 | //自动调用,需要用到一个生命周期 componentWillMount 7 | //把action挂载在props上了 8 | class CheckHomestay extends Component{ 9 | state = { 10 | adminPermission:0, 11 | 12 | } 13 | componentWillMount(){ 14 | this.setState({ 15 | adminPermission:window.localStorage.Permission, 16 | }) 17 | 18 | this.props.getcheck().then(function(){ 19 | 20 | }.bind(this)) 21 | // $(document).scroll(function(){ 22 | //// console.log($("img")); 23 | // var winHeight = window.innerHeight; 24 | // var scrollTop = $(document).scrollTop(); 25 | // $.each($("img",function(i,ele){ 26 | // var top = $(this).offset().top//g该图片距离html的点顶部的距离 27 | // if(scrollTop < top && top 74 |
75 |

申请列表

76 |

这里可以查看和审核业主租房申请,如果经过核实为真实信息,可以批准,并加入到民宿列表

77 |
78 |
79 | 98 |
99 | 100 | ) 101 | } 102 | } 103 | //接受ajax的状态,请求回来的东西,通过this.props.ajaxStatus获取请求回来的东西 104 | let mapStateToProps = (state) =>{ 105 | // console.log(state.loginReducer)//,给个判断,让请求中underfined的时候不报错 106 | return{ 107 | ajaxStatus:state.checkReducer.status, 108 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 109 | } 110 | } 111 | //把组件,状态,方法发射出去(代替export default class Component) 112 | export default connect(mapStateToProps,actions)(CheckHomestay); 113 | -------------------------------------------------------------------------------- /src/components/controldetalist/checkReducer.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | //深拷贝原始状态 3 | export default function checkReducer(state={},action){ 4 | 5 | let newState = JSON.parse(JSON.stringify(state)) 6 | switch(action.type){ 7 | case ajaxConstants.AJAX_REQUESTING: 8 | newState.status = 0; 9 | break; 10 | case ajaxConstants.AJAX_REQUESTED: 11 | newState.status = 1; 12 | newState.result = action.result; 13 | break; 14 | case ajaxConstants.AJAX_REQUESTERROR: 15 | newState.status = -1; 16 | newState.result = action.result; 17 | break; 18 | 19 | 20 | } 21 | return newState; 22 | } 23 | //状态正在请求中 0 -------------------------------------------------------------------------------- /src/components/controldetalist/editAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function selectPage(page){ 5 | return{ 6 | url:'selectpage', 7 | data:{page:page} 8 | } 9 | } 10 | export function deleteHomestray(hid){ 11 | return{ 12 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 13 | url:'delethomestray', 14 | data:{ 15 | hid:hid 16 | } 17 | } 18 | } 19 | export function editHomestay(hid,city,price,title){ 20 | return{ 21 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 22 | url:'edithhomestay', 23 | data:{ 24 | hid:hid, 25 | city:city, 26 | price:price, 27 | title:title 28 | } 29 | } 30 | } 31 | //假如需要传参 32 | //data:{} -------------------------------------------------------------------------------- /src/components/controldetalist/editComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { Button,Icon,Rate,Pagination,Modal } from 'antd'; 3 | 4 | import {connect} from 'react-redux' 5 | import * as actions from './editAction'; 6 | 7 | class EditComponent extends Component{ 8 | 9 | componentWillMount(){ 10 | this.props.selectPage() 11 | this.setState({ 12 | adminPermission:window.localStorage.Permission, 13 | }) 14 | } 15 | state = { 16 | current:1, 17 | price:'', 18 | city:'', 19 | title:'', 20 | adminPermission:0, 21 | } 22 | onChange = (page) => { 23 | this.setState({ 24 | current: page, 25 | }); 26 | this.props.selectPage(page); 27 | } 28 | error(){ 29 | Modal.error({ 30 | title: '错误提示', 31 | content: '你不是又酷又帅气能旋转跳跃飞舞的鱼露,你没权操作' 32 | }) 33 | } 34 | success(){ 35 | Modal.success({ 36 | title: '温馨提示', 37 | content: '你已经成功操作', 38 | }); 39 | } 40 | delclick(hid){ 41 | if(this.state.adminPermission==1){ 42 | this.props.deleteHomestray(hid).then(function(){ 43 | this.success(); 44 | 45 | this.props.selectPage(this.current) 46 | }.bind(this)) 47 | 48 | }else{ 49 | this.error(); 50 | } 51 | } 52 | saveclick(hid,hcity,htitle,hprice){ 53 | var city = this.state.city; 54 | var price = this.state.price; 55 | var title = this.state.title; 56 | city = city != '' ? this.state.city : hcity; 57 | price = price != '' ? this.state.price : hprice; 58 | title = title != '' ? this.state.title : htitle; 59 | if(this.state.adminPermission==1){ 60 | this.props.editHomestay(hid,city,this.state.price,this.state.title).then(function(){ 61 | this.success() 62 | }.bind(this)) 63 | }else{ 64 | this.error(); 65 | } 66 | } 67 | editTab(event){ 68 | if(event.target.tagName=='TD'&&(event.target.className!='1'&&event.target.className!='5')){ 69 | // console.log(event.target); 70 | let input = document.createElement('input'); 71 | input.type = 'text'; 72 | input.value = event.target.innerText; 73 | event.target.innerHTML = ''; 74 | event.target.appendChild(input); 75 | input.focus(); 76 | 77 | var self = this; 78 | 79 | input.onblur = function(){ 80 | // console.log(this.parentNode.className); 81 | if(this.parentNode.className=='2'){ 82 | self.setState({ 83 | title:this.value, 84 | }) 85 | }else if(this.parentNode.className=='3'){ 86 | self.setState({ 87 | price:this.value, 88 | }) 89 | }else if(this.parentNode.className=='4'){ 90 | self.setState({ 91 | city:this.value, 92 | }) 93 | } 94 | this.parentNode.innerHTML = this.value; 95 | } 96 | 97 | 98 | } 99 | } 100 | render(){ 101 | return( 102 |
103 |
104 |

编辑民宿信息

105 |

你可以在这里修改已上线的民宿信息,或者删除信息错误的民宿

106 |
107 |
108 | 109 |
110 | 111 |
112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | { 124 | this.props.ajaxResult.map((item,idx) => { 125 | return ( 126 | 127 | 128 | 129 | 130 | 131 | 135 | 136 | ) 137 | }) 138 | } 139 | 140 | 141 |
序号酒店名称价格城市操作
{idx+1}{item.title}{item.price}{item.city} 132 | 133 | 134 |
142 |
143 |
144 | ) 145 | } 146 | } 147 | let mapStateToProps = (state) =>{ 148 | return{ 149 | ajaxStatus:state.checkReducer.status, 150 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 151 | } 152 | } 153 | //把组件,状态,方法发射出去(代替export default class Component) 154 | export default connect(mapStateToProps,actions)(EditComponent); -------------------------------------------------------------------------------- /src/components/controldetalist/employee.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { Button,Icon,Rate,Modal } from 'antd'; 3 | 4 | import {connect} from 'react-redux' 5 | import * as actions from './employeeAction'; 6 | 7 | class Employee extends Component{ 8 | state = { 9 | adminPermission:0, 10 | } 11 | componentWillMount(){ 12 | this.props.getadmin() 13 | this.setState({ 14 | adminPermission:window.localStorage.Permission, 15 | }) 16 | } 17 | error(){ 18 | Modal.error({ 19 | title: '错误提示', 20 | content: '你不是又酷又帅气能旋转跳跃飞舞的鱼露,你没权操作' 21 | }) 22 | } 23 | success(){ 24 | Modal.success({ 25 | title: '温馨提示', 26 | content: '你已经成功操作', 27 | }); 28 | } 29 | delectclick(aid){ 30 | if(this.state.adminPermission==1){ 31 | this.props.dismissal(aid).then(function(){ 32 | this.props.getadmin().then(function(){ 33 | this.success(); 34 | 35 | }.bind(this)) 36 | }.bind(this)); 37 | }else{ 38 | this.error(); 39 | console.log(this.state.adminPermission) 40 | } 41 | } 42 | render(){ 43 | return( 44 |
45 |
46 |

在职员工信息

47 |

你可以查看到先公司的在员工信息,,以及他们的权限

48 |
49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | { 62 | this.props.ajaxResult.map(item => { 63 | return ( 64 | 65 | 66 | 67 | 68 | 69 | 72 | 73 | ) 74 | }) 75 | } 76 | 77 | 78 |
工号人员权限绩效操作
{item.aid}{item.username}{item.permission} 70 | 71 |
79 |
80 |
81 | ) 82 | } 83 | } 84 | let mapStateToProps = (state) =>{ 85 | return{ 86 | ajaxStatus:state.checkReducer.status, 87 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 88 | } 89 | } 90 | //把组件,状态,方法发射出去(代替export default class Component) 91 | export default connect(mapStateToProps,actions)(Employee); -------------------------------------------------------------------------------- /src/components/controldetalist/employeeAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function getadmin(){ 5 | return{ 6 | url:'getadmin' 7 | } 8 | } 9 | 10 | export function dismissal(aid){ 11 | return{ 12 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 13 | url:'dismissal', 14 | data:{ 15 | aid:aid, 16 | } 17 | } 18 | } 19 | //假如需要传参 20 | //data:{} -------------------------------------------------------------------------------- /src/components/controldetalist/getPlanAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function getplan(){ 5 | return{ 6 | url:'getplan' 7 | } 8 | } 9 | 10 | export function closePlan(wid){ 11 | return{ 12 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 13 | url:'closeplan', 14 | data:{ 15 | wid:wid 16 | } 17 | } 18 | } 19 | //假如需要传参 20 | //data:{} -------------------------------------------------------------------------------- /src/components/controldetalist/getPlanComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { Progress,Button,Icon,Modal } from 'antd'; 3 | 4 | import {connect} from 'react-redux' 5 | import * as actions from './getPlanAction'; 6 | 7 | const confirm = Modal.confirm; 8 | class GetPlanComponent extends Component{ 9 | componentWillMount(){ 10 | this.props.getplan() 11 | } 12 | deletplane(wid){ 13 | this.props.closePlan(wid).then(function(){ 14 | this.props.getplan() 15 | 16 | }.bind(this)); 17 | } 18 | showConfirm(wid){ 19 | var self = this; 20 | confirm({ 21 | title: 'Do you want to delete these items?', 22 | content: 'When clicked the OK button,it will be delete!', 23 | onOk() { 24 | return new Promise((resolve, reject) => { 25 | setTimeout(Math.random() > 0.5 ? resolve : reject, 1000); 26 | self.deletplane(wid) 27 | }).catch(() => console.log('Oops errors!')); 28 | }, 29 | onCancel() {}, 30 | }); 31 | } 32 | render(){ 33 | return( 34 |
35 |
36 |

查看工作计划

37 |

在这里你可以看到你记录下来的工作计划,以及它们的进度条

38 |
39 |
40 |
    41 | { 42 | this.props.ajaxResult.map(item => { 43 | return ( 44 |
  • 45 |

    任务标题:{item.title}

    起止日期: 46 | 47 | {item.deadline} 48 | 49 |

    50 |

    51 |

    任务内容:

    52 | {item.content} 53 |
    进度条:
    54 | 55 |
  • 56 | ) 57 | }) 58 | } 59 |
60 |
61 |
62 | ) 63 | } 64 | } 65 | let mapStateToProps = (state) =>{ 66 | return{ 67 | ajaxStatus:state.checkReducer.status, 68 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 69 | } 70 | } 71 | //把组件,状态,方法发射出去(代替export default class Component) 72 | export default connect(mapStateToProps,actions)(GetPlanComponent); 73 | -------------------------------------------------------------------------------- /src/components/controldetalist/goodTalk.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | 3 | // 引入 ECharts 主模块 4 | import echarts from 'echarts/lib/echarts'; 5 | // 引入柱状图 6 | import 'echarts/lib/chart/bar'; 7 | // 引入提示框和标题组件 8 | import 'echarts/lib/component/tooltip'; 9 | import 'echarts/lib/component/title'; 10 | 11 | export default class GoodTalk extends Component{ 12 | componentDidMount() { 13 | // 基于准备好的dom,初始化echarts实例 14 | var myChart = echarts.init(document.getElementById('datalist')); 15 | // 绘制图表 16 | myChart.setOption({ 17 | title: { text: '热门城市的民宿好评率' }, 18 | tooltip: {}, 19 | xAxis: { 20 | data: ["广州", "上海", "北京", "三亚", "重庆", "武汉"] 21 | }, 22 | yAxis: {}, 23 | series: [{ 24 | name: '好评率', 25 | type: 'bar', 26 | data: [65, 20, 36, 10, 50, 20], 27 | itemStyle:{ 28 | normal:{ 29 | color:'#4ad2ff' 30 | } 31 | }, 32 | }] 33 | }); 34 | } 35 | render(){ 36 | return( 37 |
38 |
39 |

各地民宿的好评率

40 |

在这里可以查看各地民宿到各地城市民宿的好评率

41 |
42 |
43 | 44 |
45 |
46 | 47 | ) 48 | } 49 | } -------------------------------------------------------------------------------- /src/components/controldetalist/performance.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { Rate } from 'antd'; 3 | 4 | import {connect} from 'react-redux'; 5 | import * as actions from './performanceAction'; 6 | 7 | class Performance extends Component{ 8 | componentWillMount(){ 9 | this.props.getperformance() 10 | } 11 | handleChange = (value,aid) => { 12 | // console.log(value,aid) 13 | this.props.changeRate(value,aid).then(function(){ 14 | this.props.getperformance() 15 | }.bind(this)) 16 | } 17 | render(){ 18 | return( 19 |
20 |
21 |

员工评分

22 |

对所有在职的员工进行评分

23 |
24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | { 36 | this.props.ajaxResult.map(item => { 37 | return ( 38 | 39 | 40 | 42 | 43 | ) 44 | }) 45 | } 46 | 47 | 48 |
员工评分
{item.username} 41 |
49 | 50 |
51 |
52 | ) 53 | } 54 | } 55 | 56 | let mapStateToProps = (state) =>{ 57 | // console.log(state); 58 | return{ 59 | ajaxStatus:state.checkReducer.status, 60 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 61 | 62 | } 63 | } 64 | //把组件,状态,方法发射出去(代替export default class Component) 65 | export default connect(mapStateToProps,actions)(Performance); -------------------------------------------------------------------------------- /src/components/controldetalist/performanceAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | 5 | export function getperformance(){ 6 | return{ 7 | url:'getadmin' 8 | } 9 | } 10 | 11 | export function changeRate(aid,value){ 12 | return{ 13 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 14 | url:'changerate', 15 | data:{aid:aid,rate:value} 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/components/controldetalist/performanceReducer.js: -------------------------------------------------------------------------------- 1 | import * as performanceConstants from '../../constaints/performanceConstants' 2 | 3 | export default function checkReducer(state={},action){ 4 | 5 | let newState = JSON.parse(JSON.stringify(state)) 6 | switch(action.type){ 7 | case performanceConstants.PERFORMANCE_REQUESTING: 8 | newState.status = 0; 9 | break; 10 | case performanceConstants.PERFORMANCE_REQUESTED: 11 | newState.status = 1; 12 | newState.result = action.result; 13 | break; 14 | case performanceConstants.PERFORMANCE_REQUESTERROR: 15 | newState.status = -1; 16 | newState.result = action.result; 17 | break; 18 | 19 | 20 | } 21 | return newState; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/controldetalist/sell.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | 3 | // 引入 ECharts 主模块 4 | import echarts from 'echarts/lib/echarts'; 5 | // 引入柱状图 6 | import 'echarts/lib/chart/bar'; 7 | // 引入提示框和标题组件 8 | import 'echarts/lib/component/tooltip'; 9 | import 'echarts/lib/component/title'; 10 | 11 | export default class Sell extends Component{ 12 | componentDidMount() { 13 | // 基于准备好的dom,初始化echarts实例 14 | var myChart = echarts.init(document.getElementById('datalist')); 15 | // 绘制图表 16 | myChart.setOption({ 17 | title: { text: '热门城市已拥有的民宿数' }, 18 | tooltip: {}, 19 | xAxis: { 20 | data: ["广州", "上海", "北京", "三亚", "重庆", "武汉"] 21 | }, 22 | yAxis: {}, 23 | series: [{ 24 | name: '已拥有的民宿数目', 25 | type: 'bar', 26 | data: [365, 220, 236, 110, 150, 320] 27 | }] 28 | }); 29 | } 30 | render(){ 31 | return( 32 |
33 |
34 |

各城市民宿的营业状况

35 |

在这里可以看到各城市民宿的营业状况,然后对以后的工作攻略进行修改

36 |
37 |
38 | 39 |
40 |
41 | ) 42 | } 43 | } -------------------------------------------------------------------------------- /src/components/controldetalist/setPlanAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function setPlan(title,content,deadline){ 5 | console.log(title,content,deadline); 6 | return{ 7 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 8 | url:'setplan', 9 | data:{ 10 | title:title, 11 | content:content, 12 | deadline:deadline, 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /src/components/controldetalist/setPlanComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | import { DatePicker,Input,Button,Modal} from 'antd'; 3 | import './../control/control.scss'; 4 | 5 | import {connect} from 'react-redux'; 6 | import * as actions from './setPlanAction'; 7 | 8 | import $ from 'jquery'; 9 | const { MonthPicker, RangePicker, WeekPicker } = DatePicker; 10 | 11 | class SetPlanComponent extends Component{ 12 | state = { 13 | title:'', 14 | content:'', 15 | deadline:'', 16 | } 17 | onChange(date,dateString){ 18 | console.log(dateString) 19 | var d = dateString.join(',') 20 | this.setState({ 21 | deadline:d 22 | }) 23 | } 24 | success(){ 25 | Modal.success({ 26 | title: '温馨提示', 27 | content: '保存成功', 28 | }); 29 | } 30 | error(){ 31 | Modal.error({ 32 | title: '错误提示', 33 | content: '内容不能为空' 34 | }) 35 | } 36 | title(e){ 37 | this.setState({ 38 | title:e.target.value 39 | }) 40 | } 41 | setplan(){ 42 | if(this.state.deadline!=''&&this.state.title!=''&&this.state.content!=''){ 43 | this.props.setPlan(this.state.title,this.state.content,this.state.deadline).then(function(){ 44 | 45 | this.success(); 46 | console.log($('input')) 47 | $('input').val(""); 48 | $('textarea').val(""); 49 | }.bind(this)) 50 | }else{ 51 | this.error(); 52 | } 53 | } 54 | content(e){ 55 | this.setState({ 56 | content:e.target.value 57 | }) 58 | } 59 | render(){ 60 | return( 61 |
62 |
63 |

计划表单

64 |

你可以在这里制定你的工作计划

65 |
66 |
67 |

68 | 69 | 70 | 71 |

72 |

73 | 74 |
75 | 76 |

77 |

78 | 79 | 80 | 81 | 82 | 83 |

84 | 85 |
86 |
87 | ) 88 | } 89 | } 90 | 91 | let mapStateToProps = (state) =>{ 92 | // console.log(state); 93 | return{ 94 | ajaxStatus:state.checkReducer.status, 95 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 96 | 97 | } 98 | } 99 | //把组件,状态,方法发射出去(代替export default class Component) 100 | export default connect(mapStateToProps,actions)(SetPlanComponent); -------------------------------------------------------------------------------- /src/components/home/homeComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react' 2 | //引入字体 3 | import {Icon} from 'antd'; 4 | 5 | 6 | //这里不引的话,就用不了Link 7 | import {Link} from 'react-router' 8 | 9 | export default class HomeComponent extends Component{ 10 | render(){ 11 | return( 12 |
13 |
14 |

15 | 16 | Homestay Master 17 |

18 |
    19 |
  •   登录
  • 20 |
  •   注册
  • 21 |
22 |
23 |
{this.props.children}
24 |
25 | ) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/components/login/loginAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as loginConstants from '../../constaints/loginConstants' 3 | 4 | export function loginAdmin(username,password){ 5 | return{ 6 | url:'loginadmin', 7 | method:'post', 8 | types:[loginConstants.LOGIN_REQUESTING,loginConstants.LOGIN_REQUESTED,loginConstants.LOGIN_REQUESTERROR], 9 | data:{ 10 | username:username, 11 | password:password 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /src/components/login/loginComponent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react'; 2 | 3 | import { Form, Icon, Input, Button, Checkbox,Alert } from 'antd'; 4 | import {Link,hashHistory} from 'react-router' 5 | import {connect} from 'react-redux' 6 | 7 | import * as actions from './loginAction'; 8 | 9 | class LoginComponent extends Component{ 10 | state = { 11 | username:'', 12 | password:'', 13 | display:'none', 14 | } 15 | changeA(){ 16 | this.setState({ 17 | username:this.refs.username.value, 18 | password:this.refs.password.value 19 | }) 20 | } 21 | checklogin(){ 22 | var reg=/^[a-zA-Z]{3,7}$/; 23 | 24 | if(reg.test(this.refs.username.value)==true){ 25 | this.setState({ 26 | display:'none' 27 | }) 28 | 29 | }else{ 30 | this.setState({ 31 | display:'block' 32 | }) 33 | } 34 | } 35 | login(){ 36 | this.props.loginAdmin(this.state.username,this.state.password).then(function(res){ 37 | 38 | if(res==false){ 39 | alert("登录失败,请检查用户名或密码") 40 | }else{ 41 | window.localStorage.aid = res[0].aid 42 | window.localStorage.Permission = res[0].permission 43 | alert('登录成功,正在进入..') 44 | hashHistory.push({ 45 | pathname:'/control', 46 | // query:{ 47 | // aidnumber:res[0].aid 48 | // } 49 | }) 50 | 51 | } 52 | }) 53 | 54 | } 55 | render(){ 56 | 57 | return( 58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |

70 | 71 | 72 |

73 |
74 | 75 |
76 |

77 | 78 | 79 |

80 |

81 | 82 | new employee? 83 |

84 |
85 |
86 | Welcome to Homestay Master 87 | 88 |
89 | 90 |
91 |
92 | ) 93 | 94 | } 95 | } 96 | 97 | let mapStateToProps = (state) =>{ 98 | // console.log(state); 99 | return{ 100 | ajaxStatus:state.checkReducer.status, 101 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 102 | 103 | } 104 | } 105 | //把组件,状态,方法发射出去(代替export default class Component) 106 | export default connect(mapStateToProps,actions)(LoginComponent); -------------------------------------------------------------------------------- /src/components/login/loginReducer.js: -------------------------------------------------------------------------------- 1 | import * as loginConstants from '../../constaints/loginConstants' 2 | 3 | export default function loginReducer(state={},action){ 4 | 5 | let newState = JSON.parse(JSON.stringify(state)) 6 | switch(action.type){ 7 | case loginConstants.LOGIN_REQUESTING: 8 | newState.status = 0; 9 | break; 10 | case loginConstants.LOGIN_REQUESTED: 11 | newState.status = 1; 12 | newState.result = action.result; 13 | break; 14 | case loginConstants.LOGIN_REQUESTERROR: 15 | newState.status = -1; 16 | newState.result = action.result; 17 | break; 18 | 19 | 20 | } 21 | return newState; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/register/registerAction.js: -------------------------------------------------------------------------------- 1 | import * as ajaxConstants from '../../constaints/ajaxConstants' 2 | import * as performanceConstants from '../../constaints/performanceConstants' 3 | 4 | export function insertReister(username,password){ 5 | console.log(username,password) 6 | return{ 7 | url:'registeradmin', 8 | method:'post', 9 | data:{ 10 | types:[performanceConstants.PERFORMANCE_REQUESTING,performanceConstants.PERFORMANCE_REQUESTED,performanceConstants.PERFORMANCE_REQUESTERROR], 11 | username:username, 12 | password:password 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/register/registerCompoent.js: -------------------------------------------------------------------------------- 1 | import React,{Component} from 'react'; 2 | 3 | import { Form, Icon, Input, Button, Checkbox, Alert } from 'antd'; 4 | import {Link,hashHistory} from 'react-router' 5 | import {connect} from 'react-redux' 6 | 7 | import * as actions from './registerAction'; 8 | 9 | class RegisterComponent extends Component{ 10 | state = { 11 | username:'', 12 | password:'', 13 | display:'none', 14 | repeat:'none', 15 | } 16 | changeA(){ 17 | this.setState({ 18 | username:this.refs.username.value, 19 | password:this.refs.password.value 20 | }) 21 | } 22 | checkregister(){ 23 | var reg=/^[a-zA-Z]{3,7}$/; 24 | 25 | if(reg.test(this.refs.username.value)==true){ 26 | this.setState({ 27 | display:'none' 28 | }) 29 | }else{ 30 | this.setState({ 31 | display:'block' 32 | }) 33 | } 34 | } 35 | register(){ 36 | 37 | this.props.insertReister(this.state.username,this.state.password).then(function(res){ 38 | if(res==false){ 39 | this.setState({ 40 | repeat:'block' 41 | }) 42 | }else if(res==true){ 43 | this.setState({ 44 | repeat:'none' 45 | }) 46 | alert('注册成功,正在跳转到登录页面..') 47 | hashHistory.push({ 48 | pathname:'/login' 49 | }) 50 | 51 | } 52 | }.bind(this)) 53 | } 54 | render(){ 55 | return( 56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |

68 | 69 | 70 |

71 |
72 | 73 |
74 |
75 | 76 |
77 |

78 | 79 | 80 |

81 |

82 | 83 | already have? 84 |

85 |
86 |
87 | 88 | Join in Homestay Master 89 |
90 | 91 |
92 |
93 | ) 94 | 95 | } 96 | } 97 | 98 | let mapStateToProps = (state) =>{ 99 | // console.log(state); 100 | return{ 101 | ajaxStatus:state.checkReducer.status, 102 | ajaxResult:state.checkReducer.result == undefined ? [] : state.checkReducer.result.news 103 | 104 | } 105 | } 106 | //把组件,状态,方法发射出去(代替export default class Component) 107 | export default connect(mapStateToProps,actions)(RegisterComponent); -------------------------------------------------------------------------------- /src/constaints/ajaxConstants.js: -------------------------------------------------------------------------------- 1 | //定义action 2 | export const AJAX_REQUESTING = 'AJAX_REQUESTING' 3 | export const AJAX_REQUESTED = 'AJAX_REQUESTED' 4 | export const AJAX_REQUESTERROR = 'AJAX_REQUESTERROR' -------------------------------------------------------------------------------- /src/constaints/loginConstants.js: -------------------------------------------------------------------------------- 1 | //定义action 2 | export const LOGIN_REQUESTING = 'LOGIN_REQUESTING' 3 | export const LOGIN_REQUESTED = 'LOGIN_REQUESTED' 4 | export const LOGIN_REQUESTERROR = 'LOGIN_REQUESTERROR' -------------------------------------------------------------------------------- /src/constaints/performanceConstants.js: -------------------------------------------------------------------------------- 1 | //定义action 2 | export const PERFORMANCE_REQUESTING = 'PERFORMANCE_REQUESTING' 3 | export const PERFORMANCE_REQUESTED = 'PERFORMANCE_REQUESTED' 4 | export const PERFORMANCE_REQUESTERROR = 'PERFORMANCE_REQUESTERROR' -------------------------------------------------------------------------------- /src/redux/configstore.js: -------------------------------------------------------------------------------- 1 | //步骤1 2 | import React from 'react'; 3 | import {createStore,applyMiddleware} from 'redux' 4 | 5 | //引入中间件,中间件有做什么作用叻? 6 | import middleware from './middleware' 7 | 8 | //引入reducer,有什么作用叻? 9 | //一个纯函数,通过对应的action,type执行相对应的方法,从而改变state的值 10 | //接受两个参数,旧状态的state,一个action对象,返回一个新的state 11 | import rootReducer from './rootReducer' 12 | 13 | 14 | //生成一个store 15 | const store = createStore(rootReducer,applyMiddleware(middleware)); 16 | 17 | export default store; -------------------------------------------------------------------------------- /src/redux/middleware.js: -------------------------------------------------------------------------------- 1 | /* 2 | 为什么需要中间件? 3 | 一个确定的纯对象,而例如异步ajax请求, 4 | 可能会包含了很多种的行为(请求中,请求成功,请求失败等···), 5 | 因此我们需要使用中间件将一个不确定的action转变或拆分成多个标准的plain object交由reducer处理。) 6 | */ 7 | //把前端的网络配置引进来 8 | import http from '../utils/httpclient'; 9 | 10 | import * as ajaxContants from '../constaints/ajaxConstants' 11 | //定义一个方法 12 | export default function middleware(api){ 13 | return function(dispatch){ 14 | return function(action){ 15 | let {type,types,method = 'get',data={},url} =action; 16 | 17 | if(!url){ 18 | return dispatch(action) 19 | } 20 | let defaultConstants = [ajaxContants.AJAX_REQUESTING, ajaxContants.AJAX_REQUESTED, ajaxContants.AJAX_REQUESTERROR]; 21 | //如果有就使用传过来的,没有就使用默认的,是由Action.js传过来的 22 | let [requesting, requested, requesterror] = types ? types : defaultConstants; 23 | 24 | api.dispatch({type:requesting}); 25 | if(url){ 26 | return new Promise((resolve, reject) => { 27 | http[method](url, data).then(res => { 28 | api.dispatch({ 29 | type: requested, 30 | result: JSON.parse(res.text) 31 | }) 32 | resolve(JSON.parse(res.text)) 33 | }).catch(error => { 34 | api.dispatch({ 35 | type: requesterror, 36 | result: error 37 | }) 38 | reject(error) 39 | }) 40 | }) 41 | // http[method](url,data).then(res => { 42 | // console.log(JSON.parse(res.text)); 43 | // api.dispatch({ 44 | // type:requested, 45 | // result:JSON.parse(res.text) 46 | // }) 47 | // }).catch(error => { 48 | // api.dispatch({ 49 | // type: requesterror, 50 | // result:error 51 | // }) 52 | // }) 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/redux/rootReducer.js: -------------------------------------------------------------------------------- 1 | //所有的reducer的汇总 2 | import {combineReducers} from 'redux' 3 | 4 | import checkReducer from '../components/controldetalist/checkReducer' 5 | import performanceReducer from '../components/controldetalist/performanceReducer' 6 | import loginReducer from '../components/login/loginReducer' 7 | 8 | export default combineReducers({ 9 | checkReducer, 10 | performanceReducer, 11 | loginReducer 12 | }) 13 | 14 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {Route,Redirect,IndexRoute} from 'react-router' 3 | 4 | 5 | 6 | //引入字体图标 7 | import {Icon} from 'antd'; 8 | import 'antd/dist/antd.css'; 9 | 10 | import HomeComponent from '../components/home/homeComponent' 11 | import RegisterComponent from '../components/register/registerCompoent' 12 | import LoginComponent from '../components/login/loginComponent' 13 | import ControlComponent from '../components/control/ControlComponent' 14 | //控制台的详情页 15 | import SetPlanComponent from '../components/controldetalist/setPlanComponent' 16 | import GetPlanComponent from '../components/controldetalist/getPlanComponent' 17 | import CheckHomestay from '../components/controldetalist/checkHomestay' 18 | import Employee from '../components/controldetalist/employee' 19 | import Performance from '../components/controldetalist/performance' 20 | import GoodTalk from '../components/controldetalist/GoodTalk' 21 | import Sell from '../components/controldetalist/sell' 22 | import Edit from '../components/controldetalist/editComponent' 23 | 24 | const routes = ( 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | ) 45 | export default routes; -------------------------------------------------------------------------------- /src/utils/base.scss: -------------------------------------------------------------------------------- 1 | @charset "UTF-8"; 2 | 3 | /*css 初始化 */ 4 | 5 | html, 6 | body, 7 | ul, 8 | li, 9 | ol, 10 | dl, 11 | dd, 12 | dt, 13 | p, 14 | h1, 15 | h2, 16 | h3, 17 | h4, 18 | h5, 19 | h6, 20 | form, 21 | fieldset, 22 | legend, 23 | img, 24 | input { 25 | margin: 0; 26 | padding: 0; 27 | } 28 | 29 | fieldset, 30 | img, 31 | input, 32 | button { 33 | padding: 0; 34 | margin: 0; 35 | } 36 | 37 | 38 | /*去掉input等聚焦时的蓝色边框*/ 39 | 40 | ul, 41 | ol { 42 | list-style: none; 43 | } 44 | 45 | 46 | /*input { padding-top:0; padding-bottom:0; font-family: "SimSun","宋体";}*/ 47 | 48 | select, 49 | input { 50 | vertical-align: middle; 51 | } 52 | 53 | 54 | /*select, input, textarea { font-size:12px; margin:0; }*/ 55 | 56 | textarea { 57 | resize: none; 58 | } 59 | 60 | 61 | /*防止拖动*/ 62 | 63 | img { 64 | border: 0; 65 | vertical-align: middle; 66 | } 67 | 68 | 69 | /* 去掉图片低测默认的3像素空白缝隙,或者用display:block也可以*/ 70 | 71 | table { 72 | border-collapse: collapse; 73 | } 74 | 75 | html, 76 | body { 77 | width: 100%; 78 | height: 100%; 79 | } 80 | 81 | 82 | /***********************************************************/ 83 | 84 | 85 | /*min-width指的是版心容器的宽度,乱设会造成水平有滚动条*/ 86 | 87 | 88 | /**********************************************************/ 89 | 90 | 91 | .clearfix:after { 92 | content: ""; 93 | display: block; 94 | height: 0; 95 | overflow: hidden; 96 | clear: both; 97 | visibility: hidden; 98 | zoom: 1; 99 | } 100 | 101 | a { 102 | text-decoration: none; 103 | } 104 | 105 | h1, 106 | h2, 107 | h3, 108 | h4, 109 | h5, 110 | h6 { 111 | text-decoration: none; 112 | font-weight: normal; 113 | font-size: 1em; 114 | } 115 | 116 | 117 | /*设置h标签的大小,设置跟父亲一样大的字体font-size:100%;*/ 118 | 119 | s, 120 | i, 121 | em { 122 | font-style: normal; 123 | text-decoration: none; 124 | } 125 | 126 | 127 | /*公共类*/ 128 | 129 | .container { 130 | /*版心 提取 */ 131 | width: 100%; 132 | margin: 0 auto; 133 | } 134 | 135 | .fl { 136 | float: left; 137 | } 138 | 139 | .fr { 140 | float: right; 141 | } 142 | 143 | .al { 144 | text-align: left; 145 | } 146 | 147 | .ac { 148 | text-align: center; 149 | } 150 | 151 | .ar { 152 | text-align: right; 153 | } 154 | 155 | .hide { 156 | display: none; 157 | } 158 | 159 | .font12 { 160 | font-size: 12px; 161 | } 162 | 163 | .font14 { 164 | font-size: 14px; 165 | } 166 | 167 | .font16 { 168 | font-size: 16px; 169 | } 170 | 171 | ul, 172 | li { 173 | list-style: none; 174 | } 175 | 176 | 177 | /*公共部分*/ 178 | 179 | /*头部导航开始*/ 180 | .header{ 181 | height:66px; 182 | line-height: 66px; 183 | background:#002140; 184 | padding: 0 32px; 185 | 186 | h1{ 187 | font-size: 22px; 188 | font-weight: bold; 189 | color: #fff; 190 | span{ 191 | padding-left: 10px; 192 | } 193 | } 194 | li{ 195 | float: left; 196 | padding: 0 20px; 197 | } 198 | 199 | } 200 | 201 | .userbox{ 202 | position: relative; 203 | .form{ 204 | padding-left: 15%; 205 | position: absolute; 206 | top:150px; 207 | z-index: 3000; 208 | div:nth-child(1){ 209 | width: 300px; 210 | } 211 | p{ 212 | color: #fff; 213 | padding: 20px 0; 214 | label{ 215 | padding-right: 10px; 216 | } 217 | button{ 218 | margin-right:20px ; 219 | } 220 | input{ 221 | padding-left: 10px; 222 | color: #000; 223 | } 224 | } 225 | 226 | } 227 | .welcome{ 228 | padding-top: 5%; 229 | font-size: 38px; 230 | word-spacing: 20px; 231 | color: #ccc; 232 | .bigsize{ 233 | font-size: 48px; 234 | font-weight: bold; 235 | font-family:"Times New Roman",Georgia,Serif 236 | } 237 | } 238 | 239 | } 240 | 241 | .snow-container { 242 | position: absolute; 243 | height:590px; 244 | width: 100%; 245 | max-width: 100%; 246 | overflow: hidden; 247 | pointer-events: none; 248 | background-color: #001529; 249 | } 250 | 251 | .snow { 252 | display: block; 253 | position: absolute; 254 | z-index: 2; 255 | top: 0; 256 | right: 0; 257 | bottom: 0; 258 | left: 0; 259 | pointer-events: none; 260 | -webkit-transform: translate3d(0, -100%, 0); 261 | transform: translate3d(0, -100%, 0); 262 | -webkit-animation: snow linear infinite; 263 | animation: snow linear infinite; 264 | } 265 | 266 | .snow.foreground { 267 | background-image: url("https://dl6rt3mwcjzxg.cloudfront.net/assets/snow/snow-large-075d267ecbc42e3564c8ed43516dd557.png"); 268 | -webkit-animation-duration: 15s; 269 | animation-duration: 15s; 270 | } 271 | 272 | .snow.foreground.layered { 273 | -webkit-animation-delay: 7.5s; 274 | animation-delay: 7.5s; 275 | } 276 | 277 | .snow.middleground { 278 | background-image: url(https://dl6rt3mwcjzxg.cloudfront.net/assets/snow/snow-medium-0b8a5e0732315b68e1f54185be7a1ad9.png); 279 | -webkit-animation-duration: 20s; 280 | animation-duration: 20s; 281 | } 282 | 283 | .snow.middleground.layered { 284 | -webkit-animation-delay: 10s; 285 | animation-delay: 10s; 286 | } 287 | 288 | .snow.background { 289 | background-image: url(https://dl6rt3mwcjzxg.cloudfront.net/assets/snow/snow-small-1ecd03b1fce08c24e064ff8c0a72c519.png); 290 | -webkit-animation-duration: 30s; 291 | animation-duration: 30s; 292 | } 293 | 294 | .snow.background.layered { 295 | -webkit-animation-delay: 15s; 296 | animation-delay: 15s; 297 | } 298 | 299 | @-webkit-keyframes snow { 300 | 0% { 301 | -webkit-transform: translate3d(0, -100%, 0); 302 | transform: translate3d(0, -100%, 0); 303 | } 304 | 100% { 305 | -webkit-transform: translate3d(15%, 100%, 0); 306 | transform: translate3d(15%, 100%, 0); 307 | } 308 | } 309 | 310 | @keyframes snow { 311 | 0% { 312 | -webkit-transform: translate3d(0, -100%, 0); 313 | transform: translate3d(0, -100%, 0); 314 | } 315 | 100% { 316 | -webkit-transform: translate3d(15%, 100%, 0); 317 | transform: translate3d(15%, 100%, 0); 318 | } 319 | } -------------------------------------------------------------------------------- /src/utils/httpclient.js: -------------------------------------------------------------------------------- 1 | import http from 'superagent' 2 | 3 | 4 | //let baseUrl = 'http://10.3.136.153:3000/' 5 | let baseUrl="http://localhost:3000/" 6 | //let baseUrl = 'http://127.0.0.1:3000/' 7 | 8 | const geturl = (url) => { 9 | if(url.startsWith('http')){ 10 | return url; 11 | } else { 12 | return baseUrl + url; 13 | } 14 | } 15 | 16 | 17 | export default { 18 | get(url, params){ 19 | return new Promise((resolve, reject) => { 20 | http.get(geturl(url)) 21 | //传参用query,不然传不过去 22 | 23 | .query(params) 24 | .end((error, res) => { 25 | if(error){ 26 | reject(error) 27 | } else { 28 | resolve(res) 29 | } 30 | }) 31 | }) 32 | }, 33 | 34 | post(url, data){ 35 | return new Promise((resolve, reject) => { 36 | http.post(geturl(url)) 37 | .set('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8') 38 | .send(data) 39 | .end((error, res) => { 40 | if(error){ 41 | reject(error) 42 | } else { 43 | resolve(res) 44 | } 45 | }) 46 | }) 47 | } 48 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var webpack = require('webpack'); 3 | var ProgressBarPlugin = require('progress-bar-webpack-plugin'); 4 | //css样式从js文件中分离出来,需要通过命令行安装 extract-text-webpack-plugin依赖包 5 | var ExtractTextPlugin = require('extract-text-webpack-plugin'); 6 | module.exports = { 7 | entry: './src/app.js',//唯一入口文件 8 | output: {//输出目录 9 | path: path.resolve(__dirname, './dist'),//打包后的js文件存放的地方(build 后的文件) 10 | publicPath: '/dist/',//指定资源文件引用的目录(build 在内存中的位置) 11 | filename: 'bundle.js'//打包后输出的js的文件名 12 | }, 13 | module: { 14 | rules: [{ 15 | test: /\.css$/, 16 | exclude: '/node_modules/', 17 | loader: 'style-loader!css-loader?sourceMap' 18 | },{ 19 | test: /\.scss$/, 20 | exclude: /node_modules/, 21 | use: ['style-loader', 'css-loader', 'sass-loader'] 22 | },{ 23 | test: /\.(js|jsx)$/, //一个匹配loaders所处理的文件的拓展名的正则表达式,这里用来匹配js和jsx文件(必须) 24 | exclude: '/node_modules/', //屏蔽不需要处理的文件(文件夹)(可选) 25 | use: ['babel-loader'] 26 | },{ 27 | test: /\.(woff|svg|eot|ttf)\??.*$/, 28 | exclude: /node_modules/, 29 | loader: 'url-loader?limit=50000&name=[path][name].[ext]' 30 | },{ 31 | test: /\.(jpe?g|png|gif|svg)$/i, 32 | use: [{ 33 | loader: 'file-loader', 34 | options: { 35 | query: { 36 | name:'assets/[name].[ext]' 37 | } 38 | } 39 | },{ 40 | loader: 'image-webpack-loader', 41 | options: { 42 | query: { 43 | mozjpeg: { 44 | progressive: true, 45 | }, 46 | gifsicle: { 47 | interlaced: true, 48 | }, 49 | optipng: { 50 | optimizationLevel: 7, 51 | } 52 | } 53 | } 54 | }] 55 | }] 56 | }, 57 | plugins: [ 58 | new webpack.HotModuleReplacementPlugin(), 59 | new ProgressBarPlugin(), 60 | new ExtractTextPlugin('styles.css') 61 | ] 62 | }; --------------------------------------------------------------------------------