Browse Source

1.1.0

release_0.0.2
巴林闲侠 3 years ago
parent
commit
f0a380d64d
  1. 3
      code/VideoAccess-VCMP/api/.vscode/launch.json
  2. 4
      code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js
  3. 55
      code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js
  4. 3
      code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js
  5. 8
      code/VideoAccess-VCMP/api/app/lib/index.js
  6. 52
      code/VideoAccess-VCMP/api/app/lib/models/camera_remark.js
  7. 3
      code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js
  8. 2
      code/VideoAccess-VCMP/api/app/lib/routes/index.js
  9. 2
      code/VideoAccess-VCMP/api/app/lib/schedule/freshYingshiMsg.js
  10. 2
      code/VideoAccess-VCMP/api/app/lib/schedule/index.js
  11. 4
      code/VideoAccess-VCMP/api/app/lib/utils/token4yingshi.js
  12. 1
      code/VideoAccess-VCMP/api/config.js
  13. 2
      code/VideoAccess-VCMP/api/sequelize-automate.config.js
  14. 72
      code/VideoAccess-VCMP/script/0.0.1/0_init_db.sql

3
code/VideoAccess-VCMP/api/.vscode/launch.json

@ -20,10 +20,11 @@
"--redisPort 6379", "--redisPort 6379",
"--axyApiUrl http://127.0.0.1:4100", "--axyApiUrl http://127.0.0.1:4100",
"--iotAuthApi http://127.0.0.1:4200", "--iotAuthApi http://127.0.0.1:4200",
"--iotVideoServerUrl http://221.230.55.27:8081",
"--godUrl https://restapi.amap.com/v3", "--godUrl https://restapi.amap.com/v3",
"--godKey 21c2d970e1646bb9a795900dd00093ce", "--godKey 21c2d970e1646bb9a795900dd00093ce",
"--mqttVideoServer mqtt://10.8.30.71:30883", "--mqttVideoServer mqtt://10.8.30.71:30883",
// "--iotVideoServerUrl http://221.230.55.27:8081",
"--iotVideoServerUrl http://10.8.30.59:8080",
"--cameraPlayWsHost ws://221.230.55.27:8081", "--cameraPlayWsHost ws://221.230.55.27:8081",
"--cameraPlayHttpFlvHost http://221.230.55.27:2020", "--cameraPlayHttpFlvHost http://221.230.55.27:2020",
"--cameraPlayHlsHost http://221.230.55.27:8081", "--cameraPlayHlsHost http://221.230.55.27:8081",

4
code/VideoAccess-VCMP/api/app/lib/controllers/camera/create.js

