Merge branch 'master' of http://47.115.223.229:8888/yangjun/nursing_unit_vue
This commit is contained in:
commit
3e1297b8f0
|
@ -196,24 +196,28 @@
|
||||||
.jeecg-menu-item-active:not(.jeecg-menu-submenu) {
|
.jeecg-menu-item-active:not(.jeecg-menu-submenu) {
|
||||||
color: white !important;
|
color: white !important;
|
||||||
background-color: #1890ff !important;
|
background-color: #1890ff !important;
|
||||||
border-radius: 5px;
|
border-radius: 8px;
|
||||||
margin: 10px 20px;
|
margin: 0px 20px 0 20px;
|
||||||
padding: 10px;
|
}
|
||||||
|
|
||||||
|
.jeecg-menu-vertical .jeecg-menu-item:hover, .jeecg-menu-vertical .jeecg-menu-submenu-title:hover {
|
||||||
|
color: #fff !important;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #c9cacc;
|
||||||
|
margin: 10px 20px 0 20px;
|
||||||
}
|
}
|
||||||
// .jeecg-menu {
|
|
||||||
// background: #fbfbfd;
|
|
||||||
// position: relative;
|
|
||||||
// display: block;
|
|
||||||
// width: 100%;
|
|
||||||
// padding: 0;
|
|
||||||
// margin: 0;
|
|
||||||
// font-size: 14px;
|
|
||||||
// color: rgba(0, 0, 0, 0.88);
|
|
||||||
// list-style: none;
|
|
||||||
// outline: none;
|
|
||||||
// border-radius: 5px;
|
|
||||||
// }
|
|
||||||
.jeecg-menu-light.jeecg-menu-vertical .jeecg-menu-item-active.jeecg-menu-submenu {
|
.jeecg-menu-light.jeecg-menu-vertical .jeecg-menu-item-active.jeecg-menu-submenu {
|
||||||
|
color: #606266 !important;
|
||||||
background: #f0f0f0;
|
background: #f0f0f0;
|
||||||
|
|
||||||
|
}
|
||||||
|
.jeecg-menu-vertical .jeecg-menu-item, .jeecg-menu-vertical .jeecg-menu-submenu-title {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 8px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -504,7 +504,7 @@
|
||||||
padding: 24px 10px 0px 10px;
|
padding: 24px 10px 0px 10px;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
background-color: @component-background;
|
background-color: @component-background;
|
||||||
border-radius: 5px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -523,7 +523,7 @@
|
||||||
.ant-table-wrapper {
|
.ant-table-wrapper {
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
background-color: @component-background;
|
background-color: @component-background;
|
||||||
border-radius: 5px;
|
border-radius: 8px;
|
||||||
|
|
||||||
.ant-table-title {
|
.ant-table-title {
|
||||||
min-height: 40px;
|
min-height: 40px;
|
||||||
|
@ -624,4 +624,7 @@
|
||||||
}
|
}
|
||||||
// update-end--author:liaozhiyang---date:20240604---for:【TV360X-377】关联记录必填影响到了table的输入框和页码样式
|
// update-end--author:liaozhiyang---date:20240604---for:【TV360X-377】关联记录必填影响到了table的输入框和页码样式
|
||||||
}
|
}
|
||||||
|
.ant-table-wrapper .ant-table.ant-table-middle .ant-table-tbody > tr > td{
|
||||||
|
padding: 8px 8px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -7,9 +7,44 @@
|
||||||
// &.ant-btn-error:not(.ant-btn-link),
|
// &.ant-btn-error:not(.ant-btn-link),
|
||||||
// &.ant-btn-warning:not(.ant-btn-link),
|
// &.ant-btn-warning:not(.ant-btn-link),
|
||||||
&.ant-btn-primary:not(.ant-btn-link) {
|
&.ant-btn-primary:not(.ant-btn-link) {
|
||||||
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
|
// box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
|
||||||
background: linear-gradient(to right, #1ea1fb, #0480e7);
|
// background: linear-gradient(to right, #1ea1fb, #017de9);
|
||||||
|
|
||||||
|
// align-items: center;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: linear-gradient(to right,#1ea0fa , #017de9);
|
||||||
|
// border: 1px solid #fff;
|
||||||
|
// color: #fff;
|
||||||
|
// position: relative; /* needed for pseudo-element */
|
||||||
|
overflow: hidden; /* clip the animated stripe */
|
||||||
|
// height: 34px;
|
||||||
}
|
}
|
||||||
|
&.ant-btn-primary:not(.ant-btn-link)::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255,255,255,0.4) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
transform: skewX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ant-btn-primary:not(.ant-btn-link):hover::before {
|
||||||
|
animation: light-sweep 1.5s forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes light-sweep {
|
||||||
|
to {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// &-group {
|
// &-group {
|
||||||
// .ant-btn:not(:first-child) {
|
// .ant-btn:not(:first-child) {
|
||||||
// bottom: 1px;
|
// bottom: 1px;
|
||||||
|
@ -322,3 +357,51 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.ant-btn-default {
|
||||||
|
border-radius: 8px !important;
|
||||||
|
color: white;
|
||||||
|
background: linear-gradient(to right,#1ea0fa , #017de9);
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
:where(.css-dev-only-do-not-override-9m98ij).ant-btn-default:not(:disabled):hover {
|
||||||
|
color: white;
|
||||||
|
border-color: white;
|
||||||
|
}
|
||||||
|
&.ant-btn-default:not(.ant-btn-link) {
|
||||||
|
border-radius: 8px;
|
||||||
|
color: white;
|
||||||
|
background: linear-gradient(to right,#1ea0fa , #017de9);
|
||||||
|
overflow: hidden; /* clip the animated stripe */
|
||||||
|
}
|
||||||
|
&.ant-btn-default:not(:disabled):hover {
|
||||||
|
color: white;
|
||||||
|
border-color: #40a9ff;
|
||||||
|
}
|
||||||
|
&.ant-btn-default:not(.ant-btn-link)::before {
|
||||||
|
content: '';
|
||||||
|
color: white;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: -100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(
|
||||||
|
90deg,
|
||||||
|
transparent 0%,
|
||||||
|
rgba(255,255,255,0.4) 50%,
|
||||||
|
transparent 100%
|
||||||
|
);
|
||||||
|
transform: skewX(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.ant-btn-default:not(.ant-btn-link):hover::before {
|
||||||
|
animation: light-sweep 1.5s forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes light-sweep {
|
||||||
|
to {
|
||||||
|
left: 100%;
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,11 +18,11 @@ export default {
|
||||||
totalField: 'total',
|
totalField: 'total',
|
||||||
},
|
},
|
||||||
// 可选的分页选项
|
// 可选的分页选项
|
||||||
pageSizeOptions: ['10', '50', '80', '100'],
|
pageSizeOptions: ['15', '50', '80', '100'],
|
||||||
// 表格默认尺寸
|
// 表格默认尺寸
|
||||||
defaultSize: 'middle',
|
defaultSize: 'middle',
|
||||||
//默认每页显示多少条
|
//默认每页显示多少条
|
||||||
defaultPageSize: 10,
|
defaultPageSize: 15,
|
||||||
// 默认排序方法
|
// 默认排序方法
|
||||||
defaultSortFn: (sortInfo: SorterResult) => {
|
defaultSortFn: (sortInfo: SorterResult) => {
|
||||||
//update-begin-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序
|
//update-begin-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
</div>
|
</div>
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
|
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
|
||||||
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
|
<a-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
|
||||||
<a-col :span="4">
|
<a-col :span="4">
|
||||||
<div class="bjclass">
|
<div class="bjclass">
|
||||||
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" @error="setDefaultImage"/>
|
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" @error="setDefaultImage"/>
|
||||||
|
@ -62,47 +62,6 @@
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
|
||||||
<!-- <a-col :span="6" v-for="(item,index) in dataList" :key="index">
|
|
||||||
<a-card :title="item.name +'/'+item.sex_dictText" class="cardClass">
|
|
||||||
<template #extra><a title="操作">
|
|
||||||
<a-popover title="功能" style="width: 300px;">
|
|
||||||
<template #content>
|
|
||||||
<div>
|
|
||||||
<span class="buttonMargin">
|
|
||||||
<a-button type="primary" @click="handleEdit(item)">编辑</a-button>
|
|
||||||
</span>
|
|
||||||
<span class="buttonMargin">
|
|
||||||
<a-button type="primary" @click="handleFwbq(item)">服务标签</a-button>
|
|
||||||
</span>
|
|
||||||
<span class="buttonMargin">
|
|
||||||
<a-button type="primary" @click="handleFpzh(item)">分配账号</a-button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<icon icon="ant-design:setting-outlined" />
|
|
||||||
</a-popover>
|
|
||||||
</a></template>
|
|
||||||
<a-row>
|
|
||||||
<a-col :span="8" style="padding: 0 8px;">
|
|
||||||
<img
|
|
||||||
width="100%"
|
|
||||||
:src="handleHeadPath(item.headPath)"
|
|
||||||
@error="setDefaultImage"
|
|
||||||
/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="16">
|
|
||||||
<p>入职日期: {{item.entryTime}}</p>
|
|
||||||
<p>身份证号: {{item.idCard}}</p>
|
|
||||||
<p>联系电话: {{item.tel}}</p>
|
|
||||||
<p>出生日期: {{item.dateOfBirth}}</p>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-card>
|
|
||||||
</a-col> -->
|
|
||||||
<!-- <a-col :span="24" style="text-align: right;">
|
|
||||||
<a-pagination v-model:current="current" v-model:page-size="pageSize" :total="total" show-less-items @change="onPageChange" />
|
|
||||||
</a-col> -->
|
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
|
<div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
|
||||||
|
@ -310,7 +269,7 @@ function onPageChange(page,pageSize){
|
||||||
.cardClass{
|
.cardClass{
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
// 添加向右下的阴影效果
|
// 添加向右下的阴影效果
|
||||||
border-radius: 5px;
|
border-radius: 8px;
|
||||||
transition: box-shadow 0.3s ease-in-out;
|
transition: box-shadow 0.3s ease-in-out;
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ import { defHttp } from '/@/utils/http/axios';
|
||||||
const employeesDataSource = ref<any[]>([]);
|
const employeesDataSource = ref<any[]>([]);
|
||||||
const tagsDetailData = ref<any[]>([]);
|
const tagsDetailData = ref<any[]>([]);
|
||||||
const employeesInfo = reactive<any>({});
|
const employeesInfo = reactive<any>({});
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
//注册model
|
//注册model
|
||||||
const [registerModal, {openModal}] = useModal();
|
const [registerModal, {openModal}] = useModal();
|
||||||
//注册table数据
|
//注册table数据
|
||||||
|
@ -191,11 +192,15 @@ import { defHttp } from '/@/utils/http/axios';
|
||||||
reload();
|
reload();
|
||||||
getEmployessServiceTagsList();
|
getEmployessServiceTagsList();
|
||||||
}
|
}
|
||||||
|
function submitForm(){
|
||||||
|
emit('ok');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
init,
|
init,
|
||||||
|
submitForm
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
|
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
|
||||||
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
|
<a-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
|
||||||
<a-col :span="4">
|
<a-col :span="4">
|
||||||
<div class="bjclass">
|
<div class="bjclass">
|
||||||
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" />
|
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" />
|
||||||
|
@ -297,7 +297,7 @@
|
||||||
.cardClass{
|
.cardClass{
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
// 添加向右下的阴影效果
|
// 添加向右下的阴影效果
|
||||||
border-radius: 5px;
|
border-radius: 8px;
|
||||||
transition: box-shadow 0.3s ease-in-out;
|
transition: box-shadow 0.3s ease-in-out;
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
|
||||||
|
|
||||||
|
|
|
@ -55,18 +55,18 @@ export const columns: BasicColumn[] = [
|
||||||
align: "center",
|
align: "center",
|
||||||
dataIndex: 'medicationId_dictText'
|
dataIndex: 'medicationId_dictText'
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
title: '物料图片',
|
// title: '物料图片',
|
||||||
align: "center",
|
// align: "center",
|
||||||
dataIndex: 'materialImg',
|
// dataIndex: 'materialImg',
|
||||||
customRender: render.renderImage,
|
// customRender: render.renderImage,
|
||||||
},
|
// },
|
||||||
{
|
// {
|
||||||
title: '物料标识',
|
// title: '物料标识',
|
||||||
align: "center",
|
// align: "center",
|
||||||
dataIndex: 'materialIdent',
|
// dataIndex: 'materialIdent',
|
||||||
customRender: render.renderImage,
|
// customRender: render.renderImage,
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
title: '是否启用',
|
title: '是否启用',
|
||||||
align: "center",
|
align: "center",
|
||||||
|
|
|
@ -74,7 +74,7 @@
|
||||||
<a-menu
|
<a-menu
|
||||||
v-model:openKeys="openKeys"
|
v-model:openKeys="openKeys"
|
||||||
v-model:selectedKeys="selectedKeys"
|
v-model:selectedKeys="selectedKeys"
|
||||||
style="height:720px;overflow-y:auto;overflow-x: hidden;"
|
style="height:700px;overflow-y:auto;overflow-x: hidden;"
|
||||||
mode="inline"
|
mode="inline"
|
||||||
>
|
>
|
||||||
<template v-for="(item2,key2) in treeChildData" >
|
<template v-for="(item2,key2) in treeChildData" >
|
||||||
|
@ -84,7 +84,7 @@
|
||||||
<span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span>
|
<span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<a-menu-item v-for="(item3,key3) in item2.children" :key="key3" style="height:50px;" >
|
<a-menu-item v-for="(item3,key3) in item2.children" :key="key3" style="height:50px;text-align:left;" >
|
||||||
<div @click="onSelect(item3)">
|
<div @click="onSelect(item3)">
|
||||||
<span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span>
|
<span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -50,12 +50,12 @@ export const columns: BasicColumn[] = [
|
||||||
align:"center",
|
align:"center",
|
||||||
dataIndex: 'wechartId'
|
dataIndex: 'wechartId'
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
title: '资质照片',
|
// title: '资质照片',
|
||||||
align:"center",
|
// align:"center",
|
||||||
dataIndex: 'imgPath',
|
// dataIndex: 'imgPath',
|
||||||
customRender:render.renderImage,
|
// customRender:render.renderImage,
|
||||||
},
|
// },
|
||||||
];
|
];
|
||||||
//查询数据
|
//查询数据
|
||||||
export const searchFormSchema: FormSchema[] = [
|
export const searchFormSchema: FormSchema[] = [
|
||||||
|
|
|
@ -1,5 +1,38 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="p-2">
|
||||||
|
<!--查询区域-->
|
||||||
|
<div class="jeecg-basic-table-form-container">
|
||||||
|
<a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
<a-col :lg="6">
|
||||||
|
<a-form-item name="suppliersName">
|
||||||
|
<template #label><span title="供应商名称">供应商名称</span></template>
|
||||||
|
<j-input placeholder="请输入供应商名称" v-model:value="queryParam.suppliersName" allow-clear ></j-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :lg="6">
|
||||||
|
<a-form-item name="personInCharge">
|
||||||
|
<template #label><span title="负责人">负责人</span></template>
|
||||||
|
<j-input placeholder="请输入负责人" v-model:value="queryParam.personInCharge" allow-clear ></j-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :lg="6">
|
||||||
|
<a-form-item name="supplyState">
|
||||||
|
<template #label><span title="供应状态">供应状态</span></template>
|
||||||
|
<j-dict-select-tag type='list' placeholder="请选择供应状态" v-model:value="queryParam.supplyState" dictCode="supply_state" allow-clear />
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :lg="6" :sm="24">
|
||||||
|
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
||||||
|
<a-col :lg="6">
|
||||||
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
|
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
|
||||||
|
</a-col>
|
||||||
|
</span>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
<!--引用表格-->
|
<!--引用表格-->
|
||||||
<BasicTable @register="registerTable">
|
<BasicTable @register="registerTable">
|
||||||
<!--插槽:table标题-->
|
<!--插槽:table标题-->
|
||||||
|
@ -32,9 +65,12 @@
|
||||||
import { downloadFile } from '/@/utils/common/renderUtils';
|
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||||
import { useUserStore } from '/@/store/modules/user';
|
import { useUserStore } from '/@/store/modules/user';
|
||||||
import { useDrawer } from '/@/components/Drawer';
|
import { useDrawer } from '/@/components/Drawer';
|
||||||
|
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||||
|
import JInput from '/@/components/Form/src/jeecg/components/JInput.vue';
|
||||||
const queryParam = reactive<any>({});
|
const queryParam = reactive<any>({});
|
||||||
const checkedKeys = ref<Array<string | number>>([]);
|
const checkedKeys = ref<Array<string | number>>([]);
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const formRef = ref();
|
||||||
//注册model
|
//注册model
|
||||||
const [registerModal, {openModal}] = useModal();
|
const [registerModal, {openModal}] = useModal();
|
||||||
//注册drawer
|
//注册drawer
|
||||||
|
@ -47,16 +83,6 @@
|
||||||
columns,
|
columns,
|
||||||
canResize:false,
|
canResize:false,
|
||||||
showIndexColumn: true,
|
showIndexColumn: true,
|
||||||
formConfig: {
|
|
||||||
//labelWidth: 120,
|
|
||||||
schemas: searchFormSchema,
|
|
||||||
autoSubmitOnEnter:true,
|
|
||||||
showAdvancedButton:true,
|
|
||||||
fieldMapToNumber: [
|
|
||||||
],
|
|
||||||
fieldMapToTime: [
|
|
||||||
],
|
|
||||||
},
|
|
||||||
actionColumn: {
|
actionColumn: {
|
||||||
width: 160,
|
width: 160,
|
||||||
fixed:'right'
|
fixed:'right'
|
||||||
|
@ -77,7 +103,16 @@
|
||||||
})
|
})
|
||||||
|
|
||||||
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
|
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs:24,
|
||||||
|
sm:6,
|
||||||
|
xl:6,
|
||||||
|
xxl:6
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: 24,
|
||||||
|
sm: 24,
|
||||||
|
});
|
||||||
// 高级查询配置
|
// 高级查询配置
|
||||||
const superQueryConfig = reactive(superQuerySchema);
|
const superQueryConfig = reactive(superQuerySchema);
|
||||||
|
|
||||||
|
@ -90,6 +125,22 @@
|
||||||
});
|
});
|
||||||
reload();
|
reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
function searchQuery() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
function searchReset() {
|
||||||
|
formRef.value.resetFields();
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
//刷新数据
|
||||||
|
reload();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 新增事件
|
* 新增事件
|
||||||
*/
|
*/
|
||||||
|
@ -175,6 +226,29 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
padding: 0;
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
.ant-form-item:not(.ant-form-item-with-help){
|
||||||
|
margin-bottom: 16px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
:deep(.ant-picker),:deep(.ant-input-number){
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
:deep(.ant-picker),:deep(.ant-input-number){
|
:deep(.ant-picker),:deep(.ant-input-number){
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,6 +203,7 @@
|
||||||
cameraData.value.regionId = formData.regionId;
|
cameraData.value.regionId = formData.regionId;
|
||||||
cameraData.value.multitrans = formData.multitrans;
|
cameraData.value.multitrans = formData.multitrans;
|
||||||
cameraData.value.scale = formData.scale;
|
cameraData.value.scale = formData.scale;
|
||||||
|
cameraData.value.parentId = formData.parentId;
|
||||||
})
|
})
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -14,9 +14,9 @@
|
||||||
<span style="margin-left: 5px;">
|
<span style="margin-left: 5px;">
|
||||||
<a-button preIcon="ant-design:swap-outlined" @click="switchResolution">{{ resolution }}</a-button>
|
<a-button preIcon="ant-design:swap-outlined" @click="switchResolution">{{ resolution }}</a-button>
|
||||||
</span>
|
</span>
|
||||||
<span style="margin-left: 5px;">
|
<!-- <span style="margin-left: 5px;">
|
||||||
<a-button preIcon="ant-design:phone-outlined" @click="screenshot">巡航*</a-button>
|
<a-button preIcon="ant-design:phone-outlined" @click="screenshot">巡航*</a-button>
|
||||||
</span>
|
</span>-->
|
||||||
<span style="margin-left: 5px;" v-show="!izPhone">
|
<span style="margin-left: 5px;" v-show="!izPhone">
|
||||||
<a-button preIcon="ant-design:phone-outlined" @click="startPhone">电话</a-button>
|
<a-button preIcon="ant-design:phone-outlined" @click="startPhone">电话</a-button>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -196,6 +196,7 @@ import {
|
||||||
formData.regionId = props.data.regionId;
|
formData.regionId = props.data.regionId;
|
||||||
formData.multitrans = props.data.multitrans;
|
formData.multitrans = props.data.multitrans;
|
||||||
formData.scale = props.data.scale;
|
formData.scale = props.data.scale;
|
||||||
|
formData.parentId = props.data.parentId;
|
||||||
},
|
},
|
||||||
{ deep: true, immediate: true }
|
{ deep: true, immediate: true }
|
||||||
);
|
);
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
<template>
|
||||||
|
<a-row class="p-2">
|
||||||
|
<a-col :span="9">
|
||||||
|
<PlanAddTree ref="leftTree" :data="formData" @select="onTreeSelect"/>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="15">
|
||||||
|
<PlanAddForm ref="addForm" :initData="formData" :data="nodeData" @success="submitCallback" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="iot-nuIotRegionInfo" setup>
|
||||||
|
import {defineExpose, nextTick, reactive, ref} from 'vue';
|
||||||
|
import { useDesign } from '/@/hooks/web/useDesign';
|
||||||
|
import PlanAddTree from './PlanAddTree.vue'
|
||||||
|
import PlanAddForm from './PlanAddForm.vue';
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
|
|
||||||
|
const formData = reactive<Record<string, any>>({
|
||||||
|
projectId: '',
|
||||||
|
regionId: ''
|
||||||
|
});
|
||||||
|
|
||||||
|
// 给子组件定义一个ref变量
|
||||||
|
const leftTree = ref();
|
||||||
|
const addForm = ref();
|
||||||
|
// 当前选中的区域信息
|
||||||
|
const nodeData = ref({});
|
||||||
|
|
||||||
|
// 左侧树选择后触发
|
||||||
|
function onTreeSelect(data) {
|
||||||
|
nodeData.value = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
async function edit(record) {
|
||||||
|
await nextTick(() => {
|
||||||
|
const tmpData = {};
|
||||||
|
Object.keys(formData).forEach((key) => {
|
||||||
|
if(record.hasOwnProperty(key)){
|
||||||
|
tmpData[key] = record[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//赋值
|
||||||
|
Object.assign(formData, tmpData);
|
||||||
|
leftTree.value.clean();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function submitForm(){
|
||||||
|
addForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
function submitCallback() {
|
||||||
|
emit('ok');
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
edit,
|
||||||
|
submitForm
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
.p-2{
|
||||||
|
height: calc(100vh - 325px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-content{
|
||||||
|
background-color: #ffffff;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-tabs-nav ){
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,160 @@
|
||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="height: 100%">
|
||||||
|
<div class="title">
|
||||||
|
2.选择录像存储位置、码流、计划
|
||||||
|
</div>
|
||||||
|
<a-divider />
|
||||||
|
<a-spin :spinning="loading">
|
||||||
|
<BasicForm @register="registerForm" class="jeecg-basic-form">
|
||||||
|
<template #storageDevInput="{ model, field }">
|
||||||
|
<a-select v-model:value="model[field]">
|
||||||
|
<template v-for="item in storageDevOptions" :key="`${item.storageDevId}`">
|
||||||
|
<a-select-option :value="item.storageDevId" :label="item.storageDevName">
|
||||||
|
{{item.storageDevName}}
|
||||||
|
</a-select-option>
|
||||||
|
</template>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
<template #planInput="{ model, field }">
|
||||||
|
<a-select v-model:value="model[field]">
|
||||||
|
<template v-for="item in planOptions" :key="`${item.recordPlanId}`">
|
||||||
|
<a-select-option :value="item.recordPlanId" :label="item.planName">
|
||||||
|
{{item.planName}}
|
||||||
|
</a-select-option>
|
||||||
|
</template>
|
||||||
|
</a-select>
|
||||||
|
</template>
|
||||||
|
</BasicForm>
|
||||||
|
</a-spin>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { watch, computed, inject, ref, unref, onMounted } from 'vue';
|
||||||
|
import { BasicForm, useForm } from '/@/components/Form/index';
|
||||||
|
import { addRecordCfgs, getAllRecordPlans, getStorageDevice } from '../plan.api';
|
||||||
|
import { addFormSchema } from "../plan.data";
|
||||||
|
import { useDesign } from '/@/hooks/web/useDesign';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import {propTypes} from "@/utils/propTypes";
|
||||||
|
const { createMessage, createSuccessModal } = useMessage();
|
||||||
|
const emit = defineEmits(['success']);
|
||||||
|
const props = defineProps({
|
||||||
|
initData: { type: Object, default: () => ({}) },
|
||||||
|
data: { type: Array, default: () => ([]) }
|
||||||
|
});
|
||||||
|
const areaOptions = ref<any[]>([]);
|
||||||
|
const loading = ref<boolean>(false);
|
||||||
|
// 当前是否是更新模式
|
||||||
|
const isUpdate = ref<boolean>(true);
|
||||||
|
// 当前的弹窗数据
|
||||||
|
const initModel = ref<object>({});
|
||||||
|
// 当前的弹窗数据
|
||||||
|
const treeModel = ref<object>([]);
|
||||||
|
// 当前的弹窗数据
|
||||||
|
const model = ref<object>({});
|
||||||
|
|
||||||
|
const planOptions = ref<any[]>([]);
|
||||||
|
const storageDevOptions = ref<any[]>([]);
|
||||||
|
|
||||||
|
//注册表单
|
||||||
|
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
|
||||||
|
schemas: addFormSchema,
|
||||||
|
showActionButtonGroup: false
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
watch(
|
||||||
|
() => props.initData,
|
||||||
|
async () => {
|
||||||
|
let record = unref(props.initData);
|
||||||
|
if (typeof record !== 'object') {
|
||||||
|
record = {};
|
||||||
|
}
|
||||||
|
initModel.value = record;
|
||||||
|
if(record.projectId!=''&&record.regionId!=''){
|
||||||
|
await fetchStorageDev(record.projectId,record.regionId);
|
||||||
|
await fetchPlan();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true }
|
||||||
|
);
|
||||||
|
// data 变化,重填表单
|
||||||
|
watch(
|
||||||
|
() => props.data,
|
||||||
|
async () => {
|
||||||
|
let record = unref(props.data);
|
||||||
|
console.log(record);
|
||||||
|
if (typeof record !== 'object') {
|
||||||
|
record = [];
|
||||||
|
}
|
||||||
|
treeModel.value = record;
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 提交事件
|
||||||
|
async function submitForm() {
|
||||||
|
if(treeModel.value!=null){
|
||||||
|
if(treeModel.value.length == 0){
|
||||||
|
createMessage.info('请选择监控点!');
|
||||||
|
}else{
|
||||||
|
try {
|
||||||
|
loading.value = true;
|
||||||
|
let values = await validate();
|
||||||
|
values = Object.assign({}, model.value, values);
|
||||||
|
console.log(values);
|
||||||
|
values["ids"] = treeModel.value.join(',');
|
||||||
|
//提交表单
|
||||||
|
await addRecordCfgs(values);
|
||||||
|
//刷新列表
|
||||||
|
emit('success');
|
||||||
|
Object.assign(model.value, {});
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchStorageDev = async (projectId,regionId) => {
|
||||||
|
storageDevOptions.value = [];
|
||||||
|
const data = await getStorageDevice({ projectId : projectId, regionId: regionId });
|
||||||
|
console.log(data);
|
||||||
|
Object.assign(storageDevOptions.value, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fetchPlan = async () => {
|
||||||
|
planOptions.value = [];
|
||||||
|
const data = await getAllRecordPlans({});
|
||||||
|
console.log(data);
|
||||||
|
Object.assign(planOptions.value, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
submitForm,
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
:deep(.ant-card-body){
|
||||||
|
padding: 0px 0px 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-divider-horizontal{
|
||||||
|
margin: 0px 0px 20px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title{
|
||||||
|
padding: 10px 0px 10px 10px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jeecg-basic-form {
|
||||||
|
padding: 0px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,147 @@
|
||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="height: 100%" class="card">
|
||||||
|
<div class="title">
|
||||||
|
1.选择监控点
|
||||||
|
</div>
|
||||||
|
<a-divider />
|
||||||
|
<a-alert type="info" show-icon class="alert" style="margin-bottom: 8px">
|
||||||
|
<template #message>
|
||||||
|
<template v-if="checkedKeys.length > 0">
|
||||||
|
<span>已选中 {{ checkedKeys.length }} 条记录</span>
|
||||||
|
<a-divider type="vertical" />
|
||||||
|
<a @click="clean">清空</a>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<span>未选中任何数据</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-alert>
|
||||||
|
<a-spin :spinning="loading">
|
||||||
|
<!--区域树-->
|
||||||
|
<template v-if="treeData.length > 0">
|
||||||
|
<a-tree
|
||||||
|
:clickRowToExpand="false"
|
||||||
|
:treeData="treeData"
|
||||||
|
:selectedKeys="selectedKeys"
|
||||||
|
:checkStrictly="checkStrictly"
|
||||||
|
:load-data="loadChildrenTreeData"
|
||||||
|
:checkedKeys="checkedKeys"
|
||||||
|
v-model:expandedKeys="expandedKeys"
|
||||||
|
@check="onCheck"
|
||||||
|
checkable
|
||||||
|
>
|
||||||
|
</a-tree>
|
||||||
|
</template>
|
||||||
|
<a-empty v-else description="暂无数据" />
|
||||||
|
</a-spin>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import {defineExpose, nextTick, onMounted, ref, unref, watch} from 'vue';
|
||||||
|
import { useModal } from '/@/components/Modal';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { useMethods } from '/@/hooks/system/useMethods';
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
import { queryTreeList } from '../plan.api';
|
||||||
|
const props = defineProps({
|
||||||
|
data: { type: Object, default: () => ({}) },
|
||||||
|
});
|
||||||
|
// 当前的弹窗数据
|
||||||
|
const model = ref<object>({});
|
||||||
|
const emit = defineEmits(['select']);
|
||||||
|
const syncoading = ref<boolean>(false);
|
||||||
|
const loading = ref<boolean>(false);
|
||||||
|
// 区域树列表数据
|
||||||
|
const treeData = ref<any[]>([]);
|
||||||
|
// 当前选中的项
|
||||||
|
const checkedKeys = ref<any[]>([]);
|
||||||
|
// 当前展开的项
|
||||||
|
const expandedKeys = ref<any[]>([]);
|
||||||
|
// 当前选中的项
|
||||||
|
const selectedKeys = ref<any[]>([]);
|
||||||
|
// 树父子是否关联
|
||||||
|
const checkStrictly = ref<boolean>(true);
|
||||||
|
|
||||||
|
// 加载顶级区域信息
|
||||||
|
async function loadRootTreeData() {
|
||||||
|
if(model.value.projectId==''&&model.value.regionId==''){
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
loading.value = true;
|
||||||
|
treeData.value = [];
|
||||||
|
model.value["recordPlanId"] = "-1";
|
||||||
|
const result = await queryTreeList(model.value);
|
||||||
|
if (Array.isArray(result)) {
|
||||||
|
treeData.value = result;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
syncoading.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean(){
|
||||||
|
checkedKeys.value = [];
|
||||||
|
emit('select', checkedKeys.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 树复选框选择事件
|
||||||
|
function onCheck(e) {
|
||||||
|
if (Array.isArray(e)) {
|
||||||
|
checkedKeys.value = e;
|
||||||
|
} else {
|
||||||
|
checkedKeys.value = e.checked;
|
||||||
|
}
|
||||||
|
emit('select', checkedKeys.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// data 变化,重填表单
|
||||||
|
watch(
|
||||||
|
() => props.data,
|
||||||
|
async () => {
|
||||||
|
let record = unref(props.data);
|
||||||
|
if (typeof record !== 'object') {
|
||||||
|
record = {};
|
||||||
|
}
|
||||||
|
model.value = record;
|
||||||
|
await loadRootTreeData();
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
clean
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
:deep(.ant-card-body){
|
||||||
|
padding: 0px 0px 0px 0px;
|
||||||
|
background-color: aliceblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card{
|
||||||
|
background-color: aliceblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.ant-tree-list-holder){
|
||||||
|
background-color: aliceblue !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-divider-horizontal{
|
||||||
|
margin: 0px 0px 10px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title{
|
||||||
|
padding: 10px 0px 10px 10px;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,181 @@
|
||||||
|
<template>
|
||||||
|
<a-card :bordered="false" style="height: 100%">
|
||||||
|
<a-spin :spinning="syncoading">
|
||||||
|
<!-- <div class="j-table-operator" style="width: 100%">
|
||||||
|
<a-button preIcon="ant-design:sync-outlined" @click="loadRootTreeData">刷新</a-button>
|
||||||
|
</div>-->
|
||||||
|
<a-spin :spinning="loading">
|
||||||
|
<!--区域树-->
|
||||||
|
<template v-if="treeData.length > 0">
|
||||||
|
<a-tree
|
||||||
|
v-if="!treeReloading"
|
||||||
|
:clickRowToExpand="false"
|
||||||
|
:treeData="treeData"
|
||||||
|
:selectedKeys="selectedKeys"
|
||||||
|
:checkStrictly="checkStrictly"
|
||||||
|
:load-data="loadChildrenTreeData"
|
||||||
|
:checkedKeys="checkedKeys"
|
||||||
|
v-model:expandedKeys="expandedKeys"
|
||||||
|
@select="onSelect"
|
||||||
|
>
|
||||||
|
</a-tree>
|
||||||
|
</template>
|
||||||
|
<a-empty v-else description="暂无数据" />
|
||||||
|
</a-spin>
|
||||||
|
</a-spin>
|
||||||
|
</a-card>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { nextTick, ref } from 'vue';
|
||||||
|
import { useModal } from '/@/components/Modal';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { useMethods } from '/@/hooks/system/useMethods';
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
import { queryProjectTreeSync, queryRegionTreeSync } from '../plan.api';
|
||||||
|
|
||||||
|
const emit = defineEmits(['select', 'rootTreeData']);
|
||||||
|
const syncoading = ref<boolean>(false);
|
||||||
|
const loading = ref<boolean>(false);
|
||||||
|
// 区域树列表数据
|
||||||
|
const treeData = ref<any[]>([]);
|
||||||
|
// 当前选中的项
|
||||||
|
const checkedKeys = ref<any[]>([]);
|
||||||
|
// 当前展开的项
|
||||||
|
const expandedKeys = ref<any[]>([]);
|
||||||
|
// 当前选中的项
|
||||||
|
const selectedKeys = ref<any[]>([]);
|
||||||
|
// 树组件重新加载
|
||||||
|
const treeReloading = ref<boolean>(false);
|
||||||
|
// 树父子是否关联
|
||||||
|
const checkStrictly = ref<boolean>(true);
|
||||||
|
// 当前选中的区域
|
||||||
|
const currentRegion = ref<any>(null);
|
||||||
|
|
||||||
|
// 加载顶级区域信息
|
||||||
|
async function loadRootTreeData() {
|
||||||
|
try {
|
||||||
|
loading.value = true;
|
||||||
|
treeData.value = [];
|
||||||
|
const result = await queryProjectTreeSync();
|
||||||
|
if (Array.isArray(result)) {
|
||||||
|
treeData.value = result;
|
||||||
|
}
|
||||||
|
if (expandedKeys.value.length === 0) {
|
||||||
|
autoExpandParentNode();
|
||||||
|
} else {
|
||||||
|
if (selectedKeys.value.length === 0) {
|
||||||
|
let item = treeData.value[0];
|
||||||
|
if (item) {
|
||||||
|
// 默认选中第一个
|
||||||
|
setSelectedKey(item.id, item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emit('select', currentRegion.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit('rootTreeData', treeData.value);
|
||||||
|
} finally {
|
||||||
|
loading.value = false;
|
||||||
|
syncoading.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loadRootTreeData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载子级区域信息
|
||||||
|
*/
|
||||||
|
async function loadChildrenTreeData(treeNode) {
|
||||||
|
try {
|
||||||
|
const result = await queryRegionTreeSync({
|
||||||
|
parentId: treeNode.dataRef.id,
|
||||||
|
projectId: treeNode.dataRef.projectId,
|
||||||
|
});
|
||||||
|
if (result.length == 0) {
|
||||||
|
treeNode.dataRef.isLeaf = true;
|
||||||
|
} else {
|
||||||
|
treeNode.dataRef.children = result;
|
||||||
|
if (expandedKeys.value.length > 0) {
|
||||||
|
// 判断获取的子级是否有当前展开的项
|
||||||
|
let subKeys: any[] = [];
|
||||||
|
for (let key of expandedKeys.value) {
|
||||||
|
if (result.findIndex((item) => item.id === key) !== -1) {
|
||||||
|
subKeys.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (subKeys.length > 0) {
|
||||||
|
expandedKeys.value = [...expandedKeys.value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
treeData.value = [...treeData.value];
|
||||||
|
emit('rootTreeData', treeData.value);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动展开父节点,只展开一级
|
||||||
|
*/
|
||||||
|
function autoExpandParentNode() {
|
||||||
|
let item = treeData.value[0];
|
||||||
|
if (item) {
|
||||||
|
if (!item.isLeaf) {
|
||||||
|
expandedKeys.value = [item.key];
|
||||||
|
}
|
||||||
|
// 默认选中第一个
|
||||||
|
setSelectedKey(item.id, item);
|
||||||
|
reloadTree();
|
||||||
|
} else {
|
||||||
|
emit('select', null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新加载树组件,防止无法默认展开数据
|
||||||
|
*/
|
||||||
|
async function reloadTree() {
|
||||||
|
await nextTick();
|
||||||
|
treeReloading.value = true;
|
||||||
|
await nextTick();
|
||||||
|
treeReloading.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置当前选中的行
|
||||||
|
*/
|
||||||
|
function setSelectedKey(key: string, data?: object) {
|
||||||
|
selectedKeys.value = [key];
|
||||||
|
if (data) {
|
||||||
|
currentRegion.value = data;
|
||||||
|
emit('select', data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 树选择事件
|
||||||
|
*/
|
||||||
|
function onSelect(selKeys, event) {
|
||||||
|
if (selKeys.length > 0 && selectedKeys.value[0] !== selKeys[0]) {
|
||||||
|
setSelectedKey(selKeys[0], event.selectedNodes[0]);
|
||||||
|
} else {
|
||||||
|
// 这样可以防止用户取消选择
|
||||||
|
setSelectedKey(selectedKeys.value[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
loadRootTreeData,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
:deep(.ant-card-body){
|
||||||
|
padding: 24px 0px 0px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,213 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!--引用表格-->
|
||||||
|
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||||
|
<!--插槽:table标题-->
|
||||||
|
<template #tableTitle>
|
||||||
|
<a-button v-if="queryParam.regionId" type="primary" preIcon="ant-design:plus-outlined" @click="handleAdd"> 新增</a-button>
|
||||||
|
<a-button v-if="selectedRowKeys.length > 0" preIcon="ant-design:delete-outlined" @click="batchHandleDelete"> 删除</a-button>
|
||||||
|
</template>
|
||||||
|
<!--操作栏-->
|
||||||
|
<template #action="{ record }"></template>
|
||||||
|
<template v-slot:bodyCell="{ column, record, index, text }">
|
||||||
|
<template v-if="column.dataIndex === 'recordSwitchBoolean'">
|
||||||
|
<a-switch
|
||||||
|
v-model:checked="record.recordSwitchBoolean"
|
||||||
|
checked-children="开"
|
||||||
|
un-checked-children="关"
|
||||||
|
@change="(checked) => handleSwitchChange(checked, record)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<!-- <template #recordSlot="{ text, record }">
|
||||||
|
<a-switch
|
||||||
|
v-model:checked="record.recordSwitch"
|
||||||
|
checked-children="启用"
|
||||||
|
un-checked-children="停用"
|
||||||
|
/>
|
||||||
|
</template>-->
|
||||||
|
</BasicTable>
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<PlanModal ref="registerModal"></PlanModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="iot-nuIotCameraInfo" setup>
|
||||||
|
import { ref, reactive, createVNode, h, onMounted, watch, unref } from 'vue';
|
||||||
|
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||||
|
import { useListPage } from '/@/hooks/system/useListPage';
|
||||||
|
import { columns } from '../plan.data';
|
||||||
|
import {batchDeleteCfgs, editRecordCfgs, list} from '../plan.api';
|
||||||
|
import { useUserStore } from '/@/store/modules/user';
|
||||||
|
import { useDrawer } from "@/components/Drawer";
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
|
import PlanModal from './PlanModal.vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
data: { type: Object, default: () => ({}) },
|
||||||
|
});
|
||||||
|
//注册drawer
|
||||||
|
const [registerDrawer, { openDrawer }] = useDrawer();
|
||||||
|
let router = useRouter();
|
||||||
|
const queryParam = reactive<any>({});
|
||||||
|
const registerModal = ref();
|
||||||
|
const userStore = useUserStore();
|
||||||
|
//注册table数据
|
||||||
|
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
|
tableProps: {
|
||||||
|
title: '护理单元-物联管理-录像计划',
|
||||||
|
api: list,
|
||||||
|
columns,
|
||||||
|
rowKey : "ids",
|
||||||
|
canResize: false,
|
||||||
|
showActionColumn: false,
|
||||||
|
actionColumn: {
|
||||||
|
width: 180,
|
||||||
|
fixed: 'right',
|
||||||
|
},
|
||||||
|
beforeFetch: async (params) => {
|
||||||
|
return Object.assign(params, queryParam);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource, getSelectRows }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs:24,
|
||||||
|
sm:4,
|
||||||
|
xl:6,
|
||||||
|
xxl:4
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: 24,
|
||||||
|
sm: 20,
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
watch(
|
||||||
|
() => props.data,
|
||||||
|
async () => {
|
||||||
|
queryParam.projectId = props.data.projectId;
|
||||||
|
queryParam.regionId = props.data.regionId;
|
||||||
|
let record = unref(props.data);
|
||||||
|
if (typeof record !== 'object') {
|
||||||
|
record = {};
|
||||||
|
}
|
||||||
|
reload();
|
||||||
|
},
|
||||||
|
{ deep: true, immediate: true }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function handleAdd(record: Recordable) {
|
||||||
|
record["projectId"] = queryParam.projectId;
|
||||||
|
record["regionId"] = queryParam.regionId;
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
function handleEdit(record: Recordable) {
|
||||||
|
record["projectId"] = queryParam.projectId;
|
||||||
|
record["regionId"] = queryParam.regionId;
|
||||||
|
openDrawer(true, {
|
||||||
|
record,
|
||||||
|
isUpdate: true,
|
||||||
|
showFooter: true,
|
||||||
|
tenantSaas: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除事件
|
||||||
|
*/
|
||||||
|
async function batchHandleDelete() {
|
||||||
|
const selectRows = getSelectRows();
|
||||||
|
let ids = [];
|
||||||
|
let devIds = [];
|
||||||
|
if(selectRows.length>0){
|
||||||
|
selectRows.forEach(function(element) {
|
||||||
|
ids.push(element.ids);
|
||||||
|
devIds.push(element.deviceIndex);
|
||||||
|
})
|
||||||
|
let params = { ids: ids.join(","), deviceIndex: devIds.join(",")};
|
||||||
|
console.log(params);
|
||||||
|
await batchDeleteCfgs(params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功回调
|
||||||
|
*/
|
||||||
|
function handleSuccess() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作栏
|
||||||
|
*/
|
||||||
|
function getTableAction(record) {
|
||||||
|
return [
|
||||||
|
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSwitchChange(checked, record) {
|
||||||
|
let recordSwitch = 0;
|
||||||
|
if(checked){
|
||||||
|
recordSwitch = 1;
|
||||||
|
}
|
||||||
|
editRecordCfgs({ ids: record.ids, recordSwitch: recordSwitch });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 左侧树选择后触发
|
||||||
|
*/
|
||||||
|
function onTreeSelect(data) {
|
||||||
|
// departData.value = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 左侧树rootTreeData触发
|
||||||
|
*/
|
||||||
|
function onRootTreeData(data) {
|
||||||
|
// rootTreeData.value = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
padding: 0;
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
.ant-form-item:not(.ant-form-item-with-help){
|
||||||
|
margin-bottom: 16px;
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
:deep(.ant-picker),:deep(.ant-input-number){
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-2{
|
||||||
|
height: calc(100vh - 120px);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,67 @@
|
||||||
|
<template>
|
||||||
|
<j-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||||
|
<PlanAdd ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></PlanAdd>
|
||||||
|
</j-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
|
||||||
|
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
|
||||||
|
import PlanAdd from "./PlanAdd.vue";
|
||||||
|
|
||||||
|
const title = ref<string>('');
|
||||||
|
const width = ref<number>(800);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const emit = defineEmits(['register', 'success']);
|
||||||
|
|
||||||
|
// const player = ref();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
* @param record
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
title.value = "添加录像设置";
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.edit(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
edit,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less">
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="less" scoped></style>
|
|
@ -0,0 +1,46 @@
|
||||||
|
<template>
|
||||||
|
|
||||||
|
<a-row class="p-2" type="flex" :gutter="10">
|
||||||
|
<a-col :xl="4" :lg="24" :md="24" style="margin-bottom: 10px">
|
||||||
|
<PlanLeftTree ref="leftTree" @select="onTreeSelect" @rootTreeData="onRootTreeData" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :xl="20" :lg="24" :md="24" style="margin-bottom: 10px">
|
||||||
|
<div v-show="planData != null">
|
||||||
|
<PlanList :data="planData" />
|
||||||
|
</div>
|
||||||
|
<div v-show="planData == null" style="padding-top: 40px">
|
||||||
|
<a-empty description="请选择区域" />
|
||||||
|
</div>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="iot-nuIotCameraInfo" setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useDesign } from '/@/hooks/web/useDesign';
|
||||||
|
import PlanLeftTree from './components/PlanLeftTree.vue'
|
||||||
|
import PlanList from './components/PlanList.vue';
|
||||||
|
|
||||||
|
// 给子组件定义一个ref变量
|
||||||
|
const leftTree = ref();
|
||||||
|
// 当前选中的区域信息
|
||||||
|
const planData = ref({});
|
||||||
|
const rootTreeData = ref<any[]>([]);
|
||||||
|
// 左侧树选择后触发
|
||||||
|
function onTreeSelect(data) {
|
||||||
|
planData.value = data;
|
||||||
|
}
|
||||||
|
// 左侧树rootTreeData触发
|
||||||
|
function onRootTreeData(data) {
|
||||||
|
rootTreeData.value = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
|
||||||
|
.p-2{
|
||||||
|
height: calc(100vh - 120px);
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
|
@ -0,0 +1,86 @@
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import {Modal} from "ant-design-vue";
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
queryProjectTreeSync = '/iot/projectInfo/queryRegionTreeSync',
|
||||||
|
queryRegionTreeSync = '/iot/regionInfo/queryRegionTreeSync',
|
||||||
|
queryTreeList = '/iot/cameraInfo/queryTreeList',
|
||||||
|
getStorageDevice = '/iot/cameraInfo/getStorageDevice',
|
||||||
|
getAllRecordPlans = '/iot/cameraInfo/getAllRecordPlans',
|
||||||
|
getRecordCfgs = '/iot/cameraInfo/getRecordCfgs',
|
||||||
|
addRecordCfgs = '/iot/cameraInfo/addRecordCfgs',
|
||||||
|
setRecordCfgs = '/iot/cameraInfo/setRecordCfgs',
|
||||||
|
delRecordCfgs = '/iot/cameraInfo/delRecordCfgs',
|
||||||
|
getBatchProgress = '/iot/cameraInfo/getBatchProgress',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取项目树列表
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const queryProjectTreeSync = (params?) => defHttp.get({ url: Api.queryProjectTreeSync, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取区域树列表
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const queryRegionTreeSync = (params?) => defHttp.get({ url: Api.queryRegionTreeSync, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取树列表
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const queryTreeList = (params?) => defHttp.get({ url: Api.queryTreeList, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表接口
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getStorageDevice = (params) => defHttp.get({ url: Api.getStorageDevice, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取存储设备列表
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getAllRecordPlans = (params) => defHttp.get({ url: Api.getAllRecordPlans, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取录像配置
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const list = (params) => defHttp.get({ url: Api.getRecordCfgs, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加录像计划
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const addRecordCfgs = (params) => defHttp.post({ url: Api.addRecordCfgs, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置录像计划
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const editRecordCfgs = (params) => defHttp.post({ url: Api.setRecordCfgs, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取批量操作录像计划进度
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getBatchProgress = (params) => defHttp.get({ url: Api.getBatchProgress, params });
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除数据源
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const batchDeleteCfgs = (params) => {
|
||||||
|
Modal.confirm({
|
||||||
|
title: '确认删除',
|
||||||
|
content: '是否删除选中数据',
|
||||||
|
okText: '确认',
|
||||||
|
cancelText: '取消',
|
||||||
|
onOk: () => {
|
||||||
|
defHttp.get({ url: Api.delRecordCfgs, params });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
|
@ -0,0 +1,158 @@
|
||||||
|
import {BasicColumn} from '/@/components/Table';
|
||||||
|
import {FormSchema} from '/@/components/Table';
|
||||||
|
|
||||||
|
//列表数据
|
||||||
|
export const columns: BasicColumn[] = [
|
||||||
|
{
|
||||||
|
title: '设备序号',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'deviceIndex'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '设备名称',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'deviceName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'IP地址',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'ip'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '录像开关',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'recordSwitchBoolean',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '录像存储位置',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'storageDevName'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '录像码流',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'streamType',
|
||||||
|
customRender:({record})=>{
|
||||||
|
if(record.streamType == 0){
|
||||||
|
return '主码流';
|
||||||
|
}else if(record.streamType == 1){
|
||||||
|
return '子码流';
|
||||||
|
}else{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '录像计划',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'planName'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const formSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
field: 'ids',
|
||||||
|
component: 'Input',
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '设备序号',
|
||||||
|
field: 'deviceIndex',
|
||||||
|
component: 'Input',
|
||||||
|
dynamicDisabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '设备名称',
|
||||||
|
field: 'deviceName',
|
||||||
|
component: 'Input',
|
||||||
|
dynamicDisabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像开关',
|
||||||
|
field: 'recordSwitch',
|
||||||
|
component: 'Select',
|
||||||
|
componentProps: {
|
||||||
|
options: [
|
||||||
|
{label:'开启' , value: '1'},
|
||||||
|
{label:'关闭' , value: '0'},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
defaultValue: '1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '存储位置',
|
||||||
|
field: 'storageDevName',
|
||||||
|
component: 'Input',
|
||||||
|
slot: 'storageDevInput',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像码流',
|
||||||
|
field: 'streamType',
|
||||||
|
component: 'Select',
|
||||||
|
componentProps: {
|
||||||
|
options: [
|
||||||
|
{label:'主码流' , value: 0},
|
||||||
|
{label:'子码流' , value: 1},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
dynamicDisabled: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像计划',
|
||||||
|
field: 'planName',
|
||||||
|
component: 'Input',
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export const addFormSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '设备序号',
|
||||||
|
field: 'deviceIndex',
|
||||||
|
component: 'Input',
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像开关',
|
||||||
|
field: 'recordSwitch',
|
||||||
|
component: 'Select',
|
||||||
|
componentProps: {
|
||||||
|
options: [
|
||||||
|
{label:'开启' , value: '1'},
|
||||||
|
{label:'关闭' , value: '0'},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
defaultValue: '1',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '存储位置',
|
||||||
|
field: 'storageDevId',
|
||||||
|
component: 'Input',
|
||||||
|
slot: 'storageDevInput',
|
||||||
|
defaultValue: '0',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像码流',
|
||||||
|
field: 'streamType',
|
||||||
|
component: 'Select',
|
||||||
|
componentProps: {
|
||||||
|
options: [
|
||||||
|
{label:'主码流' , value: 0},
|
||||||
|
{label:'子码流' , value: 1},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
defaultValue: 0,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '录像计划',
|
||||||
|
field: 'recordPlanId',
|
||||||
|
component: 'Input',
|
||||||
|
slot: 'planInput',
|
||||||
|
defaultValue: '1',
|
||||||
|
required: true,
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<a-input v-model:value="searchForm.packageName" allow-clear />
|
<a-input v-model:value="searchForm.packageName" allow-clear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :xl="6" :lg="7" :md="8" :sm="24">
|
<a-col :lg="6" :sm="24">
|
||||||
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
</div>
|
</div>
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
|
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
|
||||||
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
|
<a-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
|
||||||
<a-col :span="4">
|
<a-col :span="4">
|
||||||
<div class="bjclass">
|
<div class="bjclass">
|
||||||
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
|
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
|
||||||
|
@ -86,17 +86,15 @@ const registerModal = ref();
|
||||||
const searchForm = ref({})
|
const searchForm = ref({})
|
||||||
const tableData = ref({})
|
const tableData = ref({})
|
||||||
const labelCol = reactive({
|
const labelCol = reactive({
|
||||||
|
xs:24,
|
||||||
|
sm:6,
|
||||||
|
xl:6,
|
||||||
|
xxl:6
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
xs: 24,
|
xs: 24,
|
||||||
sm: 4,
|
sm: 24,
|
||||||
xl: 6,
|
});
|
||||||
xxl: 6
|
|
||||||
});
|
|
||||||
const wrapperCol = reactive({
|
|
||||||
xs: 24,
|
|
||||||
sm: 20,
|
|
||||||
xl: 14,
|
|
||||||
xxl: 14
|
|
||||||
});
|
|
||||||
const pageParams = ref({ pageNo: 1, pageSize: 12 })
|
const pageParams = ref({ pageNo: 1, pageSize: 12 })
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
|
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
|
||||||
<div style="display:flex;justify-content:space-between">
|
<div style="display:flex;justify-content:space-between">
|
||||||
|
|
||||||
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw">
|
<div style="background-color: #fafafa;border-radius: 8px;padding: 10px;width: 25vw">
|
||||||
<div style="font-size: 18px;font-weight:700;padding: 15px">服务指令包详情</div>
|
<div style="font-size: 18px;font-weight:700;padding: 15px">服务指令包详情</div>
|
||||||
<DirectivePackageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false">
|
<DirectivePackageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false">
|
||||||
</DirectivePackageForm>
|
</DirectivePackageForm>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;">
|
<div style="background-color: #fafafa;border-radius: 8px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;">
|
||||||
<div style="padding: 15px;height: 30px;width:100%;">
|
<div style="padding: 15px;height: 30px;width:100%;">
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<div style="margin-top: 15px;">
|
<div style="margin-top: 15px;">
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="22" :push="1" v-for="directive of seletedRecord.directives" :key="directive.id"
|
<a-col :span="22" :push="1" v-for="directive of seletedRecord.directives" :key="directive.id"
|
||||||
style="margin-top: 15px;border-radius: 5px;" @click="directiveInfo(directive)" :class="{ 'selected': selectedDirective === directive.id }">
|
style="margin-top: 15px;border-radius: 8px;" @click="directiveInfo(directive)" :class="{ 'selected': selectedDirective === directive.id }">
|
||||||
<a-card size="small">
|
<a-card size="small">
|
||||||
<div >
|
<div >
|
||||||
<a-row :span="24">
|
<a-row :span="24">
|
||||||
|
@ -69,7 +69,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<div style="border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;border: 1px solid #dcdfe6;">
|
<div style="border-radius: 8px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;border: 1px solid #dcdfe6;">
|
||||||
<div style="padding: 15px;height: 30px;width:100%;">
|
<div style="padding: 15px;height: 30px;width:100%;">
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="24">
|
<a-col :span="24">
|
||||||
|
|
|
@ -92,11 +92,11 @@ export const columns: BasicColumn[] = [
|
||||||
dataIndex: 'izPreferential_dictText',
|
dataIndex: 'izPreferential_dictText',
|
||||||
width: 100,
|
width: 100,
|
||||||
},
|
},
|
||||||
{
|
// {
|
||||||
title: '收费频次',
|
// title: '收费频次',
|
||||||
align: 'center',
|
// align: 'center',
|
||||||
dataIndex: 'chargingFrequency_dictText',
|
// dataIndex: 'chargingFrequency_dictText',
|
||||||
},
|
// },
|
||||||
{
|
{
|
||||||
title: '周期类型',
|
title: '周期类型',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
:ignoreDisabled="true" allowClear />
|
:ignoreDisabled="true" allowClear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<template v-if="toggleSearchStatus">
|
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-form-item name="directiveName">
|
<a-form-item name="directiveName">
|
||||||
<template #label><span title="服务指令">服务指令</span></template>
|
<template #label><span title="服务指令">服务指令</span></template>
|
||||||
|
@ -35,7 +34,7 @@
|
||||||
:ignoreDisabled="true" placeholder="请选分类标签" allowClear />
|
:ignoreDisabled="true" placeholder="请选分类标签" allowClear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6">
|
<!-- <a-col :lg="6">
|
||||||
<a-form-item name="tollPrice">
|
<a-form-item name="tollPrice">
|
||||||
<template #label><span title="收费价格">收费价格</span></template>
|
<template #label><span title="收费价格">收费价格</span></template>
|
||||||
<JRangeNumber v-model:value="queryParam.tollPrice" class="query-group-cust"></JRangeNumber>
|
<JRangeNumber v-model:value="queryParam.tollPrice" class="query-group-cust"></JRangeNumber>
|
||||||
|
@ -46,7 +45,7 @@
|
||||||
<template #label><span title="提成价格">提成价格</span></template>
|
<template #label><span title="提成价格">提成价格</span></template>
|
||||||
<JRangeNumber v-model:value="queryParam.comPrice" class="query-group-cust"></JRangeNumber>
|
<JRangeNumber v-model:value="queryParam.comPrice" class="query-group-cust"></JRangeNumber>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col> -->
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-form-item name="izReimbursement">
|
<a-form-item name="izReimbursement">
|
||||||
<template #label><span title="医保报销">医保报销</span></template>
|
<template #label><span title="医保报销">医保报销</span></template>
|
||||||
|
@ -71,15 +70,14 @@
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-form-item name="bodyTags">
|
<a-form-item name="bodyTags">
|
||||||
<template #label><span title="体型标签">体型标签</span></template>
|
<template #label><span title="体型标签">体型标签</span></template>
|
||||||
<JSelectMultiple type="list" v-model:value="queryParam.bodyTags"
|
<j-dict-select-tag type='list' v-model:value="queryParam.bodyTags" :dictCode="`nu_config_body_tag,tag_name,id,del_flag = '0' order by sort asc`"
|
||||||
:dictCode="`nu_config_body_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true"
|
:ignoreDisabled="true" placeholder="请选择体型标签" allowClear />
|
||||||
placeholder="请选择体型标签" allowClear />
|
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-form-item name="emotionTags">
|
<a-form-item name="emotionTags">
|
||||||
<template #label><span title="情绪标签">情绪标签</span></template>
|
<template #label><span title="情绪标签">情绪标签</span></template>
|
||||||
<JSelectMultiple type="list" v-model:value="queryParam.emotionTags"
|
<j-dict-select-tag type="list" v-model:value="queryParam.emotionTags"
|
||||||
:dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true"
|
:dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true"
|
||||||
placeholder="请选择情绪标签" allowClear />
|
placeholder="请选择情绪标签" allowClear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -98,17 +96,12 @@
|
||||||
:ignoreDisabled="true" placeholder="请选择是否启用" allowClear />
|
:ignoreDisabled="true" placeholder="请选择是否启用" allowClear />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</template>
|
|
||||||
<a-col :xl="6" :lg="7" :md="8" :sm="24">
|
<a-col :xl="6" :lg="7" :md="8" :sm="24">
|
||||||
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
||||||
<a-col :lg="6">
|
<a-col :lg="6">
|
||||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
|
||||||
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
|
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
|
||||||
style="margin-left: 8px">重置</a-button>
|
style="margin-left: 8px">重置</a-button>
|
||||||
<a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
|
|
||||||
{{ toggleSearchStatus ? '收起' : '展开' }}
|
|
||||||
<Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
|
|
||||||
</a>
|
|
||||||
</a-col>
|
</a-col>
|
||||||
</span>
|
</span>
|
||||||
</a-col>
|
</a-col>
|
||||||
|
@ -119,15 +112,15 @@
|
||||||
<BasicTable @register="registerTable">
|
<BasicTable @register="registerTable">
|
||||||
<!--插槽:table标题-->
|
<!--插槽:table标题-->
|
||||||
<template #tableTitle>
|
<template #tableTitle>
|
||||||
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleCategory"
|
<a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleCategory"
|
||||||
preIcon="tabler:settings">配置服务类别</a-button>
|
preIcon="tabler:settings">配置服务类别</a-button>
|
||||||
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleType"
|
<a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleType"
|
||||||
preIcon="tabler:settings">配置服务类型</a-button>
|
preIcon="tabler:settings">配置服务类型</a-button>
|
||||||
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleBodyTag"
|
<a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleBodyTag"
|
||||||
preIcon="tabler:settings">配置体型标签</a-button>
|
preIcon="tabler:settings">配置体型标签</a-button>
|
||||||
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleEmotionTag"
|
<a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleEmotionTag"
|
||||||
preIcon="tabler:settings">配置情绪标签</a-button>
|
preIcon="tabler:settings">配置情绪标签</a-button>
|
||||||
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleAdd"
|
<a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleAdd"
|
||||||
preIcon="ant-design:plus-outlined">新增服务指令</a-button>
|
preIcon="ant-design:plus-outlined">新增服务指令</a-button>
|
||||||
<!-- <a-button type="primary" v-auth="'serviceDirective:config_service_directive:exportXls'"
|
<!-- <a-button type="primary" v-auth="'serviceDirective:config_service_directive:exportXls'"
|
||||||
preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
|
@ -248,6 +241,11 @@ const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
canResize: false,
|
canResize: false,
|
||||||
useSearchForm: false,
|
useSearchForm: false,
|
||||||
showIndexColumn: true,
|
showIndexColumn: true,
|
||||||
|
pagination: {
|
||||||
|
current: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
pageSizeOptions: ['10', '20', '50', '100'],
|
||||||
|
},
|
||||||
actionColumn: {
|
actionColumn: {
|
||||||
width: 160,
|
width: 160,
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
|
@ -511,4 +509,8 @@ audio::-webkit-media-controls-current-time-display,
|
||||||
audio::-webkit-media-controls-time-remaining-display {
|
audio::-webkit-media-controls-time-remaining-display {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.btnPrivate{
|
||||||
|
height: 34px;
|
||||||
|
margin-left: 4px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -158,13 +158,13 @@
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="语音文件" v-bind="validateInfos.mp3File" id="ConfigServiceDirectiveForm-mp3File"
|
<a-form-item label="语音文件" v-bind="validateInfos.mp3File" id="ConfigServiceDirectiveForm-mp3File"
|
||||||
name="mp3File">
|
name="mp3File">
|
||||||
<j-upload v-model:value="formData.mp3File" accept=".mp3" :disabled="true" :maxCount="1"></j-upload>
|
<j-upload v-model:value="formData.mp3File" accept=".mp3" :maxCount="1"></j-upload>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="12">
|
<a-col :span="12">
|
||||||
<a-form-item label="视频文件" v-bind="validateInfos.mp4File" id="ConfigServiceDirectiveForm-mp4File"
|
<a-form-item label="视频文件" v-bind="validateInfos.mp4File" id="ConfigServiceDirectiveForm-mp4File"
|
||||||
name="mp4File">
|
name="mp4File">
|
||||||
<j-upload v-model:value="formData.mp4File" accept=".mp4" :disabled="true" :maxCount="1"></j-upload>
|
<j-upload v-model:value="formData.mp4File" accept=".mp4" :maxCount="1"></j-upload>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
</div>
|
</div>
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
|
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
|
||||||
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
|
<a-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
|
||||||
<a-col :span="4">
|
<a-col :span="4">
|
||||||
<div class="bjclass">
|
<div class="bjclass">
|
||||||
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
|
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
|
||||||
|
|
Loading…
Reference in New Issue