update: 视频设备组件替换

This commit is contained in:
JiangQiming 2023-03-08 15:30:06 +08:00
parent dfdfbb30bd
commit 749127730e
7 changed files with 200 additions and 200 deletions

View File

@ -1,6 +1,6 @@
<!-- 视频设备 - 播放 -->
<template>
<a-modal
<j-modal
v-model:visible="_vis"
title="播放"
cancelText="取消"
@ -33,17 +33,17 @@
/>
</div>
<div class="media-live-tool">
<a-radio-group
<j-radio-group
v-model:value="mediaType"
button-style="solid"
@change="mediaStart"
>
<a-radio-button value="mp4">MP4</a-radio-button>
<a-radio-button value="flv">FLV</a-radio-button>
<a-radio-button value="m3u8">HLS</a-radio-button>
</a-radio-group>
<j-radio-button value="mp4">MP4</j-radio-button>
<j-radio-button value="flv">FLV</j-radio-button>
<j-radio-button value="m3u8">HLS</j-radio-button>
</j-radio-group>
</div>
</a-modal>
</j-modal>
</template>
<script setup lang="ts">

View File

@ -1,6 +1,6 @@
<!-- Modal 弹窗用于新增修改数据 -->
<template>
<a-modal
<j-modal
v-model:visible="_vis"
:title="!!formData.id ? '编辑' : '新增'"
width="650px"
@ -9,10 +9,10 @@
@ok="handleSubmit"
@cancel="handleCancel"
>
<a-form ref="formRef" :model="formData" layout="vertical">
<a-row :gutter="10">
<a-col :span="12">
<a-form-item
<j-form ref="formRef" :model="formData" layout="vertical">
<j-row :gutter="10">
<j-col :span="12">
<j-form-item
name="channelId"
:rules="[
{
@ -26,22 +26,22 @@
>
<template #label>
通道ID
<a-tooltip title="若不填写系统将自动生成唯一ID">
<j-tooltip title="若不填写系统将自动生成唯一ID">
<AIcon
type="QuestionCircleOutlined"
style="margin-left: 2px"
/>
</a-tooltip>
</j-tooltip>
</template>
<a-input
<j-input
v-model:value="formData.channelId"
:disabled="!!formData.id"
placeholder="请输入通道ID"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item
</j-form-item>
</j-col>
<j-col :span="12">
<j-form-item
name="name"
label="通道名称"
:rules="[
@ -49,14 +49,14 @@
{ max: 64, message: '最多可输入64个字符' },
]"
>
<a-input
<j-input
v-model:value="formData.name"
placeholder="请输入通道名称"
/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item
</j-form-item>
</j-col>
<j-col :span="24">
<j-form-item
name="media_url"
:rules="[
{ required: true, message: '请输入视频地址' },
@ -65,66 +65,66 @@
>
<template #label>
视频地址
<a-tooltip
<j-tooltip
title="不同厂家的RTSP固定地址规则不同请按对应厂家的规则填写"
>
<AIcon
type="QuestionCircleOutlined"
style="margin-left: 2px"
/>
</a-tooltip>
</j-tooltip>
</template>
<a-input
<j-input
v-model:value="formData.media_url"
placeholder="请输入视频地址"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item
</j-form-item>
</j-col>
<j-col :span="12">
<j-form-item
name="media_username"
label="用户名"
:rules="{ max: 64, message: '最多可输入64个字符' }"
>
<a-input
<j-input
v-model:value="formData.media_username"
placeholder="请输入用户名"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item
</j-form-item>
</j-col>
<j-col :span="12">
<j-form-item
name="media_password"
label="密码"
:rules="{ max: 64, message: '最多可输入64个字符' }"
>
<a-input-password
<j-input-password
v-model:value="formData.media_password"
placeholder="请输入密码"
/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item name="address" label="安装地址">
<a-input
</j-form-item>
</j-col>
<j-col :span="24">
<j-form-item name="address" label="安装地址">
<j-input
v-model:value="formData.address"
placeholder="请输入安装地址"
/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item name="description" label="说明">
<a-textarea
</j-form-item>
</j-col>
<j-col :span="24">
<j-form-item name="description" label="说明">
<j-textarea
v-model:value="formData.description"
:rows="4"
:maxlength="200"
showCount
/>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-modal>
</j-form-item>
</j-col>
</j-row>
</j-form>
</j-modal>
</template>
<script setup lang="ts">

View File