@ -304,8 +304,8 @@ async function createIpcCamera (ctx) {
const gbCameraRes = await verifyIpcInfo({ serialNo }) const gbCameraRes = await verifyIpcInfo({ serialNo })
storageData.sip = gbCameraRes.dataValues.sipip storageData.sip = gbCameraRes.sipip
storageData.gbId = gbCameraRes.dataValues.id storageData.gbId = gbCameraRes.id
if (handleCameraId) { if (handleCameraId) {
await models.Camera.update(storageData, { await models.Camera.update(storageData, {

55
code/VideoAccess-VCMP/api/app/lib/controllers/camera/index.js

@ -31,6 +31,9 @@ async function getCameraProject (ctx, next) {
}, { }, {
model: models.SecretYingshi, model: models.SecretYingshi,
attributes: ['token'] attributes: ['token']
}, {
model: models.CameraRemark,
attributes: ['remark']
}], }],
distinct: true distinct: true
} }
@ -307,6 +310,13 @@ async function del (ctx) {
transaction transaction
}) })
await models.CameraRemark.destroy({
where: {
cameraId: cameraId
},
transaction
})
await models.Camera.destroy({ await models.Camera.destroy({
where: { where: {
id: cameraId id: cameraId
@ -490,6 +500,50 @@ async function getKind (ctx) {
} }
} }
async function remark (ctx) {
const transaction = await ctx.fs.dc.orm.transaction();
let errMsg = undefined
try {
const { models } = ctx.fs.dc
const { cameraId, remark, } = ctx.request.body;
const cameraRes = await models.Camera.findOne({
where: {
id: cameraId
}
})
if (!cameraRes) {
errMsg = '摄像头不存在'
}
await models.CameraRemark.destroy({
where: {
cameraId
},
transaction
})
await models.CameraRemark.bulkCreate(remark.map(r => {
return {
cameraId,
remark: r
}
}), {
transaction
})
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 = {
message: errMsg
}
}
}
module.exports = { module.exports = {
getCameraProject, getCameraProject,
getCamera, getCamera,
@ -500,4 +554,5 @@ module.exports = {
cameraExport, cameraExport,
getAbility, getAbility,
getKind, getKind,
remark,
}; };

3
code/VideoAccess-VCMP/api/app/lib/controllers/nvr/index.js

@ -299,7 +299,8 @@ async function detail (ctx) {
} }
const corUser = await ctx.app.fs.authRequest.get(`user/${nvrRes.createUserId}/message`, { query: { token } }) 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 serverDRes = (await ctx.app.fs.videoServerRequest.post(`gb28181/api/plugins`) || '')
// const serverDRes = (await ctx.app.fs.videoServerRequest.post(`gateway/plugins`) || '')
const serverDArr = JSON.parse(serverDRes.replace(/'/g, '"')) || [] const serverDArr = JSON.parse(serverDRes.replace(/'/g, '"')) || []
const serverDConfig = serverDArr.find(s => s.Name == 'GB28181') const serverDConfig = serverDArr.find(s => s.Name == 'GB28181')
let serveD = {} let serveD = {}

8
code/VideoAccess-VCMP/api/app/lib/index.js

@ -1,5 +1,7 @@
'use strict'; 'use strict';
const fs = require('fs');
const path = require('path');
const utils = require('./utils') const utils = require('./utils')
const routes = require('./routes'); const routes = require('./routes');
const redisConnect = require('./service/redis') const redisConnect = require('./service/redis')
@ -51,4 +53,10 @@ module.exports.models = function (dc) { // dc = { orm: Sequelize对象, ORM: Seq
require('./models/secret_yingshi')(dc); require('./models/secret_yingshi')(dc);
require('./models/gb_camera')(dc); require('./models/gb_camera')(dc);
require('./models/ax_project')(dc); require('./models/ax_project')(dc);
require('./models/camera_remark')(dc);
// TODO 模型关系摘出来 初始化之后再定义关系才行
// fs.readdirSync(path.join(__dirname, '/models')).forEach((filename) => {
// require(`./models/${filename}`)(dc)
// });
}; };

52
code/VideoAccess-VCMP/api/app/lib/models/camera_remark.js

@ -0,0 +1,52 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const CameraRemark = sequelize.define("cameraRemark", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "id",
autoIncrement: true,
unique: "camera_remark_id_uindex"
},
cameraId: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "camera_id",
autoIncrement: false,
references: {
key: "id",
model: "camera"
}
},
remark: {
type: DataTypes.STRING,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: false,
field: "remark",
autoIncrement: false
}
}, {
tableName: "camera_remark",
comment: "",
indexes: []
});
dc.models.CameraRemark = CameraRemark;
const Camera = dc.models.Camera;
CameraRemark.belongsTo(Camera, { foreignKey: 'cameraId', targetKey: 'id' });
Camera.hasMany(CameraRemark, { foreignKey: 'cameraId', sourceKey: 'id' });
return CameraRemark;
};

3
code/VideoAccess-VCMP/api/app/lib/routes/camera/index.js

@ -70,4 +70,7 @@ module.exports = function (app, router, opts) {
app.fs.api.logAttr['GET/camera/kind'] = { content: '获取摄像头种类列表', visible: false }; app.fs.api.logAttr['GET/camera/kind'] = { content: '获取摄像头种类列表', visible: false };
router.get('/camera/kind', camera.getKind); router.get('/camera/kind', camera.getKind);
app.fs.api.logAttr['POST/camera/remark'] = { content: '编辑摄像头备注', visible: false };
router.post('/camera/remark', camera.remark);
}; };

