├── .gitignore ├── LICENSE ├── README.md ├── config.js ├── main.js ├── package.json └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | # JetBrain 2 | /.idea 3 | 4 | # MacOS 5 | /.DS_Store 6 | /*/.DS_Store 7 | 8 | # node 9 | /node_modules 10 | 11 | # yarn 12 | /yarn-error.log 13 | /yarn.lock 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 John Kindem 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 | # 介绍 2 | NUAA 2018 数据库课程实验,一个基于B/S架构的教务系统,作者 NUAA 161520311 3 | 4 | 该项目分为前后端两部分,你看到的这部分为后端,即服务器部分,使用到的技术栈为`Nodejs` + `Express` 5 | 6 | # 数据库配置 7 | 在部署之前,你需要在部署机器上安装MySQL,并且在数据库中按照如下的指令建立数据库、用户和表: 8 | ``` 9 | // 创建用户kindem,当然你也可以在配置文件中更改 10 | mysql> create user 'kindem'@'%' identified by '123456'; 11 | mysql> grant all privileges on *.* to 'kindem'@'%' identified by '123456'; 12 | mysql> flush privileges; 13 | 14 | // 创建数据库 15 | mysql> create database student_info_manager; 16 | // 进入数据库 17 | mysql> use student_info_manager; 18 | // 建立三张表 19 | mysql> create table student( 20 | > id bigint primary key not null auto_increment, 21 | > number char(11) not null, 22 | > name char(40) not null, 23 | > college char(40) not null, 24 | > major char(40) not null, 25 | > sex char(2) not null, 26 | > grade char(4) not null, 27 | > phone char(11) not null 28 | > ); 29 | mysql> create table class( 30 | > id bigint primary key not null auto_increment, 31 | > name char(50) not null, 32 | > teacher char(50) not null, 33 | > grade char(4) not null, 34 | > plan smallint not null 35 | > ); 36 | mysql> create table `select`( 37 | > id bigint primary key not null auto_increment, 38 | > class bigint not null, 39 | > student bigint not null, 40 | > gpa float(3,1) 41 | > ); 42 | ``` 43 | 44 | # 后端环境配置 45 | 你需要先安装`nodejs`,在安装完`nodejs`之后,你需要在命令行安装推荐的包管理工具`yarn`: 46 | ``` 47 | npm install -g yarn 48 | ``` 49 | 50 | 之后进入项目根目录,使用`yarn`一键安装所有的依赖: 51 | ``` 52 | yarn install 53 | ``` 54 | 55 | 当安装完成之后,你即可使用`yarn`来启动express服务: 56 | ``` 57 | yarn start 58 | ``` 59 | 等待前端的请求吧! 60 | 61 | # 基于配置文件的设置 62 | 你可以在项目根目录下找到`config.js`文件,该文件中有一些关于项目的配置,你可以在启动服务器之间修改这些配置。 63 | 64 | # 登录 65 | * 学生身份:学号为用户名,密码为手机号后四位 66 | * 管理员身份:admin, admin 67 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | // 数据库连接信息 2 | module.exports.dbConnectionInfo = { 3 | host: '127.0.0.1', 4 | port: '3306', 5 | user: 'kindem', 6 | password: '123456', 7 | database: 'student_info_manager', 8 | connectTimeout: 1000 9 | }; 10 | 11 | // 管理员密码hash 12 | module.exports.adminPasswordHash = '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918'; 13 | 14 | // 监听端口 15 | module.exports.listenPort = 45000; -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { server } = require('./server'); 2 | const { listenPort } = require('./config'); 3 | 4 | // 本地服务器开启监听 5 | server.listen(listenPort); 6 | console.log('[server] server is running ......'); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "student-info-manager-backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "main.js", 6 | "scripts": { 7 | "start": "node .", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.18.3", 14 | "cookie-parser": "^1.4.3", 15 | "express": "^4.16.3", 16 | "express-session": "^1.15.6", 17 | "js-sha256": "^0.9.0", 18 | "multer": "^1.3.0", 19 | "mysql": "^2.15.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const session = require('express-session'); 3 | const cookieParser = require('cookie-parser'); 4 | const bodyParser = require('body-parser'); 5 | const mysql = require('mysql'); 6 | const { dbConnectionInfo, adminPasswordHash } = require('./config'); 7 | const sha256 = require('js-sha256'); 8 | 9 | // 全局异常处理 10 | process.on('uncaughtException', (err) => { 11 | console.log(err); 12 | }); 13 | 14 | // 浏览器引用 15 | let window; 16 | 17 | // 本地服务器 18 | let server = express(); 19 | server.all('*', function(req, res, next) { 20 | res.header("Access-Control-Allow-Origin", "http://localhost:3000"); 21 | res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); 22 | res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); 23 | res.header("Access-Control-Allow-Credentials", "true"); 24 | if (req.method === 'OPTIONS') { 25 | return res.sendStatus(200); 26 | } else next(); 27 | }); 28 | server.use(cookieParser()); 29 | server.use(session({ 30 | secret: 'session', 31 | resave: true, 32 | saveUninitialized: true 33 | })); 34 | server.use(bodyParser.json()); 35 | server.use(bodyParser.urlencoded({extended: true})); 36 | server.post('/request/user/login', (req, res) => { 37 | console.log('[server] POST: /request/user/login'); 38 | // 获取参数 39 | let args = req.body; 40 | // 先看看是不是管理员账户 41 | if (args.username === 'admin') { 42 | // 验证密码 43 | if (args.password === adminPasswordHash) { 44 | req.session.login = true; 45 | req.session.admin = true; 46 | req.session.username = 'admin'; 47 | return res.json({ 48 | success: true, 49 | admin: true 50 | }); 51 | } else { 52 | return res.json({ 53 | success: false 54 | }); 55 | } 56 | } else { 57 | // 查找学生数据库中是否有匹配的学号,如果有则获取他的信息 58 | let connection = mysql.createConnection(dbConnectionInfo); 59 | let sql = 'select * from student where number = ? limit 1'; 60 | connection.query(sql, [args.username], (err, result) => { 61 | if (err) { 62 | connection.end(); 63 | return res.json({ 64 | success: false 65 | }); 66 | } 67 | // 如果找到了 68 | if (result.length > 0) { 69 | // 获取他的手机号后 4 位 70 | phone = result[0].phone; 71 | password = phone[phone.length - 4]; 72 | password += phone[phone.length - 3]; 73 | password += phone[phone.length - 2]; 74 | password += phone[phone.length - 1]; 75 | // 使用sha256进行hash 76 | passwordHash = sha256(password); 77 | // 验证 78 | if (args.password === passwordHash) { 79 | req.session.login = true; 80 | req.session.admin = false; 81 | req.session.userId = result[0].id; 82 | req.session.username = result[0].name; 83 | return res.json({ 84 | success: true, 85 | admin: false, 86 | userId: result[0].id 87 | }); 88 | } else { 89 | return res.json({ 90 | success: false 91 | }); 92 | } 93 | } else { 94 | return res.json({ 95 | success: false 96 | }); 97 | } 98 | }); 99 | } 100 | }); 101 | server.post('/request/user/getLoginInfo', (req, res) => { 102 | console.log('[server] POST: /request/user/getLoginInfo'); 103 | let login = req.session.login ? req.session.login : false; 104 | let admin =req.session.admin ? req.session.admin : false; 105 | let userId = req.session.userId ? req.session.userId : -1; 106 | let username = req.session.username ? req.session.username : ''; 107 | return res.json({ 108 | login: login, 109 | admin: admin, 110 | id: userId, 111 | username: username 112 | }); 113 | }); 114 | server.post('/request/student/getAll', (req, res) => { 115 | console.log('[server] POST: /request/student/getAll'); 116 | let connection = mysql.createConnection(dbConnectionInfo); 117 | connection.query('select * from student', (err, r) => { 118 | if (err) { 119 | connection.end(); 120 | return res.json({ 121 | success: false 122 | }); 123 | } 124 | let result = []; 125 | r.map((item) => { 126 | result.push({ 127 | key: item.id, 128 | id: item.id, 129 | number: item.number, 130 | name: item.name, 131 | college: item.college, 132 | major: item.major, 133 | sex: item.sex, 134 | grade: item.grade, 135 | phone: item.phone 136 | }); 137 | }); 138 | connection.end(); 139 | return res.json({ 140 | success: true, 141 | result: result 142 | }); 143 | }); 144 | }); 145 | server.post('/request/student/get', (req, res) => { 146 | console.log('[server] POST: /request/student/get'); 147 | let args = req.body; 148 | let connection = mysql.createConnection(dbConnectionInfo); 149 | let sql = 'select * from student where id = ? limit 1'; 150 | let params = [args.id]; 151 | connection.query(sql, params, (err, t) => { 152 | if (err) { 153 | connection.end(); 154 | return res.json({ 155 | success: false 156 | }); 157 | } 158 | connection.end(); 159 | if (t.length > 0) { 160 | let r = { 161 | id: t[0].id, 162 | number: t[0].number, 163 | name: t[0].name, 164 | college: t[0].college, 165 | major: t[0].major, 166 | sex: t[0].sex, 167 | grade: t[0].grade, 168 | phone: t[0].phone 169 | }; 170 | return res.json({ 171 | success: true, 172 | result: r 173 | }); 174 | } else { 175 | return res.json({ 176 | success: false 177 | }); 178 | } 179 | }); 180 | }); 181 | server.post('/request/student/add', (req, res) => { 182 | console.log('[server] POST: /request/student/add'); 183 | // 建立连接 184 | let args = req.body; 185 | let connection = mysql.createConnection(dbConnectionInfo); 186 | let sql = 'insert into student(number, name, college, major, sex, grade, phone) ' + 187 | 'values(?, ?, ?, ?, ?, ?, ?)'; 188 | let params = []; 189 | params.push(args.number); 190 | params.push(args.name); 191 | params.push(args.college); 192 | params.push(args.major); 193 | params.push(args.sex); 194 | params.push(args.grade); 195 | params.push(args.phone); 196 | connection.query(sql, params, (err) => { 197 | setTimeout(() => { 198 | if (err) { 199 | connection.end(); 200 | return res.json({ 201 | success: false 202 | }); 203 | } 204 | connection.end(); 205 | return res.json({ 206 | success: true 207 | }); 208 | }, 1000); 209 | }); 210 | }); 211 | server.post('/request/student/delete', (req, res) => { 212 | console.log('[server] POST: /request/student/delete'); 213 | let args = req.body; 214 | let connection = mysql.createConnection(dbConnectionInfo); 215 | let idList = ''; 216 | args.ids.map((id, no) => { 217 | if (no === args.ids.length - 1) 218 | idList += id; 219 | else 220 | idList += `${id},`; 221 | }); 222 | let sql = `delete from student where id in (${idList})`; 223 | connection.query(sql, (err) => { 224 | if (err) { 225 | connection.end(); 226 | return res.json({ 227 | success: false 228 | }); 229 | } 230 | connection.query(`delete from \`select\` where student in (${idList})`, (err) => { 231 | if (err) { 232 | connection.end(); 233 | return res.json({ 234 | success: false 235 | }); 236 | } 237 | connection.end(); 238 | return res.json({ 239 | success: true 240 | }); 241 | }); 242 | }); 243 | }); 244 | server.post('/request/student/modify', (req, res) => { 245 | console.log('[server] POST: /request/student/modify'); 246 | let args = req.body; 247 | let connection = mysql.createConnection(dbConnectionInfo); 248 | let suc = true; 249 | let idList = ''; 250 | args.ids.map((id, no) => { 251 | if (no === args.ids.length - 1) 252 | idList += id; 253 | else 254 | idList += `${id},`; 255 | }); 256 | let sqls = [ 257 | `update student set number = ? where id in (${idList})`, 258 | `update student set name = ? where id in (${idList})`, 259 | `update student set college = ? where id in (${idList})`, 260 | `update student set major = ? where id in (${idList})`, 261 | `update student set sex = ? where id in (${idList})`, 262 | `update student set grade = ? where id in (${idList})`, 263 | `update student set phone = ? where id in (${idList})` 264 | ]; 265 | let params = [ 266 | args.number === '' ? null : [args.number], 267 | args.name === '' ? null : [args.name], 268 | args.college === '' ? null : [args.college], 269 | args.major === '' ? null : [args.major], 270 | args.sex === '' ? null : [args.sex], 271 | args.grade === '' ? null : [args.grade], 272 | args.phone === '' ? null : [args.phone] 273 | ]; 274 | for (let i = 0; i < 8; i++) 275 | if (params[i]) 276 | connection.query(sqls[i], params[i], (err) => { 277 | if (err) suc = false; 278 | }); 279 | 280 | connection.end(); 281 | // 延迟一秒响应客户端,防止老师觉得我的数据库操作太快 282 | // 顺便使客户端发呆一会以表现出动画效果 283 | setTimeout(() => { 284 | res.json({ 285 | success: suc 286 | }); 287 | }, 1000); 288 | }); 289 | server.post('/request/class/getAll', (req, res) => { 290 | console.log('[server] POST: /request/class/getAll'); 291 | let connection = mysql.createConnection(dbConnectionInfo); 292 | connection.query('select * from class', (err, t) => { 293 | if (err) { 294 | connection.end(); 295 | return res.json({ 296 | success: false 297 | }); 298 | } 299 | connection.end(); 300 | let result = []; 301 | t.map((item) => { 302 | result.push({ 303 | key: item.id, 304 | id: item.id, 305 | name: item.name, 306 | teacher: item.teacher, 307 | grade: item.grade, 308 | plan: item.plan 309 | }); 310 | }); 311 | return res.json({ 312 | success: true, 313 | result: result 314 | }); 315 | }); 316 | }); 317 | server.post('/request/class/add', (req, res) => { 318 | console.log('[server] POST: /request/class/add'); 319 | let args = req.body; 320 | let connection = mysql.createConnection(dbConnectionInfo); 321 | let sql = 'insert into class(name, teacher, grade, plan) ' + 322 | 'values(?, ?, ?, ?)'; 323 | let params = []; 324 | params.push(args.name); 325 | params.push(args.teacher); 326 | params.push(args.grade); 327 | params.push(args.plan); 328 | connection.query(sql, params, (err) => { 329 | setTimeout(() => { 330 | if (err) { 331 | connection.end(); 332 | return res.json({ 333 | success: false 334 | }); 335 | } 336 | connection.end(); 337 | return res.json({ 338 | success: true 339 | }); 340 | }, 1000); 341 | }) 342 | }); 343 | server.post('/request/class/delete', (req, res) => { 344 | console.log('[server] POST: /request/class/delete'); 345 | let args = req.body; 346 | let connection = mysql.createConnection(dbConnectionInfo); 347 | let idList = ''; 348 | args.ids.map((id, no) => { 349 | if (no === args.ids.length - 1) 350 | idList += id; 351 | else 352 | idList += `${id},`; 353 | }); 354 | let sql = `delete from class where id in (${idList})`; 355 | connection.query(sql, (err) => { 356 | if (err) { 357 | connection.end(); 358 | return res.json({ 359 | success: false 360 | }); 361 | } 362 | connection.query(`delete from \`select\` where class in (${idList})`, (err) => { 363 | if (err) { 364 | connection.end(); 365 | return res.json({ 366 | success: false 367 | }); 368 | } 369 | connection.end(); 370 | return res.json({ 371 | success: true 372 | }); 373 | }); 374 | }) 375 | }); 376 | server.post('/request/class/modify', (req, res) => { 377 | console.log('[server] POST: /request/class/modify'); 378 | let args = req.body; 379 | let connection = mysql.createConnection(dbConnectionInfo); 380 | let suc = true; 381 | let idList = ''; 382 | args.ids.map((id, no) => { 383 | if (no === args.ids.length - 1) 384 | idList += id; 385 | else 386 | idList += `${id},`; 387 | }); 388 | let sqls = [ 389 | `update class set name = ? where id in (${idList})`, 390 | `update class set teacher = ? where id in (${idList})` 391 | ]; 392 | let params = [ 393 | args.name === '' ? null : [args.name], 394 | args.teacher === '' ? null : [args.teacher] 395 | ]; 396 | for (let i = 0; i < 8; i++) 397 | if (params[i]) 398 | connection.query(sqls[i], params[i], (err) => { 399 | if (err) suc = false; 400 | }); 401 | setTimeout(() => { 402 | connection.end(); 403 | res.json({ 404 | success: suc 405 | }); 406 | }, 1000); 407 | }); 408 | server.post('/request/class/getSelected', (req, res) => { 409 | console.log('[server] POST: /request/class/getSelected'); 410 | let id = req.session.userId; 411 | if (id) { 412 | let connection = mysql.createConnection(dbConnectionInfo); 413 | connection.query(`select * from \`select\` where student = ?`, [id], (err, selected) => { 414 | if (err) { 415 | return res.json({ 416 | success: false 417 | }); 418 | } else { 419 | let success = true; 420 | let result = []; 421 | selected.map((rel) => { 422 | connection.query(`select * from class where id = ? limit 1`, [rel.class], (err, t) => { 423 | if (err) { 424 | success = false; 425 | } else { 426 | if (t.length > 0) { 427 | let aClass = t[0]; 428 | result.push({ 429 | key: aClass.id, 430 | id: aClass.id, 431 | name: aClass.name, 432 | teacher: aClass.teacher, 433 | gpa: rel.gpa 434 | }); 435 | } else { 436 | success = false; 437 | } 438 | } 439 | }); 440 | }); 441 | setTimeout(() => { 442 | return res.json({ 443 | success: success, 444 | result: result 445 | }); 446 | }, 1000); 447 | } 448 | }); 449 | } else { 450 | return res.json({ 451 | success: false 452 | }); 453 | } 454 | }); 455 | server.post('/request/select/getClassByStudent', (req, res) => { 456 | console.log('[server] POST: /request/select/getClassByStudent'); 457 | let connection = mysql.createConnection(dbConnectionInfo); 458 | let id = req.session.userId; 459 | if (id) { 460 | // 找出学生信息 461 | connection.query('select * from student where id = ? limit 1', [id], (err, students) => { 462 | if (err) { 463 | connection.end(); 464 | return res.json({ 465 | success: false 466 | }); 467 | } 468 | if (students.length > 0) { 469 | let student = students[0]; 470 | // 找出已经选过的课 471 | connection.query('select * from \`select\` where student = ?', [id], (err, selected) => { 472 | if (err) { 473 | connection.end(); 474 | return res.json({ 475 | success: false 476 | }); 477 | } 478 | // 列出学生可以选的所有课 479 | connection.query('select * from class where grade = ?', [student.grade], (err, classes) => { 480 | if (err) { 481 | console.log('!!!'); 482 | connection.end(); 483 | return res.json({ 484 | success: false 485 | }); 486 | } 487 | let result = []; 488 | // 找出学生没选过的课并且返回 489 | classes.map((aClass) => { 490 | let find = false; 491 | for (let i = 0; i < selected.length; i++) { 492 | if (selected[i].class === aClass.id) { 493 | find = true; 494 | break; 495 | } 496 | } 497 | if (!find) result.push({ 498 | key: aClass.id, 499 | id: aClass.id, 500 | name: aClass.name, 501 | teacher: aClass.teacher, 502 | grade: aClass.grade, 503 | plan: aClass.plan 504 | }); 505 | }); 506 | return res.json({ 507 | success: true, 508 | result: result 509 | }); 510 | }); 511 | }); 512 | } else { 513 | connection.end(); 514 | return res.json({ 515 | success: false 516 | }); 517 | } 518 | }); 519 | } else { 520 | return res.json({ 521 | success: false 522 | }); 523 | } 524 | }); 525 | server.post('/request/select/new', (req, res) => { 526 | console.log('[server] POST: /request/select/new'); 527 | let args = req.body; 528 | let studentId = req.session.userId; 529 | let connection = mysql.createConnection(dbConnectionInfo); 530 | let success = true; 531 | args.classes.map((aClass) => { 532 | // 先查找修读这门课的总人数 533 | connection.query(`select count(*) from \`select\` where class = ?`, [aClass], (err, result) => { 534 | if (err) success = false; 535 | else { 536 | // 看人数是否已满 537 | if (result.length > 0) { 538 | let count = result[0]['count(*)']; 539 | connection.query(`select * from class where id = ?`, [aClass], (err, result) => { 540 | if (err) success = false; 541 | else { 542 | if (result.length > 0) { 543 | if (count < result[0].plan) { 544 | connection.query(`insert into \`select\`(student, class) values(?, ?)`, 545 | [studentId, aClass], (err) => { 546 | if (err) success = false; 547 | else success = true; 548 | }); 549 | } else { 550 | success = false; 551 | } 552 | } else { 553 | success = false; 554 | } 555 | } 556 | }); 557 | } else { 558 | success = false; 559 | } 560 | } 561 | }); 562 | }); 563 | setTimeout(() => { 564 | res.json({ 565 | success: success 566 | }); 567 | }, 1000); 568 | }); 569 | server.post('/request/select/getStudentsByClass', (req, res) => { 570 | console.log('[server] POST: /request/select/getStudentsByClass'); 571 | let args = req.body; 572 | let connection = mysql.createConnection(dbConnectionInfo); 573 | connection.query(`select * from \`select\` where class = ?`, [args.class], (err, rels) => { 574 | if (err) { 575 | connection.end(); 576 | return res.json({ 577 | success: false 578 | }); 579 | } 580 | let success = true; 581 | let result = []; 582 | rels.map((rel) => { 583 | connection.query(`select * from student where id = ? limit 1`, [rel.student], (err, t) => { 584 | if (err) success = false; 585 | else { 586 | if (t.length > 0) { 587 | let student = t[0]; 588 | result.push({ 589 | key: student.id, 590 | id: student.id, 591 | number: student.number, 592 | name: student.name, 593 | college: student.college, 594 | major: student.major, 595 | sex: student.sex, 596 | grade: student.grade, 597 | phone: student.phone, 598 | gpa: rel.gpa 599 | }); 600 | } else { 601 | success = false; 602 | } 603 | } 604 | }); 605 | }); 606 | setTimeout(() => { 607 | connection.end(); 608 | return res.json({ 609 | success: success, 610 | result: result 611 | }); 612 | }, 1000); 613 | }); 614 | }); 615 | server.post('/request/select/setGpa', (req, res) => { 616 | console.log('[server] POST: /request/select/setGpa'); 617 | let args = req.body; 618 | let connection = mysql.createConnection(dbConnectionInfo); 619 | let studentList = ''; 620 | args.students.map((student, no) => { 621 | if (no === args.students.length - 1) 622 | studentList += student; 623 | else 624 | studentList += `${student},` 625 | }); 626 | connection.query(`update \`select\` set gpa = ? where class = ? and student in (${studentList})`, 627 | [args.gpa, args.class], (err) => { 628 | if (err) { 629 | connection.end(); 630 | return res.json({ 631 | success: false 632 | }); 633 | } 634 | connection.end(); 635 | return res.json({ 636 | success: true 637 | }); 638 | }); 639 | }); 640 | server.post('/request/sql/do', (req, res) => { 641 | let args = req.body; 642 | let connection = mysql.createConnection(dbConnectionInfo); 643 | connection.query(args.sql, (err, result) => { 644 | if (err) { 645 | connection.end(); 646 | return res.json({ 647 | success: false, 648 | err: err 649 | }); 650 | } 651 | connection.end(); 652 | return res.json({ 653 | success: true, 654 | result: result 655 | }); 656 | }); 657 | }); 658 | 659 | // 导出 server 660 | module.exports.server = server; 661 | --------------------------------------------------------------------------------