@ -19,62 +19,62 @@
model="table"
>
<template #headerTitle>
<a-tooltip
<j-tooltip
v-if="route?.query.type === 'gb28181-2016'"
title="接入方式为GB/T28281时不支持新增"
>
<a-button type="primary" disabled> 新增 </a-button>
</a-tooltip>
<a-button type="primary" @click="handleAdd" v-else>
<j-button type="primary" disabled> 新增 </j-button>
</j-tooltip>
<j-button type="primary" @click="handleAdd" v-else>
新增
</a-button>
</j-button>
</template>
<template #status="slotProps">
<a-space>
<a-badge
<j-space>
<j-badge
:status="
slotProps.status.value === 'online'
? 'success'
: 'error'
"
:text="slotProps.status.text"
></a-badge>
</a-space>
></j-badge>
</j-space>
</template>
<template #action="slotProps">
<a-space :size="16">
<a-tooltip
<j-space :size="16">
<j-tooltip
v-for="i in getActions(slotProps, 'table')"
:key="i.key"
v-bind="i.tooltip"
>
<a-popconfirm
<j-popconfirm
v-if="i.popConfirm"
v-bind="i.popConfirm"
:disabled="i.disabled"
>
<a-button
<j-button
:disabled="i.disabled"
style="padding: 0"
type="link"
><AIcon :type="i.icon"
/></a-button>
</a-popconfirm>
<a-button
/></j-button>
</j-popconfirm>
<j-button
style="padding: 0"
type="link"
v-else
@click="i.onClick && i.onClick(slotProps)"
>
<a-button
<j-button
:disabled="i.disabled"
style="padding: 0"
type="link"
><AIcon :type="i.icon"
/></a-button>
</a-button>
</a-tooltip>
</a-space>
/></j-button>
</j-button>
</j-tooltip>
</j-space>
</template>
</JProTable>

View File

@ -53,14 +53,14 @@
/>
</div>
<div class="playback-right">
<a-spin :spinning="loading">
<a-tooltip placement="topLeft">
<j-spin :spinning="loading">
<j-tooltip placement="topLeft">
<template #title>
<div>云端存储在服务器中</div>
<div>本地存储在设备本地</div>
</template>
<div>类型: <AIcon type="QuestionCircleOutlined" /></div>
</a-tooltip>
</j-tooltip>
<RadioCard
layout="horizontal"
:options="[
@ -80,11 +80,11 @@
v-model="type"
/>
<div class="playback-calendar">
<a-calendar
<j-calendar
v-model:value="time"
:fullscreen="false"
:disabledDate="
(currentDate) => currentDate > dayjs(new Date())
(currentDate: Dayjs) => currentDate > dayjs(new Date())
"
@change="handlePanelChange"
/>
@ -93,20 +93,20 @@
class="playback-list"
:class="{ 'no-list': !historyList.length }"
>
<a-empty
<j-empty
v-if="!historyList.length"
description="暂无数据"
/>
<a-list
<j-list
v-else
class="playback-list-items"
itemLayout="horizontal"
:dataSource="historyList"
>
<template #renderItem="{ item }">
<a-list-item>
<j-list-item>
<template #actions>
<a-tooltip
<j-tooltip
key="play-btn"
:title="
(item.startTime ||
@ -136,8 +136,8 @@
"
/>
</a>
</a-tooltip>
<a-tooltip
</j-tooltip>
<j-tooltip
key="download"
:title="
type !== 'local'
@ -155,7 +155,7 @@
() => downloadClick(item)
"
/>
</a-tooltip>
</j-tooltip>
</template>
<div>
@ -173,12 +173,12 @@
).format('HH:mm:ss')
}}
</div>
</a-list-item>
</j-list-item>
</template>
<div></div>
</a-list>
</j-list>
</div>
</a-spin>
</j-spin>
</div>
</div>
</page-container>

View File

