fcs
2025-04-10 0163870d662dc5b7d69ceff977490ede594f7d82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
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 logs = require('../utils/logs')
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}登录`
        logs.logLogin(ctx, ms, 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}退出登录`
  logs.logLogin(ctx, ms, 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