2
code/VideoAccess-VCMP/api/app/lib/routes/index.js

@ -5,7 +5,7 @@ const fs = require('fs');
module.exports = function (app, router, opts) { module.exports = function (app, router, opts) {
fs.readdirSync(__dirname).forEach((filename) => { fs.readdirSync(__dirname).forEach((filename) => {
if (filename.indexOf('.') !== 0 &&fs.lstatSync(path.join(__dirname, filename)).isDirectory()) { if (filename.indexOf('.') !== 0 && fs.lstatSync(path.join(__dirname, filename)).isDirectory()) {
fs.readdirSync(path.join(__dirname, filename)).forEach((api) => { fs.readdirSync(path.join(__dirname, filename)).forEach((api) => {
if (api.indexOf('.') == 0 || api.indexOf('.js') == -1) return; if (api.indexOf('.') == 0 || api.indexOf('.js') == -1) return;
require(`./${filename}/${api}`)(app, router, opts); require(`./${filename}/${api}`)(app, router, opts);

2
code/VideoAccess-VCMP/api/app/lib/schedule/freshYingshiMsg.js

@ -97,7 +97,7 @@ module.exports = function (app, opts) {
{ {
// interval: '0 0 4 */1 *', // interval: '0 0 4 */1 *',
// interval: '*/30 * * * *', // interval: '*/30 * * * *',
interval: '0 34 5 * * *', interval: '0 34 5 1 * *',
immediate: true, immediate: true,
}, },
async () => { async () => {

2
code/VideoAccess-VCMP/api/app/lib/schedule/index.js

@ -10,7 +10,7 @@ module.exports = async function (app, opts) {
interval, immediate interval, immediate
}, callback) => { }, callback) => {
const j = nodeSchedule.scheduleJob(interval, callback); const j = nodeSchedule.scheduleJob(interval, callback);
if (immediate) { if (immediate && opts.dev) {
setTimeout(callback, 0) setTimeout(callback, 0)
} }
return j; return j;

4
code/VideoAccess-VCMP/api/app/lib/utils/token4yingshi.js

@ -81,8 +81,8 @@ module.exports = function (app, opts) {
} }
const typeMap = { const typeMap = {
// live: 1, // live: 1,
cloud: 2, local: 2,
local: 3 cloud: 3
} }
let playUrl = { let playUrl = {

1
code/VideoAccess-VCMP/api/config.js

@ -81,6 +81,7 @@ const product = {
}, { }, {
entry: require('./app').entry, entry: require('./app').entry,
opts: { opts: {
dev,
exclude: [], // 不做认证的路由,也可以使用 exclude: ["*"] 跳过所有路由 exclude: [], // 不做认证的路由,也可以使用 exclude: ["*"] 跳过所有路由
redis: { redis: {
host: IOTA_REDIS_SERVER_HOST, host: IOTA_REDIS_SERVER_HOST,

2
code/VideoAccess-VCMP/api/sequelize-automate.config.js

@ -26,7 +26,7 @@ module.exports = {
dir: './app/lib/models', // 指定输出 models 文件的目录 dir: './app/lib/models', // 指定输出 models 文件的目录
typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义 typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义
emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir` emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir`
tables: ['camera_ability_bind'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性 tables: ['camera_remark'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性
skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性 skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性
tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中 tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中
ignorePrefix: [], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面 ignorePrefix: [], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面

72
code/VideoAccess-VCMP/script/0.0.1/0_init_db.sql

@ -12,7 +12,7 @@
Target Server Version : 90515 Target Server Version : 90515
File Encoding : 65001 File Encoding : 65001
Date: 20/06/2022 14:41:32 Date: 06/07/2022 11:45:25
*/ */
@ -38,6 +38,17 @@ MAXVALUE 9223372036854775807
START 1 START 1
CACHE 1; CACHE 1;
-- ----------------------------
-- Sequence structure for camera_remark_id_seq
-- ----------------------------
DROP SEQUENCE IF EXISTS "public"."camera_remark_id_seq";
CREATE SEQUENCE "public"."camera_remark_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
-- ---------------------------- -- ----------------------------
-- Sequence structure for gbCamera_id_seq -- Sequence structure for gbCamera_id_seq
-- ---------------------------- -- ----------------------------
@ -151,7 +162,8 @@ CREATE TABLE "public"."camera" (
"model" varchar(128) COLLATE "pg_catalog"."default", "model" varchar(128) COLLATE "pg_catalog"."default",
"kind_id" int4, "kind_id" int4,
"yingshi_secret_id" int4, "yingshi_secret_id" int4,
"gb_id" int4 "gb_id" int4,
"top_serial_no" varchar(128) COLLATE "pg_catalog"."default"
) )
; ;
COMMENT ON COLUMN "public"."camera"."type" IS '设备类型:yingshi - 萤石;nvr - NVR摄像头;ipc - IPC 网络摄像头;cascade - 级联摄像头'; COMMENT ON COLUMN "public"."camera"."type" IS '设备类型:yingshi - 萤石;nvr - NVR摄像头;ipc - IPC 网络摄像头;cascade - 级联摄像头';
@ -171,6 +183,7 @@ COMMENT ON COLUMN "public"."camera"."forbidden" IS '是否禁用';
COMMENT ON COLUMN "public"."camera"."recycle_time" IS '放入回收站时间'; COMMENT ON COLUMN "public"."camera"."recycle_time" IS '放入回收站时间';
COMMENT ON COLUMN "public"."camera"."delete" IS '是否彻底删除'; COMMENT ON COLUMN "public"."camera"."delete" IS '是否彻底删除';
COMMENT ON COLUMN "public"."camera"."model" IS '型号'; COMMENT ON COLUMN "public"."camera"."model" IS '型号';
COMMENT ON COLUMN "public"."camera"."top_serial_no" IS 'gb设备 level=0 的 steamid ';
-- ---------------------------- -- ----------------------------
-- Table structure for camera_ability -- Table structure for camera_ability
@ -221,6 +234,17 @@ INSERT INTO "public"."camera_kind" VALUES (1, '枪机');
INSERT INTO "public"."camera_kind" VALUES (2, '球机'); INSERT INTO "public"."camera_kind" VALUES (2, '球机');
INSERT INTO "public"."camera_kind" VALUES (1314, '其他'); INSERT INTO "public"."camera_kind" VALUES (1314, '其他');
-- ----------------------------
-- Table structure for camera_remark
-- ----------------------------
DROP TABLE IF EXISTS "public"."camera_remark";
CREATE TABLE "public"."camera_remark" (
"id" int4 NOT NULL DEFAULT nextval('camera_remark_id_seq'::regclass),
"camera_id" int4 NOT NULL,
"remark" varchar(256) COLLATE "pg_catalog"."default" NOT NULL
)
;
-- ---------------------------- -- ----------------------------
-- Table structure for gbCamera -- Table structure for gbCamera
-- ---------------------------- -- ----------------------------
@ -240,9 +264,11 @@ CREATE TABLE "public"."gbCamera" (
"Sipip" varchar(255) COLLATE "pg_catalog"."default", "Sipip" varchar(255) COLLATE "pg_catalog"."default",
"ipctype" varchar(255) COLLATE "pg_catalog"."default", "ipctype" varchar(255) COLLATE "pg_catalog"."default",
"registerTime" varchar(255) COLLATE "pg_catalog"."default" DEFAULT ''::character varying, "registerTime" varchar(255) COLLATE "pg_catalog"."default" DEFAULT ''::character varying,
"updateTime" varchar(255) COLLATE "pg_catalog"."default" "updateTime" varchar(255) COLLATE "pg_catalog"."default",
"playUrl" jsonb
) )
; ;
COMMENT ON COLUMN "public"."gbCamera"."playUrl" IS '播放地址集合';
-- ---------------------------- -- ----------------------------
-- Table structure for nvr -- Table structure for nvr
@ -286,9 +312,9 @@ CREATE TABLE "public"."secret_yingshi" (
-- ---------------------------- -- ----------------------------
-- Records of secret_yingshi -- Records of secret_yingshi
-- ---------------------------- -- ----------------------------
INSERT INTO "public"."secret_yingshi" VALUES (3, 'd0704fb9d5d14a6682c1c1d592c12512', '93d023269495b86be62cdfdcf34a6cd1', 'at.67z1cfi515oyuu8p4wtgnr6e8dd7qwe4-6bg4tycrsw-0evcx34-xh1ks80et', '1656293969344'); INSERT INTO "public"."secret_yingshi" VALUES (2, '3ea2b502f6804d64b43e4cb3d135665c', '331c85c5b7ce76179f6eb7dccb8aeb27', 'at.culo424j9drz8atx9uikeq5e2mzkhnhx-490csubqrh-1o3hcaz-szuvfax6f', '1657681218109');
INSERT INTO "public"."secret_yingshi" VALUES (1, '5d16a667e1c2423d9d0d634f781810b4', '0cc4e1ec4e6a53ea3dabeb09cd5f468b', 'at.4p2f551n58eb9cjdd8vr4uuh1j4ozdjn-9gvmswjpa7-1y5juuk-gochbasv0', '1656294553279'); INSERT INTO "public"."secret_yingshi" VALUES (3, 'd0704fb9d5d14a6682c1c1d592c12512', '93d023269495b86be62cdfdcf34a6cd1', 'at.1y2mk5fh2myswbkp017pmvdi0v1zbdrw-5j39z78wsp-0x4vi2j-a3mxjlt32', '1657683606281');
INSERT INTO "public"."secret_yingshi" VALUES (2, '3ea2b502f6804d64b43e4cb3d135665c', '331c85c5b7ce76179f6eb7dccb8aeb27', 'at.9q4woxj71nkmckb9d2xe1yoycc81fd4l-2a45fk76s4-0qvuhi2-j5bvk57lp', '1656293899796'); INSERT INTO "public"."secret_yingshi" VALUES (1, '5d16a667e1c2423d9d0d634f781810b4', '0cc4e1ec4e6a53ea3dabeb09cd5f468b', 'at.9gq3xwwbazkk33y177ucqtk936bmd0sz-41x4xf24sh-1cn7x82-4lf7davve', '1657681803201');
-- ---------------------------- -- ----------------------------
-- Table structure for t_upload_comm_http -- Table structure for t_upload_comm_http
@ -326,14 +352,18 @@ INSERT INTO "public"."vender" VALUES (1314, '其他');
-- ---------------------------- -- ----------------------------
ALTER SEQUENCE "public"."camera_ability_bind_id_seq" ALTER SEQUENCE "public"."camera_ability_bind_id_seq"
OWNED BY "public"."camera_ability_bind"."id"; OWNED BY "public"."camera_ability_bind"."id";
SELECT setval('"public"."camera_ability_bind_id_seq"', 35, true);
-- ---------------------------- -- ----------------------------
-- Alter sequences owned by -- Alter sequences owned by
-- ---------------------------- -- ----------------------------
ALTER SEQUENCE "public"."camera_id_seq" ALTER SEQUENCE "public"."camera_id_seq"
OWNED BY "public"."camera"."id"; OWNED BY "public"."camera"."id";
SELECT setval('"public"."camera_id_seq"', 314, true);
-- ----------------------------
-- Alter sequences owned by
-- ----------------------------
ALTER SEQUENCE "public"."camera_remark_id_seq"
OWNED BY "public"."camera_remark"."id";
-- ---------------------------- -- ----------------------------
-- Alter sequences owned by -- Alter sequences owned by
@ -343,14 +373,12 @@ SELECT setval('"public"."gbCamera_id_seq"', 2, false);
-- ---------------------------- -- ----------------------------
-- Alter sequences owned by -- Alter sequences owned by
-- ---------------------------- -- ----------------------------
SELECT setval('"public"."gb_id_seq"', 38, true);
-- ---------------------------- -- ----------------------------
-- Alter sequences owned by -- Alter sequences owned by
-- ---------------------------- -- ----------------------------
ALTER SEQUENCE "public"."nvr_id_seq" ALTER SEQUENCE "public"."nvr_id_seq"
OWNED BY "public"."nvr"."id"; OWNED BY "public"."nvr"."id";
SELECT setval('"public"."nvr_id_seq"', 69, true);
-- ---------------------------- -- ----------------------------
-- Alter sequences owned by -- Alter sequences owned by
@ -431,10 +459,27 @@ CREATE UNIQUE INDEX "camera_kind_id_uindex" ON "public"."camera_kind" USING btre
-- ---------------------------- -- ----------------------------
ALTER TABLE "public"."camera_kind" ADD CONSTRAINT "camera_kind_pk" PRIMARY KEY ("id"); ALTER TABLE "public"."camera_kind" ADD CONSTRAINT "camera_kind_pk" PRIMARY KEY ("id");
-- ----------------------------
-- Indexes structure for table camera_remark
-- ----------------------------
CREATE UNIQUE INDEX "camera_remark_id_uindex" ON "public"."camera_remark" USING btree (
"id" "pg_catalog"."int4_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table camera_remark
-- ----------------------------
ALTER TABLE "public"."camera_remark" ADD CONSTRAINT "camera_remark_pk" PRIMARY KEY ("id");
-- ---------------------------- -- ----------------------------
-- Primary Key structure for table gbCamera -- Primary Key structure for table gbCamera
-- ---------------------------- -- ----------------------------
ALTER TABLE "public"."gbCamera" ADD CONSTRAINT "gbCamera_pkey" PRIMARY KEY ("id"); ALTER TABLE "public"."gbCamera" ADD CONSTRAINT "gbCamera1_copy1_pkey" PRIMARY KEY ("id");
-- ----------------------------
-- Primary Key structure for table gbCamera1
-- ----------------------------
ALTER TABLE "public"."gbCamera1" ADD CONSTRAINT "gbCamera_pkey" PRIMARY KEY ("id");
-- ---------------------------- -- ----------------------------
-- Indexes structure for table nvr -- Indexes structure for table nvr
@ -491,6 +536,11 @@ ALTER TABLE "public"."camera" ADD CONSTRAINT "camera_vender_id_fk" FOREIGN KEY (
ALTER TABLE "public"."camera_ability_bind" ADD CONSTRAINT "camera_ability_bind_camera_ability_id_fk" FOREIGN KEY ("ability_id") REFERENCES "public"."camera_ability" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; ALTER TABLE "public"."camera_ability_bind" ADD CONSTRAINT "camera_ability_bind_camera_ability_id_fk" FOREIGN KEY ("ability_id") REFERENCES "public"."camera_ability" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE "public"."camera_ability_bind" ADD CONSTRAINT "camera_ability_bind_camera_id_fk" FOREIGN KEY ("camera_id") REFERENCES "public"."camera" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION; ALTER TABLE "public"."camera_ability_bind" ADD CONSTRAINT "camera_ability_bind_camera_id_fk" FOREIGN KEY ("camera_id") REFERENCES "public"."camera" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- ----------------------------
-- Foreign Keys structure for table camera_remark
-- ----------------------------
ALTER TABLE "public"."camera_remark" ADD CONSTRAINT "camera_remark_camera_id_fk" FOREIGN KEY ("camera_id") REFERENCES "public"."camera" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;
-- ---------------------------- -- ----------------------------
-- Foreign Keys structure for table nvr -- Foreign Keys structure for table nvr
-- ---------------------------- -- ----------------------------

Loading…
Cancel
Save