@ -1,5 +1,5 @@
<template>
<a-modal
<j-modal
v-model:visible="_vis"
title="快速添加"
cancelText="取消"
@ -9,38 +9,38 @@
:confirmLoading="btnLoading"
width="660px"
>
<a-form layout="vertical">
<a-form-item label="产品名称" v-bind="validateInfos.name">
<a-input
<j-form layout="vertical">
<j-form-item label="产品名称" v-bind="validateInfos.name">
<j-input
v-model:value="formData.name"
placeholder="请输入名称"
/>
</a-form-item>
</j-form-item>
<template v-if="channel === 'gb28181-2016' && formData.accessId">
<a-form-item
<j-form-item
label="接入密码"
v-bind="validateInfos['configuration.access_pwd']"
>
<a-input-password
<j-input-password
v-model:value="formData.configuration.access_pwd"
placeholder="请输入接入密码"
/>
</a-form-item>
<a-form-item label="流传输模式">
<a-select
</j-form-item>
<j-form-item label="流传输模式">
<j-select
v-model:value="formData.configuration.stream_mode"
placeholder="请选择流传输模式"
:options="streamMode"
/>
</a-form-item>
</j-form-item>
</template>
<a-form-item label="接入网关" v-bind="validateInfos.accessId">
<j-form-item label="接入网关" v-bind="validateInfos.accessId">
<div class="gateway-box">
<div v-if="!gatewayList.length">
暂无数据请先
<a-button type="link">
<j-button type="link">
添加{{ providerType[props.channel] }} 接入网关
</a-button>
</j-button>
</div>
<div
class="gateway-item"
@ -71,20 +71,20 @@
{{ item.name }}
</h3>
<div class="desc">{{ item.description }}</div>
<a-row v-if="props.channel === 'gb28181-2016'">
<a-col :span="12">
<j-row v-if="props.channel === 'gb28181-2016'">
<j-col :span="12">
{{ item.channelInfo?.name }}
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
{{ item.protocolDetail.name }}
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
<p
v-for="(i, idx) in item.channelInfo
?.addresses"
:key="`${i.address}_address${idx}`"
>
<a-badge
<j-badge
:text="i.address"
:color="
i.health === -1
@ -93,10 +93,10 @@
"
/>
</p>
</a-col>
</a-row>
<a-row v-else>
<a-col :span="24">
</j-col>
</j-row>
<j-row v-else>
<j-col :span="24">
<div class="subtitle">
{{ item.protocolDetail.name }}
</div>
@ -105,15 +105,15 @@
item.protocolDetail.description
}}
</p>
</a-col>
</a-row>
</j-col>
</j-row>
</template>
</CardBox>
</div>
</div>
</a-form-item>
</a-form>
</a-modal>
</j-form-item>
</j-form>
</j-modal>
</template>
<script setup lang="ts">

View File

