├── .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 |
95 |
96 |
97 |
98 |
99 |
100 | - 欢迎,管理者{this.state.aidname}
101 | - (最高级)
102 | - (普通级)
103 | - 退出登录
104 |
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 |
80 | {
81 | this.props.ajaxResult.map(item =>{
82 | return (
83 | -
84 |
85 | 民宿地址:{item.address}
86 | 预算价格:{item.budget}
87 | 所在城市:{item.city}
88 |
89 |
90 |
91 |
92 | )
93 | })
94 | }
95 |
96 |
97 |
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 |
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 | {idx+1} |
128 | {item.title} |
129 | {item.price} |
130 | {item.city} |
131 |
132 |
133 |
134 | |
135 |
136 | )
137 | })
138 | }
139 |
140 |
141 |
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 | {item.aid} |
66 | {item.username} |
67 | {item.permission} |
68 | |
69 |
70 |
71 | |
72 |
73 | )
74 | })
75 | }
76 |
77 |
78 |
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 |
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 | {item.username} |
40 |
41 | |
42 |
43 | )
44 | })
45 | }
46 |
47 |
48 |
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 |
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 |
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 |
74 |
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 | };
--------------------------------------------------------------------------------