diff --git a/code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js b/code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js index 3af5b2e..cc74a2e 100644 --- a/code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js +++ b/code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js @@ -161,6 +161,7 @@ async function createNvrCamera (ctx) { }) } else { createData.push({ + type: 'nvr', serialNo: c.streamid, name: c.name, sip: corCamera.sipip, diff --git a/code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js b/code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js index 4efc107..f1a4370 100644 --- a/code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js +++ b/code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js @@ -221,23 +221,35 @@ async function banned (ctx) { } async function del (ctx) { + const transaction = await ctx.fs.dc.orm.transaction(); try { const { models } = ctx.fs.dc; - const { cameraId } = ctx.query + const { cameraId } = ctx.params const { token } = ctx.fs.api - await models.cameraId.destroy({ + await models.CameraAbilityBind.destroy({ + where: { + cameraId: cameraId + }, + transaction + }) + + await models.Camera.destroy({ where: { id: cameraId - } + }, + transaction }) - if (cameraId.length) { - await ctx.app.fs.axyRequest.delete('vcmp/camera/project', { query: { token, cameraId: cameraId.join(',') } }) + + if (cameraId) { + await ctx.app.fs.axyRequest.delete('vcmp/camera/project', { query: { token, cameraId: cameraId } }) } + await transaction.commit(); ctx.status = 204; } catch (error) { + await transaction.rollback(); ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = {} diff --git a/code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js b/code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js index 01d58a6..e96d72d 100644 --- a/code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js +++ b/code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js @@ -243,7 +243,20 @@ async function detail (ctx) { } const corUser = await ctx.app.fs.authRequest.get(`user/${nvrRes.createUserId}/message`, { query: { token } }) - + const serverDRes = (await ctx.app.fs.videoServerRequest.post(`gateway/plugins`) || '') + const serverDArr = JSON.parse(serverDRes.replace(/'/g, '"')) || [] + const serverDConfig = serverDArr.find(s => s.Name == 'GB28181') + let serveD = {} + if (serverDConfig) { + const { Config } = serverDConfig + let ConfigArr = Config.split('\n') + for (let c of ConfigArr) { + let config = c.split(' = ') + if (config.length == 2) { + serveD[config[0].trim()] = config[1].trim().replace(/\"/g, '') + } + } + } let nvrDetail = { ...nvrRes.dataValues, station: bindStations, @@ -251,7 +264,8 @@ async function detail (ctx) { createUser: { namePresent: corUser[0].namePresent }, - accessWay: 'GB/T28181' + accessWay: 'GB/T28181', + accessInfo: serveD } ctx.status = 200; diff --git a/code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js b/code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js index 702be70..ba98441 100644 --- a/code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js +++ b/code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js @@ -35,8 +35,8 @@ module.exports = function (app, router, opts) { app.fs.api.logAttr['PUT/camera/banned'] = { content: '禁用摄像头', visible: false }; router.put('/camera/banned', camera.banned); - app.fs.api.logAttr['DEL/camera'] = { content: '删除摄像头', visible: false }; - router.delete('/camera', camera.del); + app.fs.api.logAttr['DEL/camera/:cameraId'] = { content: '删除摄像头', visible: false }; + router.delete('/camera/:cameraId', camera.del); app.fs.api.logAttr['GET/camera/export'] = { content: '导出摄像头信息', visible: false }; router.get('/camera/export', camera.cameraExport); diff --git a/code/VideoAccess-VCMP/api/app/lib/service/paasRequest.js b/code/VideoAccess-VCMP/api/app/lib/service/paasRequest.js index 5ab6678..1cfa081 100644 --- a/code/VideoAccess-VCMP/api/app/lib/service/paasRequest.js +++ b/code/VideoAccess-VCMP/api/app/lib/service/paasRequest.js @@ -2,9 +2,10 @@ const request = require('superagent') class paasRequest { - constructor(root, { query = {} } = {}) { + constructor(root, { query = {} } = {}, option) { this.root = root; this.query = query + this.option = option } #buildUrl = (url) => { @@ -16,7 +17,7 @@ class paasRequest { if (err) { reject(err); } else { - resolve(res.body); + resolve(res[this.option.dataWord]); } }; } @@ -51,7 +52,7 @@ function factory (app, opts) { try { for (let r of opts.pssaRequest) { if (r.name && r.root) { - app.fs[r.name] = new paasRequest(r.root, { ...(r.params || {}) }) + app.fs[r.name] = new paasRequest(r.root, { ...(r.params || {}) }, { dataWord: r.dataWord || 'body' }) } else { throw 'opts.pssaRequest 参数错误!' } diff --git a/code/VideoAccess-VCMP/web/client/src/components/simpleFileDownButton.jsx b/code/VideoAccess-VCMP/web/client/src/components/simpleFileDownButton.jsx index 047594a..5ee4eee 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/simpleFileDownButton.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/simpleFileDownButton.jsx @@ -23,7 +23,9 @@ const SimpleFileDownButton = (props) => { > 导出 - + + + ) } export default Root; \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/auth/actions/auth.js b/code/VideoAccess-VCMP/web/client/src/sections/auth/actions/auth.js index e6c4f6d..6a37007 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/auth/actions/auth.js +++ b/code/VideoAccess-VCMP/web/client/src/sections/auth/actions/auth.js @@ -3,73 +3,78 @@ import { ApiTable, AuthRequest } from '$utils' export const INIT_AUTH = 'INIT_AUTH'; -export function initAuth () { - const user = JSON.parse(sessionStorage.getItem('user')) || {}; - return { - type: INIT_AUTH, - payload: { - user: user - } - }; +export function initAuth (userData) { + const sessionUser = JSON.parse(sessionStorage.getItem('user')) + const user = userData || sessionUser || {}; + if (user.authorized && !sessionUser) { + sessionStorage.setItem('user', JSON.stringify(user)) + } + return { + type: INIT_AUTH, + payload: { + user: user + } + }; } export const REQUEST_LOGIN = 'REQUEST_LOGIN'; export const LOGIN_SUCCESS = 'LOGIN_SUCCESS'; export const LOGIN_ERROR = 'LOGIN_ERROR'; export function login (username, password) { - return dispatch => { - dispatch({ type: REQUEST_LOGIN }); + return dispatch => { + dispatch({ type: REQUEST_LOGIN }); - if (!username || !password) { - dispatch({ - type: LOGIN_ERROR, - payload: { error: '请输入账号名和密码' } - }); - return Promise.resolve(); - } + if (!username || !password) { + dispatch({ + type: LOGIN_ERROR, + payload: { error: '请输入账号名和密码' } + }); + return Promise.resolve(); + } - // return dispatch({ - // type: LOGIN_SUCCESS, - // payload: { - // user: { - // authorized: true, - // namePresent: 'TEST' - // } - // }, - // }); + // return dispatch({ + // type: LOGIN_SUCCESS, + // payload: { + // user: { + // authorized: true, + // namePresent: 'TEST' + // } + // }, + // }); - return AuthRequest.post(ApiTable.login, { username, password }) - .then(user => { - sessionStorage.setItem('user', JSON.stringify(user)); - return dispatch({ - type: LOGIN_SUCCESS, - payload: { user: user }, - }); - }, error => { - let { body } = error.response; - return dispatch({ - type: LOGIN_ERROR, - payload: { - error: body && body.message ? body.message : '登录失败' - } - }) + return AuthRequest.post(ApiTable.login, { username, password }) + .then(user => { + sessionStorage.setItem('user', JSON.stringify(user)); + return dispatch({ + type: LOGIN_SUCCESS, + payload: { user: user }, }); - } + }, error => { + let { body } = error.response; + return dispatch({ + type: LOGIN_ERROR, + payload: { + error: body && body.message ? body.message : '登录失败' + } + }) + }); + } } export const LOGOUT = 'LOGOUT'; -export function logout (user) { - sessionStorage.removeItem('user'); - AuthRequest.put(ApiTable.logout, { - token: user.token - }); - return { - type: LOGOUT - }; +export function logout () { + const user = JSON.parse(sessionStorage.getItem('user')) + AuthRequest.put(ApiTable.logout, { + token: user.token + }); + sessionStorage.removeItem('user'); + return { + type: LOGOUT + }; } export default { - initAuth, - login, - logout + initAuth, + login, + logout } \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/auth/containers/login.jsx b/code/VideoAccess-VCMP/web/client/src/sections/auth/containers/login.jsx index 43eb1f7..6b6500b 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/auth/containers/login.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/auth/containers/login.jsx @@ -20,6 +20,8 @@ const Login = props => { useEffect(() => { if (user && user.authorized) { + const iotAuth = document.getElementById('iotAuth').contentWindow; + iotAuth.postMessage({ action: 'login', user: user }, '*'); dispatch(push('/equipmentWarehouse/nvr')); localStorage.setItem('vcmp_selected_sider', JSON.stringify(['nvr'])) localStorage.setItem('vcmp_open_sider', JSON.stringify(['equipmentWarehouse'])) diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/skeletonScreen.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/skeletonScreen.jsx index 31f7bd0..311bac0 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/skeletonScreen.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/skeletonScreen.jsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import { Table } from "@douyinfe/semi-ui"; diff --git a/code/VideoAccess-VCMP/web/webpack.config.js b/code/VideoAccess-VCMP/web/webpack.config.js index bb23307..7bba81f 100644 --- a/code/VideoAccess-VCMP/web/webpack.config.js +++ b/code/VideoAccess-VCMP/web/webpack.config.js @@ -32,7 +32,9 @@ module.exports = { }, plugins: [ new webpack.HotModuleReplacementPlugin(), - new BundleAnalyzerPlugin(), + new BundleAnalyzerPlugin({ + analyzerPort: 8000, + }), ], module: { rules: [{