7 changed files with 585 additions and 8 deletions
			
			
		@ -0,0 +1,507 @@ | 
				
			|||
'use strict'; | 
				
			|||
const moment = require('moment') | 
				
			|||
 | 
				
			|||
async function edit (ctx) { | 
				
			|||
   const transaction = await ctx.fs.dc.orm.transaction(); | 
				
			|||
   try { | 
				
			|||
      const sequelize = ctx.fs.dc.orm; | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId } = ctx.fs.api | 
				
			|||
      const data = ctx.request.body | 
				
			|||
      const timeNow = moment() | 
				
			|||
      const { mirrorId, tree = [], filterGroup = [] } = data | 
				
			|||
      let mirrorId_ = mirrorId | 
				
			|||
 | 
				
			|||
      if (mirrorId_) { | 
				
			|||
         let upData = { | 
				
			|||
            template: data.template, | 
				
			|||
            updateTime: timeNow.format(), | 
				
			|||
            title: data.title, | 
				
			|||
            showHeader: Boolean(data.showHeader), | 
				
			|||
         } | 
				
			|||
         if (data.publish) { | 
				
			|||
            upData.publish = true | 
				
			|||
            upData.publishTime = timeNow.format() | 
				
			|||
         } | 
				
			|||
         await models.Mirror.update(upData, { | 
				
			|||
            where: { | 
				
			|||
               id: mirrorId_ | 
				
			|||
            }, | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
 | 
				
			|||
         // 除 Mirror 外的信息全删除并重建
 | 
				
			|||
         await models.MirrorCamera.destroy({ | 
				
			|||
            where: { | 
				
			|||
               mirrorId: mirrorId_ | 
				
			|||
            }, | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
         await sequelize.query('DELETE FROM mirror_filter WHERE group_id IN (SELECT id FROM mirror_filter_group WHERE mirror_id=?)', { | 
				
			|||
            replacements: [mirrorId_], | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
         await models.MirrorFilterGroup.destroy({ | 
				
			|||
            where: { | 
				
			|||
               mirrorId: mirrorId_ | 
				
			|||
            }, | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
         await models.MirrorTree.destroy({ | 
				
			|||
            where: { | 
				
			|||
               mirrorId: mirrorId_ | 
				
			|||
            }, | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
      } else { | 
				
			|||
         // 创建 镜像信息
 | 
				
			|||
         let createData = { | 
				
			|||
            template: data.template, | 
				
			|||
            createUser: userId, | 
				
			|||
            createTime: timeNow.format(), | 
				
			|||
            title: data.title, | 
				
			|||
            showHeader: Boolean(data.showHeader), | 
				
			|||
            publish: false, | 
				
			|||
            mid: timeNow.format(`ssmmHHDDMMYYYY`) | 
				
			|||
         } | 
				
			|||
         if (data.publish) { | 
				
			|||
            createData.publish = true | 
				
			|||
            createData.publishTime = timeNow.format() | 
				
			|||
         } | 
				
			|||
         const mirrorCreateRes = await models.Mirror.create(createData, { | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
         mirrorId_ = mirrorCreateRes.id | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      let cameraStorage = {} | 
				
			|||
      const dealTree = async (child, lastNodeStorageId, level) => { | 
				
			|||
         // 递归 tree 获得扁平信息
 | 
				
			|||
         let curLevel = level | 
				
			|||
         for (let c of child) { | 
				
			|||
            if (c.cameraId) { | 
				
			|||
               // 摄像头节点为末端节点
 | 
				
			|||
               // 不创建节点
 | 
				
			|||
               if (cameraStorage[c.cameraId]) { | 
				
			|||
                  cameraStorage[c.cameraId].treeIds.push(lastNodeStorageId) | 
				
			|||
               } else { | 
				
			|||
                  cameraStorage[c.cameraId] = { | 
				
			|||
                     treeIds: [lastNodeStorageId], | 
				
			|||
                     filterIds: [] | 
				
			|||
                  } | 
				
			|||
               } | 
				
			|||
            } else { | 
				
			|||
               const treeStorageRes = await models.MirrorTree.create({ | 
				
			|||
                  name: c.label, | 
				
			|||
                  level: curLevel, | 
				
			|||
                  dependence: lastNodeStorageId, | 
				
			|||
                  mirrorId: mirrorId_ | 
				
			|||
               }, { | 
				
			|||
                  transaction | 
				
			|||
               }) | 
				
			|||
 | 
				
			|||
               if (c.children) { | 
				
			|||
                  await dealTree(c.children, treeStorageRes.id, curLevel + 1) | 
				
			|||
               } | 
				
			|||
            } | 
				
			|||
         } | 
				
			|||
      } | 
				
			|||
      await dealTree(tree, null, 1) | 
				
			|||
 | 
				
			|||
      for (let g of filterGroup) { | 
				
			|||
         // 遍历创建筛选分组
 | 
				
			|||
         const filterGroupStorageRes = await models.MirrorFilterGroup.create({ | 
				
			|||
            name: g.name, | 
				
			|||
            forbidden: g.forbidden, | 
				
			|||
            mirrorId: mirrorId_ | 
				
			|||
         }, { | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
         if (g.filters) { | 
				
			|||
            for (let f of g.filters) { | 
				
			|||
               // 遍历创建筛选项
 | 
				
			|||
               const filterStorageRes = await models.MirrorFilter.create({ | 
				
			|||
                  name: f.name, | 
				
			|||
                  groupId: filterGroupStorageRes.id | 
				
			|||
               }, { | 
				
			|||
                  transaction | 
				
			|||
               }) | 
				
			|||
               for (let cid of f.cameraIds) { | 
				
			|||
                  if (cameraStorage[cid]) { | 
				
			|||
                     cameraStorage[cid].filterIds.push(filterStorageRes.id) | 
				
			|||
                  } | 
				
			|||
               } | 
				
			|||
            } | 
				
			|||
         } | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      let bulkCreateCameraD = [] | 
				
			|||
      for (let cid in cameraStorage) { | 
				
			|||
         bulkCreateCameraD.push({ | 
				
			|||
            cameraId: cid, | 
				
			|||
            ...cameraStorage[cid], | 
				
			|||
            mirrorId: mirrorId_ | 
				
			|||
         }) | 
				
			|||
      } | 
				
			|||
      if (bulkCreateCameraD.length) { | 
				
			|||
         await models.MirrorCamera.bulkCreate(bulkCreateCameraD, { | 
				
			|||
            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: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
async function list (ctx) { | 
				
			|||
   try { | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId, token } = ctx.fs.api | 
				
			|||
 | 
				
			|||
      const mirrorRes = await models.Mirror.findAll({ | 
				
			|||
         attributes: { | 
				
			|||
            exclude: ['showHeader'] | 
				
			|||
         }, | 
				
			|||
         where: {}, | 
				
			|||
         order: [['id', 'DESC']] | 
				
			|||
      }) | 
				
			|||
      let createUserIds = new Set() | 
				
			|||
 | 
				
			|||
      for (let c of mirrorRes) { | 
				
			|||
         createUserIds.add(c.dataValues.createUser) | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      // 查对应创建者信息
 | 
				
			|||
      const corUsers = await ctx.app.fs.authRequest.get(`user/${[...createUserIds].join(',') || -1}/message`, { query: { token } }) | 
				
			|||
      for (let { dataValues: mirror } of mirrorRes) { | 
				
			|||
         const corUser = corUsers.find(u => u.id == mirror.createUser) | 
				
			|||
         mirror.createUser = corUser ? corUser.username : '' | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      ctx.status = 200; | 
				
			|||
      ctx.body = mirrorRes | 
				
			|||
   } catch (error) { | 
				
			|||
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | 
				
			|||
      ctx.status = 400; | 
				
			|||
      ctx.body = { | 
				
			|||
         message: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
async function get (ctx) { | 
				
			|||
   try { | 
				
			|||
      // 下次这样的关关联联要用数据库关联 !!!
 | 
				
			|||
      // 不然逻辑好绕啊
 | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId } = ctx.fs.api | 
				
			|||
      const { mid } = ctx.params | 
				
			|||
      // 查当前镜像的全部信息
 | 
				
			|||
      const mirrorRes = await models.Mirror.findOne({ | 
				
			|||
         attributes: { | 
				
			|||
            exclude: ['createUser'] | 
				
			|||
         }, | 
				
			|||
         order: [['id', 'ASC']], | 
				
			|||
         where: { | 
				
			|||
            mid: mid | 
				
			|||
         }, | 
				
			|||
         include: [{ | 
				
			|||
            model: models.MirrorTree, | 
				
			|||
            required: false | 
				
			|||
         }, { | 
				
			|||
            model: models.MirrorFilterGroup, | 
				
			|||
            attributes: { | 
				
			|||
               exclude: ['mirrorId'] | 
				
			|||
            }, | 
				
			|||
            required: false, | 
				
			|||
            include: [{ | 
				
			|||
               model: models.MirrorFilter, | 
				
			|||
               attributes: { | 
				
			|||
                  exclude: ['groupId'] | 
				
			|||
               }, | 
				
			|||
               required: false | 
				
			|||
            }] | 
				
			|||
         }, { | 
				
			|||
            model: models.MirrorCamera, | 
				
			|||
            required: false, | 
				
			|||
            include: { | 
				
			|||
               model: models.Camera, | 
				
			|||
               attributes: { | 
				
			|||
                  exclude: ['rtmp', 'venderId', 'createTime', 'recycleTime', 'delete', 'createUserId', 'nvrId', 'kindId', 'yingshiSecretId', 'gbId'] | 
				
			|||
               }, | 
				
			|||
               include: [{ | 
				
			|||
                  model: models.SecretYingshi, | 
				
			|||
                  attributes: ['token'] | 
				
			|||
               }, { | 
				
			|||
                  model: models.GbCamera, | 
				
			|||
                  attributes: ['id', 'online', 'playUrl',], | 
				
			|||
                  required: false | 
				
			|||
               }, { | 
				
			|||
                  model: models.CameraRemark, | 
				
			|||
                  attributes: ['remark'], | 
				
			|||
                  order: [ | 
				
			|||
                     ['id', 'DESC'] | 
				
			|||
                  ], | 
				
			|||
               }] | 
				
			|||
            } | 
				
			|||
         }] | 
				
			|||
      }) | 
				
			|||
 | 
				
			|||
      let returnData | 
				
			|||
      if (mirrorRes) { | 
				
			|||
         const { mirrorCameras, mirrorFilterGroups, mirrorTrees } = mirrorRes.dataValues | 
				
			|||
         returnData = { | 
				
			|||
            ...mirrorRes.dataValues, | 
				
			|||
            tree: [], | 
				
			|||
            filterGroup: [] | 
				
			|||
         } | 
				
			|||
 | 
				
			|||
         // 反向构建出树节点
 | 
				
			|||
         const buildTree = (treeNodes = [], lastLevelKey = '') => { | 
				
			|||
            const nextKeyPre = lastLevelKey ? lastLevelKey + '-' : lastLevelKey | 
				
			|||
            treeNodes.forEach((tn, index) => { | 
				
			|||
               const curKey = nextKeyPre + index | 
				
			|||
               let child = JSON.parse(JSON.stringify(mirrorTrees.filter(mt => mt.dependence == tn.id))) | 
				
			|||
               let cameras = mirrorCameras.filter(mc => mc.treeIds.includes(tn.id)) | 
				
			|||
               if (cameras) { | 
				
			|||
                  // 有摄像头 向下再创建一级节点
 | 
				
			|||
                  tn.children = cameras.map((c, cIndex) => { | 
				
			|||
                     return { | 
				
			|||
                        label: c.dataValues.camera.name, | 
				
			|||
                        key: curKey + '-' + cIndex, | 
				
			|||
                        cameraId: c.dataValues.cameraId, | 
				
			|||
                        camera: c.dataValues.camera | 
				
			|||
                     } | 
				
			|||
                  }) | 
				
			|||
               } else { | 
				
			|||
                  tn.children = child | 
				
			|||
                  buildTree(child, curKey) | 
				
			|||
               } | 
				
			|||
               tn.label = tn.name | 
				
			|||
               tn.key = curKey | 
				
			|||
 | 
				
			|||
               delete tn.name | 
				
			|||
               delete tn.level | 
				
			|||
               delete tn.dependence | 
				
			|||
               delete tn.mirrorId | 
				
			|||
            }) | 
				
			|||
         } | 
				
			|||
         let tree = JSON.parse(JSON.stringify(mirrorTrees.filter(t => t.level == 1))) | 
				
			|||
         buildTree(tree) | 
				
			|||
         returnData.tree = tree | 
				
			|||
 | 
				
			|||
         // 构建筛选分组及筛选项
 | 
				
			|||
         for (let { dataValues: g } of mirrorFilterGroups) { | 
				
			|||
            for (let { dataValues: f } of g.mirrorFilters) { | 
				
			|||
               f.cameraIds = (mirrorCameras.filter(mc => mc.filterIds.includes(f.id)) || []).map(mc => mc.cameraId) | 
				
			|||
            } | 
				
			|||
            g.filters = g.mirrorFilters | 
				
			|||
            delete g.mirrorFilters | 
				
			|||
         } | 
				
			|||
         returnData.filterGroup = mirrorFilterGroups | 
				
			|||
 | 
				
			|||
         delete returnData.mirrorCameras | 
				
			|||
         delete returnData.mirrorFilterGroups | 
				
			|||
         delete returnData.mirrorTrees | 
				
			|||
      } else { | 
				
			|||
         throw '没有查询到对应的镜像服务' | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      ctx.status = 200; | 
				
			|||
      ctx.body = returnData | 
				
			|||
   } catch (error) { | 
				
			|||
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | 
				
			|||
      ctx.status = 400; | 
				
			|||
      ctx.body = { | 
				
			|||
         message: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
async function del (ctx) { | 
				
			|||
   const transaction = await ctx.fs.dc.orm.transaction(); | 
				
			|||
   try { | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId } = ctx.fs.api | 
				
			|||
      const { mirrorId } = ctx.params | 
				
			|||
 | 
				
			|||
      if (!mirrorId) throw '镜像服务删除失败'; | 
				
			|||
 | 
				
			|||
      const sequelize = ctx.fs.dc.orm; | 
				
			|||
      // 除 Mirror 外的信息全删除并重建
 | 
				
			|||
      await models.MirrorCamera.destroy({ | 
				
			|||
         where: { | 
				
			|||
            mirrorId: mirrorId | 
				
			|||
         }, | 
				
			|||
         transaction | 
				
			|||
      }) | 
				
			|||
      await sequelize.query('DELETE FROM mirror_filter WHERE group_id IN (SELECT id FROM mirror_filter_group WHERE mirror_id=?)', { | 
				
			|||
         replacements: [mirrorId], | 
				
			|||
         transaction | 
				
			|||
      }) | 
				
			|||
      await models.MirrorFilterGroup.destroy({ | 
				
			|||
         where: { | 
				
			|||
            mirrorId: mirrorId | 
				
			|||
         }, | 
				
			|||
         transaction | 
				
			|||
      }) | 
				
			|||
      await models.MirrorTree.destroy({ | 
				
			|||
         where: { | 
				
			|||
            mirrorId: mirrorId | 
				
			|||
         }, | 
				
			|||
         transaction | 
				
			|||
      }) | 
				
			|||
      await models.Mirror.destroy({ | 
				
			|||
         where: { | 
				
			|||
            id: mirrorId | 
				
			|||
         }, | 
				
			|||
         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: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
async function publish (ctx) { | 
				
			|||
   try { | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId } = ctx.fs.api | 
				
			|||
      const { mirrorId } = ctx.params | 
				
			|||
 | 
				
			|||
      if (!mirrorId) throw '发布镜像服务失败'; | 
				
			|||
 | 
				
			|||
      await models.Mirror.update({ | 
				
			|||
         publish: true, | 
				
			|||
         publishTime: moment().format() | 
				
			|||
      }, { | 
				
			|||
         where: { | 
				
			|||
            id: mirrorId | 
				
			|||
         } | 
				
			|||
      }) | 
				
			|||
 | 
				
			|||
      ctx.status = 204; | 
				
			|||
   } catch (error) { | 
				
			|||
      ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); | 
				
			|||
      ctx.status = 400; | 
				
			|||
      ctx.body = { | 
				
			|||
         message: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
async function copy (ctx) { | 
				
			|||
   const transaction = await ctx.fs.dc.orm.transaction(); | 
				
			|||
   try { | 
				
			|||
      const { models } = ctx.fs.dc; | 
				
			|||
      const { userId } = ctx.fs.api | 
				
			|||
      const { mirrorId } = ctx.params | 
				
			|||
      const timeNow = moment() | 
				
			|||
      // 查当前镜像的全部信息
 | 
				
			|||
      const mirrorRes = await models.Mirror.findOne({ | 
				
			|||
         attributes: { | 
				
			|||
            exclude: ['createUser'] | 
				
			|||
         }, | 
				
			|||
         order: [['id', 'ASC']], | 
				
			|||
         where: { | 
				
			|||
            id: mirrorId | 
				
			|||
         }, | 
				
			|||
         include: [{ | 
				
			|||
            model: models.MirrorTree, | 
				
			|||
            required: false | 
				
			|||
         }, { | 
				
			|||
            model: models.MirrorFilterGroup, | 
				
			|||
            required: false, | 
				
			|||
            include: [{ | 
				
			|||
               model: models.MirrorFilter, | 
				
			|||
               required: false | 
				
			|||
            }] | 
				
			|||
         }, { | 
				
			|||
            model: models.MirrorCamera, | 
				
			|||
            required: false, | 
				
			|||
         }] | 
				
			|||
      }) | 
				
			|||
 | 
				
			|||
      if (mirrorRes) { | 
				
			|||
         const { mirrorCameras, mirrorFilterGroups, mirrorTrees } = mirrorRes.dataValues | 
				
			|||
 | 
				
			|||
         const newMirrorRes = await models.Mirror.create({ | 
				
			|||
            template: mirrorRes.template, | 
				
			|||
            createUser: userId, | 
				
			|||
            createTime: timeNow.format(), | 
				
			|||
            title: data.title, | 
				
			|||
            showHeader: mirrorRes.showHeader, | 
				
			|||
            publish: mirrorRes.publish, | 
				
			|||
            mid: timeNow.format(`ssmmHHDDMMYYYY`) | 
				
			|||
         }, { | 
				
			|||
            transaction | 
				
			|||
         }) | 
				
			|||
 | 
				
			|||
         const newMirrorId = newMirrorRes.id | 
				
			|||
         let cameraStorage = {} | 
				
			|||
         let treeLevelOne = mirrorTrees.filter(mt => mt.level == 1) | 
				
			|||
 | 
				
			|||
         const storageTree = (node) => { | 
				
			|||
            for (let n of node) { | 
				
			|||
                | 
				
			|||
            } | 
				
			|||
         } | 
				
			|||
         storageTree(treeLevelOne) | 
				
			|||
 | 
				
			|||
         for (let { dataValues: mt } of mirrorTrees) { | 
				
			|||
            const newTreeNodeStorageRes = await models.MirrorTree.create({ | 
				
			|||
               name: c.label, | 
				
			|||
               level: curLevel, | 
				
			|||
               dependence: lastNodeStorageId, | 
				
			|||
               mirrorId: mirrorId_ | 
				
			|||
            }) | 
				
			|||
            let corCamera = mirrorCameras.filter((mc) => { mc.treeIds.includes(mt.id) }) | 
				
			|||
            for (let c of corCamera) { | 
				
			|||
               if (cameraStorage[c.cameraId]) { | 
				
			|||
                  cameraStorage[c.cameraId].treeIds.push(lastNodeStorageId) | 
				
			|||
               } else { | 
				
			|||
                  cameraStorage[c.cameraId] = { | 
				
			|||
                     treeIds: [lastNodeStorageId], | 
				
			|||
                     filterIds: [] | 
				
			|||
                  } | 
				
			|||
               } | 
				
			|||
            } | 
				
			|||
         } | 
				
			|||
 | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      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: typeof error == 'string' ? error : undefined | 
				
			|||
      } | 
				
			|||
   } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
module.exports = { | 
				
			|||
   edit, | 
				
			|||
   list, | 
				
			|||
   get, | 
				
			|||
   del, | 
				
			|||
   publish, | 
				
			|||
   copy, | 
				
			|||
}; | 
				
			|||
@ -0,0 +1,23 @@ | 
				
			|||
'use strict'; | 
				
			|||
 | 
				
			|||
const mirror = require('../../controllers/mirror'); | 
				
			|||
 | 
				
			|||
module.exports = function (app, router, opts) { | 
				
			|||
   app.fs.api.logAttr['PUT/mirror'] = { content: '编辑镜像信息', visible: false }; | 
				
			|||
   router.put('/mirror', mirror.edit); | 
				
			|||
 | 
				
			|||
   app.fs.api.logAttr['GET/mirror/list'] = { content: '获取镜像信息列表', visible: false }; | 
				
			|||
   router.get('/mirror/list', mirror.list); | 
				
			|||
 | 
				
			|||
   app.fs.api.logAttr['GET/mirror/:mid'] = { content: '获取指定镜像信息', visible: false }; | 
				
			|||
   router.get('/mirror/:mid', mirror.get); | 
				
			|||
 | 
				
			|||
   app.fs.api.logAttr['DEL/mirror/:mirrorId'] = { content: '删除镜像信息', visible: false }; | 
				
			|||
   router.del('/mirror/:mirrorId', mirror.del); | 
				
			|||
 | 
				
			|||
   app.fs.api.logAttr['PUT/mirror/:mirrorId/publish'] = { content: '发布镜像信息', visible: false }; | 
				
			|||
   router.put('/mirror/:mirrorId/publish', mirror.publish); | 
				
			|||
 | 
				
			|||
   app.fs.api.logAttr['PUT/mirror/:mirrorId/copy'] = { content: '复制镜像信息', visible: false }; | 
				
			|||
   router.put('/mirror/:mirrorId/copy', mirror.copy); | 
				
			|||
}; | 
				
			|||
					Loading…
					
					
				
		Reference in new issue