const router = require('koa-router')() const jwt = require('jsonwebtoken') const util = require('util') const verify = util.promisify(jwt.verify) let secret = 'FM_Monitor' const users = require('../models/user') const mysql = require('../utils/mysql_db') //测试,使用完删除 const crypto = require('../utils/crypto') router.prefix('/user') router.get('/create', async function (ctx, res, next) { let data = ctx.query let password = data.password const EncryptStr = crypto.Encrypt(password) ctx.body = { code: 20000, data: EncryptStr } }) //登陆,生成token router.post('/login', async function (ctx, next) { const start = new Date() let data = ctx.request.body await users.getUser(data.username).then(async function (user) { if (user[0]) { if(user[0].failuresTimes == 5){ return (ctx.body = { code:20250, message: `账户 ${user[0].user_name} 今日被锁定登录,请明日再试。` }) } const pwdMatchFlag = data.password == user[0].password//bcrypt.compareSync(data.password, user[0].password) if (pwdMatchFlag) { //生成token let userToken = { tel: user[0].tel, user_name: user[0].user_name } const token = jwt.sign(userToken, secret, { expiresIn: '8h' }) delete user[0].password const ms = new Date() - start //响应时间 data.logDes = `${user[0].user_name}登录` return (ctx.body = { code: 20000, token: token }) } else { //密码错误 let failures = parseInt(parseInt(user[0].failuresTimes) + 1) await users.failuresAdd({ num:failures, id:user[0].id }) return (ctx.body = { code:20250, message: `密码错误,账户 ${user[0].user_name} 今日剩余${parseInt(5-failures)}次登录机会。` }) } } else { //用户不存在 return (ctx.body = { message: '用户不存在' }) } }) }) router.get('/info', async function (ctx, res, next) { const token = ctx.query.token payload = await verify(token, secret) ctx.body = { code: 20000, data: await users.getInfo(payload.tel) } }) //验证用户手机号是否存在 router.get('/ifPhoneExist', async function (ctx, res, next) { let data = ctx.query ctx.body = { data: await users.ifPhoneExist(data), code: 20000 } }) router.post('/logout', async function (ctx, res, next) { const start = new Date() const token = ctx.request.body.token payload = await verify(token, secret) const ms = new Date() - start //响应时间 ctx.request.body.logDes = `${payload.user_name}退出登录` ctx.body = { code: 20000, data: 'success' } }) //获取字典表,用于下拉框,name\id router.get('/Dictionary', async function (ctx, res, next) { let data = ctx.query ctx.body = { code: 20000, data: await users.Dictionary(data) } }) //*************************************************************************************************************************** */ //仅供测试,用完删除 router.get('/withoutToken', async function (ctx, res, next) { //const token = ctx.query.token //payload = await verify(token, secret) ctx.body = { code: 20000, data: await users.getwithoutToken() } }) /** * 仅供测试,用完删除 * 上传扫台结果 * 传入参数:result(扫台结果 字符串 &分割频率) start(扫台开始时间 字符串) end(扫台结束时间) lon lat , */ router.get('/ReportScanResult', async function (ctx, next) { /** * 扫台记录保存流程: * 1 将扫台结果保存到任务记录表(fm_t_task_record)中 * 2 如果是周期任务,则返回需要录音的频率列表;此外还需返回录音频率对应的标识,标识包括: * i task_record_id,即1中插入新的任务记录后得到的主键id * ii result_type,即频率的判别类型(取值为字典表fm_d_result_type中的id值) */ let log_id = '123456789' let params = ctx.query params.identifier = JSON.parse(params.identifier) let scan_result = params.result .split('&') .map(freq => Math.round(Number(freq) * 10) / 10) //保存任务执行记录及扫台结果(不需要区分周期任务和即时任务的扫台) let sql = `INSERT INTO fm_t_task_record(task_type,task_id,device_lgid,start_time,finish_time,scan_result) VALUES('${params.identifier.task_type}', '${params.identifier.task_id}', '${log_id}', '${params.start}', '${params.end}', '${JSON.stringify(scan_result)}' );` let query_result = await mysql.queryNewId(sql) //返回结果 ctx.body = { code: 20000, data: query_result, message: '扫台结果长传成功' } }) //录音结果上报 //仅供测试,用完删除 router.get('/ReportRecordResult', async function (ctx, next) { let params = ctx.query let sql = `INSERT INTO fm_t_scan_record(task_record_id,frequency,lon,lat,signal_strength,radio_file_path,result,upload_time) VALUES(${params.task_record_id}, ${Math.round(params.frequency * 10) / 10}, ${params.lon}, ${params.lat}, ${params.rssi}, '/uploads/${params.radio_file_path}', '1', now() );` let query_result = await mysql.query(sql) ctx.body = { success: true, code: 20000, data: query_result, message: '录音结果长传成功' } }) /** * 仅供测试,用完删除 * 上传扫台结果 * 传入参数:result(扫台结果 字符串 &分割频率) start(扫台开始时间 字符串) end(扫台结束时间) lon lat , */ router.post('/ReportScanResult', async function (ctx, next) { /** * 扫台记录保存流程: * 1 将扫台结果保存到任务记录表(fm_t_task_record)中 * 2 如果是周期任务,则返回需要录音的频率列表;此外还需返回录音频率对应的标识,标识包括: * i task_record_id,即1中插入新的任务记录后得到的主键id * ii result_type,即频率的判别类型(取值为字典表fm_d_result_type中的id值) */ let params = ctx.request.body params.identifier = JSON.parse(params.identifier) let scan_result = params.results .split('&') .map(freq => Math.round(Number(freq) * 10) / 10) //保存任务执行记录及扫台结果(不需要区分周期任务和即时任务的扫台) let sql = `INSERT INTO fm_t_task_record(task_type,task_id,device_lgid,start_time,finish_time,scan_result) VALUES('${params.identifier.task_type}', '${params.identifier.task_id}', '${params.deviceId}', '${params.start}', '${params.end}', '${JSON.stringify(scan_result)}' );` let query_result = await mysql.queryNewId(sql) //返回结果 ctx.body = { code: 20000, data: query_result, message: '扫台结果长传成功' } }) //录音结果上报 //仅供测试,用完删除 router.post('/ReportRecordResult', async function (ctx, next) { let params = ctx.request.body let sql = `INSERT INTO fm_t_scan_record(task_record_id,frequency,lon,lat,signal_strength,radio_file_path,result,upload_time) VALUES(${params.task_record_id}, ${Math.round(params.frequency * 10) / 10}, ${params.lon}, ${params.lat}, ${params.rssi}, '/uploads/${params.radio_file_path}', '1', now() );` let query_result = await mysql.query(sql) ctx.body = { success: true, code: 20000, data: query_result, message: '录音结果长传成功' } }) module.exports = router