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
|