@ -1,11 +1,11 @@
<!-- 视频设备新增/编辑 -->
<template>
<page-container>
<a-card>
<a-row :gutter="24">
<a-col :span="12">
<a-form layout="vertical">
<a-form-item
<j-card>
<j-row :gutter="24">
<j-col :span="12">
<j-form layout="vertical">
<j-form-item
label="接入方式"
v-bind="validateInfos.channel"
>
@ -16,134 +16,134 @@
:disabled="!!route.query.id"
v-model="formData.channel"
/>
</a-form-item>
<a-row :gutter="24">
<a-col :span="8">
</j-form-item>
<j-row :gutter="24">
<j-col :span="8">
<JUpload
v-model:modelValue="formData.photoUrl"
:bgImage="formData.photoUrl"
/>
</a-col>
<a-col :span="16">
<a-form-item
</j-col>
<j-col :span="16">
<j-form-item
label="ID"
v-bind="validateInfos.id"
>
<a-input
<j-input
v-model:value="formData.id"
placeholder="请输入"
:disabled="!!route.query.id"
/>
</a-form-item>
<a-form-item
</j-form-item>
<j-form-item
label="设备名称"
v-bind="validateInfos.name"
>
<a-input
<j-input
v-model:value="formData.name"
placeholder="请输入名称"
/>
</a-form-item>
</a-col>
</a-row>
<a-form-item
</j-form-item>
</j-col>
</j-row>
<j-form-item
label="所属产品"
v-bind="validateInfos.productId"
>
<a-row :gutter="[0, 10]">
<a-col :span="!!route.query.id ? 24 : 22">
<a-select
<j-row :gutter="[0, 10]">
<j-col :span="!!route.query.id ? 24 : 22">
<j-select
v-model:value="formData.productId"
placeholder="请选择所属产品"
:disabled="!!route.query.id"
>
<a-select-option
<j-select-option
v-for="(item, index) in productList"
:key="index"
:value="item.id"
>
{{ item.name }}
</a-select-option>
</a-select>
</a-col>
<a-col :span="2" v-if="!route.query.id">
<a-button
</j-select-option>
</j-select>
</j-col>
<j-col :span="2" v-if="!route.query.id">
<j-button
type="link"
@click="saveProductVis = true"
>
<AIcon type="PlusOutlined" />
</a-button>
</a-col>
</a-row>
</a-form-item>
<a-form-item
</j-button>
</j-col>
</j-row>
</j-form-item>
<j-form-item
label="接入密码"
v-bind="validateInfos['others.access_pwd']"
v-if="formData.channel === 'gb28181-2016'"
>
<a-input-password
<j-input-password
v-model:value="formData.others.access_pwd"
placeholder="请输入接入密码"
/>
</a-form-item>
</j-form-item>
<template v-if="!!route.query.id">
<a-form-item
<j-form-item
label="流传输模式"
v-bind="validateInfos.streamMode"
>
<a-radio-group
<j-radio-group
button-style="solid"
v-model:value="formData.streamMode"
>
<a-radio-button value="UDP">
<j-radio-button value="UDP">
UDP
</a-radio-button>
<a-radio-button value="TCP_PASSIVE">
</j-radio-button>
<j-radio-button value="TCP_PASSIVE">
TCP被动
</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="设备厂商">
<a-input
</j-radio-button>
</j-radio-group>
</j-form-item>
<j-form-item label="设备厂商">
<j-input
v-model:value="formData.manufacturer"
placeholder="请输入设备厂商"
/>
</a-form-item>
<a-form-item label="设备型号">
<a-input
</j-form-item>
<j-form-item label="设备型号">
<j-input
v-model:value="formData.model"
placeholder="请输入设备型号"
/>
</a-form-item>
<a-form-item label="固件版本">
<a-input
</j-form-item>
<j-form-item label="固件版本">
<j-input
v-model:value="formData.firmware"
placeholder="请输入固件版本"
/>
</a-form-item>
</j-form-item>
</template>
<a-form-item label="说明">
<a-textarea
<j-form-item label="说明">
<j-textarea
v-model:value="formData.description"
show-count
:maxlength="200"
:rows="5"
placeholder="请输入说明"
/>
</a-form-item>
<a-form-item>
<a-button
</j-form-item>
<j-form-item>
<j-button
type="primary"
@click="handleSubmit"
:loading="btnLoading"
>
保存
</a-button>
</a-form-item>
</a-form>
</a-col>
<a-col :span="12">
</j-button>
</j-form-item>
</j-form>
</j-col>
<j-col :span="12">
<div v-if="1" class="doc" style="height: 800">
<h1>1.概述</h1>
<div>
@ -166,7 +166,7 @@
各个厂家不同设备型号的设备端配置页面布局存在差异但配置项基本大同小异此处以大华摄像头为例作为接入配置示例
</div>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/media/doc1.png')"
/>
@ -177,7 +177,7 @@
SIP域通常为SIP服务器编号的前10位
</div>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/media/doc2.png')"
/>
@ -187,7 +187,7 @@
SIP服务器IP/端口填入该设备所属产品-接入方式页面中连接信息的IP/端口
</div>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/media/doc3.png')"
/>
@ -201,7 +201,7 @@
填入该设备所属产品-接入方式页面中GB28281配置处的接入密码
</div>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/media/doc4.png')"
/>
@ -230,9 +230,9 @@
只能选择接入方式为固定地址的产品若当前无对应产品可点击右侧快速添加按钮填写产品名称和选择固定地址类型的网关完成产品创建
</div>
</div>
</a-col>
</a-row>
</a-card>
</j-col>
</j-row>
</j-card>
<SaveProduct
v-model:visible="saveProductVis"
@ -285,7 +285,7 @@ const formRules = ref({
},
{ max: 64, message: '最多输入64个字符' },
{
pattern: /^[a-zA-Z0-9_\-]+$/,
pattern: /^[j-zA-Z0-9_\-]+$/,
message: '请输入英文或者数字或者-或者_',
},
],

View File

@ -44,30 +44,30 @@
<h3 class="card-item-content-title">
{{ slotProps.name }}
</h3>
<a-row>
<a-col :span="12">
<j-row>
<j-col :span="12">
<div class="card-item-content-text">厂商</div>
<div>{{ slotProps.manufacturer }}</div>
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
<div class="card-item-content-text">
通道数量
</div>
<div>{{ slotProps.channelNumber }}</div>
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
<div class="card-item-content-text">型号</div>
<div>{{ slotProps.model }}</div>
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
<div class="card-item-content-text">
接入方式
</div>
<div>
{{ providerType[slotProps.provider] }}
</div>
</a-col>
</a-row>
</j-col>
</j-row>
</template>
<template #actions="item">
<PermissionButton
@ -92,7 +92,7 @@
</CardBox>
</template>
<template #action="slotProps">
<a-space :size="16">
<j-space :size="16">
<template
v-for="i in getActions(slotProps, 'table')"
:key="i.key"
@ -111,7 +111,7 @@
<template #icon><AIcon :type="i.icon" /></template>
</PermissionButton>
</template>
</a-space>
</j-space>
</template>
</JProTable>
</page-container>