Merge branch 'dev' of github.com:jetlinks/jetlinks-ui-vue into dev

This commit is contained in:
JiangQiming 2023-03-03 15:36:57 +08:00
commit 27a2fc7fb9
59 changed files with 1661 additions and 673 deletions

View File

@ -52,3 +52,8 @@ export const settingDetail = (scopes: string) => server.get(`/system/config/${sc
*
*/
export const userDetail = () => server.get<any>('/user/detail')
/**
* 退
*/
export const loginout_api = () => server.get<any>('/user-token/reset')

View File

@ -35,3 +35,12 @@ export const save = (data:any) =>server.post('/alarm/config',data);
*
*/
export const detail = (id:string) => server.get(`/alarm/config/${id}`);
/**
*
*/
export const unbindScene = (id:string,data:any) => server.post(`/alarm/rule/bind/${id}/_delete`,data);
/**
*
*/
export const bindScene = (data:any) => server.patch("/alarm/rule/bind",data)

View File

@ -1,38 +1,49 @@
<template>
<j-pro-layout
v-bind='layoutConf'
v-bind="layoutConf"
v-model:openKeys="state.openKeys"
v-model:collapsed="state.collapsed"
v-model:selectedKeys="state.selectedKeys"
:pure='state.pure'
:breadcrumb='{ routes: breadcrumb }'
:pure="state.pure"
:breadcrumb="{ routes: breadcrumb }"
>
<template #breadcrumbRender='slotProps'>
<a v-if='slotProps.route.index !== 0'>{{slotProps.route.breadcrumbName}}</a>
<template #breadcrumbRender="slotProps">
<a v-if="slotProps.route.index !== 0">{{
slotProps.route.breadcrumbName
}}</a>
<span v-else>{{ slotProps.route.breadcrumbName }}</span>
</template>
<router-view v-slot='{ Component}'>
<component :is='Component' />
<template #rightContentRender>
<div style="margin-right: 24px;display: flex;align-items: center;">
<AIcon type="QuestionCircleOutlined" @click="toDoc" />
<Notice style="margin: 0 24px;" />
<UserInfo />
</div>
</template>
<router-view v-slot="{ Component }">
<component :is="Component" />
</router-view>
</j-pro-layout>
</template>
<script setup lang="ts" name='BasicLayoutPage'>
import DefaultSetting from '../../../config/config'
import { useMenuStore } from '@/store/menu'
import { clearMenuItem } from 'jetlinks-ui-components/es/ProLayout/util'
<script setup lang="ts" name="BasicLayoutPage">
import UserInfo from './components/UserInfo.vue';
import Notice from './components/Notice.vue'
import DefaultSetting from '../../../config/config';
import { useMenuStore } from '@/store/menu';
import { clearMenuItem } from 'jetlinks-ui-components/es/ProLayout/util';
type StateType = {
collapsed: boolean
openKeys: string[]
selectedKeys: string[]
pure: boolean
}
collapsed: boolean;
openKeys: string[];
selectedKeys: string[];
pure: boolean;
};
const router = useRouter()
const route = useRoute()
const router = useRouter();
const route = useRoute();
const menu = useMenuStore()
const menu = useMenuStore();
const layoutConf = reactive({
theme: DefaultSetting.layout.theme,
@ -40,7 +51,7 @@ const layoutConf = reactive({
logo: DefaultSetting.layout.logo,
title: DefaultSetting.layout.title,
menuData: clearMenuItem(menu.siderMenus),
splitMenus: true
splitMenus: true,
});
const state = reactive<StateType>({
@ -55,30 +66,37 @@ const breadcrumb = computed(() =>
return {
index,
path: item.path,
breadcrumbName: item.meta.title || ''
}
})
)
breadcrumbName: item.meta.title || '',
};
}),
);
watchEffect(() => {
if (router.currentRoute) {
const matched = router.currentRoute.value.matched.concat()
state.selectedKeys = matched.map(r => r.path)
state.openKeys = matched.filter((r) => r.path !== router.currentRoute.value.path).map(r => r.path)
console.log(state.selectedKeys)
const matched = router.currentRoute.value.matched.concat();
state.selectedKeys = matched.map((r) => r.path);
state.openKeys = matched
.filter((r) => r.path !== router.currentRoute.value.path)
.map((r) => r.path);
console.log(state.selectedKeys);
}
// TODO pure
})
});
watchEffect(() => {
if (route.query && 'layout' in route.query && route.query.layout === 'false') {
state.pure = true
if (
route.query &&
'layout' in route.query &&
route.query.layout === 'false'
) {
state.pure = true;
} else {
state.pure = false
state.pure = false;
}
})
});
const toDoc = ()=>window.open('http://doc.v2.jetlinks.cn/')
</script>
<style scoped>
</style>
<style scoped></style>

View File

@ -0,0 +1,31 @@
<template>
<div>
<a-dropdown :trigger="['click']">
<div style="height: 48px; display: flex; display: flex">
<AIcon type="BellOutlined" @click.prevent />
</div>
<template #overlay>
<div class="content">
<NoticeInfo />
</div>
</template>
</a-dropdown>
</div>
</template>
<script setup lang="ts">
import { getList_api } from '@/api/account/notificationRecord';
import NoticeInfo from './NoticeInfo.vue';
const getList = () => {
const params = {
'terms[0].column': 'state',
'terms[0].value': 'unread',
'sorts[0].name': 'notifyTime',
'sorts[0].order': 'desc',
};
getList_api(params).then((resp) => {});
};
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,24 @@
<template>
<div class="notice-info-container">
<a-tabs :activeKey="'default'">
<a-tab-pane key="default" tab="未读消息"> 111 </a-tab-pane>
</a-tabs>
</div>
</template>
<script setup lang="ts"></script>
<style lang="less" scoped>
.notice-info-container {
width: 336px;
background-color: #fff;
border-radius: 4px;
box-shadow: 0 6px 16px -8px rgb(0 0 0 / 8%), 0 9px 28px 0 rgb(0 0 0 / 5%),
0 12px 48px 16px rgb(0 0 0 / 3%);
:deep(.ant-tabs-nav-wrap) {
display: flex;
justify-content: center;
}
}
</style>

View File

@ -0,0 +1,45 @@
<template>
<div>
<a-dropdown placement="bottomRight">
<div style="cursor: pointer;height: 100%;">
<img
:src="userInfo.avatar"
alt=""
style="width: 24px; margin-right: 12px"
/>
<span>{{ userInfo.name }}</span>
</div>
<template #overlay>
<a-menu>
<a-menu-item @click="jumpPage('account/center')" style="width: 160px;">
<AIcon type="UserOutlined" />
<span>个人中心</span>
</a-menu-item>
<a-menu-item @click="logOut">
<AIcon type="LogoutOutlined" />
<span>退出登录</span>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</div>
</template>
<script setup lang="ts">
import { loginout_api } from '@/api/login';
import { useMenuStore } from '@/store/menu';
import { useUserInfo } from '@/store/userInfo';
const userInfo = useUserInfo().$state.userInfos as any;
const { jumpPage } = useMenuStore();
const logOut = () => {
loginout_api().then(() => {
localStorage.clear();
jumpPage('user/login');
});
};
</script>
<style scoped></style>

View File

@ -35,3 +35,13 @@ export const useAlarmStore = defineStore('alarm',()=>{
data
}
})
export const useAlarmConfigurationStore = defineStore('alarmConfigration', () => {
const configurationData = reactive({
current:{
}
})
return { configurationData }
})

View File

@ -5,50 +5,55 @@
width="1000px"
@ok="emits('update:visible', false)"
@cancel="emits('update:visible', false)"
class="view-dialog-container"
>
<a-row v-if="data?.targetType === 'device'">
<a-col :span="6" class="label">告警设备</a-col>
<a-col :span="6" class="value">
<a-col :span="4" class="label">告警设备</a-col>
<a-col :span="8" class="value">
{{ data?.targetName || '' }}
</a-col>
<a-col :span="6" class="label">设备ID</a-col>
<a-col :span="6" class="value">
<a-col :span="4" class="label">设备ID</a-col>
<a-col :span="8" class="value">
{{ data?.targetId || '' }}
</a-col>
</a-row>
<a-row>
<a-col :span="6" class="label">告警名称</a-col>
<a-col :span="6" class="value">
<a-col :span="4" class="label">告警名称</a-col>
<a-col :span="8" class="value">
{{ data?.alarmName || data?.alarmConfigName || '' }}
</a-col>
<a-col :span="6" class="label">告警时间</a-col>
<a-col :span="6" class="value">
<a-col :span="4" class="label">告警时间</a-col>
<a-col :span="8" class="value">
{{ moment(data?.alarmTime).format('YYYY-MM-DD HH:mm:ss') }}
</a-col>
<a-col :span="6" class="label">告警级别</a-col>
<a-col :span="6" class="value">
<a-col :span="4" class="label">告警级别</a-col>
<a-col :span="8" class="value">
{{ (levelList.length > 0 && getLevelLabel(data.level)) || '' }}
</a-col>
<a-col :span="6" class="label">告警说明</a-col>
<a-col :span="6" class="value">{{ data?.description || '' }}</a-col>
<a-col :span="4" class="label">告警说明</a-col>
<a-col :span="8" class="value">{{ data?.description || '' }}</a-col>
<a-col :span="6" class="label">告警流水</a-col>
<a-col :span="18" class="value">
<!-- <MonacoEditor
style="width: 100%; height: 370px"
theme="vs"
v-model="jsonData"
/> -->
<JsonViewer :value="jsonData" copyable boxed sort />
<a-col
:span="4"
class="label"
style="display: flex; height: 440px; align-items: center"
>告警流水</a-col
>
<a-col
:span="20"
class="value"
style="max-height: 440px; overflow: auto"
>
<JsonViewer :value="JSON.parse(data?.alarmInfo || '{}')" />
</a-col>
</a-row>
</a-modal>
</template>
<script setup lang="ts">
import MonacoEditor from '@/components/MonacoEditor/index.vue';
import { JsonViewer } from 'vue3-json-viewer';
import 'vue3-json-viewer/dist/index.css';
import { queryLevel as queryLevel_api } from '@/api/rule-engine/config';
import moment from 'moment';
@ -69,18 +74,25 @@ const getLevel = () => {
});
};
getLevel();
const getLevelLabel = (id: string) => {
const getLevelLabel = (id: number) => {
if (levelList.value.length < 1 || !id) return '';
const obj = levelList.value.find((item) => item.id === id);
return obj.title;
const obj = levelList.value.find((item) => item.level === id);
return obj?.title;
};
const jsonData = JSON.stringify({
name: 'qiu',
age: 18,
isMan: false,
arr: [1, 2, 5],
});
</script>
<style scoped></style>
<style lang="less" scoped>
.view-dialog-container {
.ant-row {
.ant-col {
padding: 16px 24px;
border-right: 1px solid #f0f0f0;
}
.label {
background-color: #fafafa;
}
.value {
}
}
}
</style>

View File

@ -3,7 +3,7 @@
<div class="notification-record-container">
<Search :columns="columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="columns"
:request="getList_api"
@ -78,7 +78,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<ViewDialog v-if="viewVisible" v-model:visible="viewVisible" :data="viewItem" />
</div>

View File

@ -2,7 +2,7 @@
<page-container>
<div class="notification-subscription-container">
<Search :columns="columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="columns"
:request="getNoticeList_api"
@ -87,7 +87,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<EditDialog
v-if="dialogVisible"

View File

@ -1,6 +1,6 @@
<template>
<a-card>
<j-card>
<div>
<div class="top">
<div class="top-left">
@ -25,9 +25,9 @@
</div>
<div>
脚本语言:
<a-select :defaultValue="'JavaScript'" style="width: 200;margin-left: 5px;">
<a-select-option value="JavaScript">JavaScript(ECMAScript 5)</a-select-option>
</a-select>
<j-select :defaultValue="'JavaScript'" style="width: 200;margin-left: 5px;">
<j-select-option value="JavaScript">JavaScript(ECMAScript 5)</j-select-option>
</j-select>
<AIcon type="ExpandOutlined" style="margin-left: 20px;" @click="toggle" />
</div>
</div>
@ -42,7 +42,7 @@
})
}"></div>
<MonacoEditor language="javascript" style="height: 100%;" theme="vs" v-model:modelValue="editorValue" />
<j-monaco-editor language="javascript" style="height: 100%;" theme="vs" v-model:modelValue="editorValue" />
</div>
<div class="bottom">
<div style="width: 49.5%;">
@ -51,25 +51,25 @@
<div class="bottom-title-topic">
<template v-if="instanceStore.current.transport === 'MQTT'">
<div style="margin-right: 5px;">Topic:</div>
<a-auto-complete placeholder="请输入Topic" style="width: 300px" :options="topicList"
<j-auto-complete placeholder="请输入Topic" style="width: 300px" :options="topicList"
:allowClear="true" :filterOption="(inputValue: any, option: any) =>
option!.value.indexOf(inputValue) !== -1" v-model:value="topic" />
</template>
<template v-else>
<div style="margin-right: 5px;">URL:</div>
<a-input placeholder="请输入URL" v-model:value="url" style="width: 300px"></a-input>
<j-input placeholder="请输入URL" v-model:value="url" style="width: 300px"></j-input>
</template>
</div>
</div>
<a-textarea :rows="5" placeholder="// 二进制数据以0x开头的十六进制输入字符串数据输入原始字符串" style="margin-top: 10px;"
<j-textarea :rows="5" placeholder="// 二进制数据以0x开头的十六进制输入字符串数据输入原始字符串" style="margin-top: 10px;"
v-model:value="simulation" />
</div>
<div style="width: 49.5%;">
<div class="bottom-title">
<div class="bottom-title-text">运行结果</div>
</div>
<a-textarea :autoSize="{ minRows: 5 }" :style="resStyle" v-model:value="result" />
<j-textarea :autoSize="{ minRows: 5 }" :style="resStyle" v-model:value="result" />
</div>
</div>
</div>
@ -87,13 +87,13 @@
保存
</PermissionButton>
</div>
</a-card>
</j-card>
</template>
<script setup lang='ts' name="Parsing">
import AIcon from '@/components/AIcon'
import PermissionButton from '@/components/PermissionButton/index.vue'
import MonacoEditor from '@/components/MonacoEditor/index.vue';
// import MonacoEditor from '@/components/MonacoEditor/index.vue';
import { useFullscreen } from '@vueuse/core'
import { useInstanceStore } from '@/store/instance';
import {

View File

@ -1,18 +1,18 @@
<template>
<a-card>
<j-card>
<div>
<div class="top">
<div>
脚本语言:
<a-select :defaultValue="'JavaScript'" style="width: 200;margin-left: 5px;">
<a-select-option value="JavaScript">JavaScript(ECMAScript 5)</a-select-option>
</a-select>
<j-select :defaultValue="'JavaScript'" style="width: 200;margin-left: 5px;">
<j-select-option value="JavaScript">JavaScript(ECMAScript 5)</j-select-option>
</j-select>
<AIcon type="ExpandOutlined" style="margin-left: 20px;" @click="toggle" />
</div>
</div>
<div class="edit" ref="el">
<MonacoEditor language="javascript" style="height: 100%;" theme="vs" v-model:modelValue="editorValue" />
<j-monaco-editor language="javascript" style="height: 100%;" theme="vs" v-model:modelValue="editorValue" />
</div>
<div class="bottom">
<div style="width: 49.5%;">
@ -21,25 +21,25 @@
<div class="bottom-title-topic">
<template v-if="productStore.current.transportProtocol === 'MQTT'">
<div style="margin-right: 5px;">Topic:</div>
<a-auto-complete placeholder="请输入Topic" style="width: 300px" :options="topicList"
<j-auto-complete placeholder="请输入Topic" style="width: 300px" :options="topicList"
:allowClear="true" :filterOption="(inputValue: any, option: any) =>
option!.value.indexOf(inputValue) !== -1" v-model:value="topic" />
</template>
<template v-else>
<div style="margin-right: 5px;">URL:</div>
<a-input placeholder="请输入URL" v-model:value="url" style="width: 300px"></a-input>
<j-input placeholder="请输入URL" v-model:value="url" style="width: 300px"></j-input>
</template>
</div>
</div>
<a-textarea :rows="5" placeholder="// 二进制数据以0x开头的十六进制输入字符串数据输入原始字符串" style="margin-top: 10px;"
<j-textarea :rows="5" placeholder="// 二进制数据以0x开头的十六进制输入字符串数据输入原始字符串" style="margin-top: 10px;"
v-model:value="simulation" />
</div>
<div style="width: 49.5%;">
<div class="bottom-title">
<div class="bottom-title-text">运行结果</div>
</div>
<a-textarea :autoSize="{ minRows: 5 }" :style="resStyle" v-model:value="result" />
<j-textarea :autoSize="{ minRows: 5 }" :style="resStyle" v-model:value="result" />
</div>
</div>
</div>
@ -57,13 +57,13 @@
保存
</PermissionButton>
</div>
</a-card>
</j-card>
</template>
<script setup lang='ts' name="DataAnalysis">
import AIcon from '@/components/AIcon'
import PermissionButton from '@/components/PermissionButton/index.vue'
import MonacoEditor from '@/components/MonacoEditor/index.vue';
// import MonacoEditor from '@/components/MonacoEditor/index.vue';
import { useFullscreen } from '@vueuse/core'
import { useProductStore } from '@/store/product';
import {

View File

@ -1,6 +1,6 @@
<!-- 绑定设备 -->
<template>
<a-modal
<j-modal
:maskClosable="false"
width="1100px"
:visible="true"
@ -18,7 +18,7 @@
@search="handleSearch"
type="simple"
/>
<JTable
<j-pro-table
ref="bindDeviceRef"
:columns="columns"
:request="queryUnbounded"
@ -44,14 +44,14 @@
}}
</template>
<template #state="slotProps">
<a-badge
<j-badge
:text="slotProps.state.text"
:status="statusMap.get(slotProps.state.value)"
/>
</template>
</JTable>
</j-pro-table>
</div>
</a-modal>
</j-modal>
</template>
<script setup lang="ts">

View File

@ -8,15 +8,15 @@
:data="current"
@change="saveChange"
/>
<a-row :gutter="[24, 24]">
<a-col :span="24">
<a-card>
<a-descriptions size="small" :column="3" bordered>
<j-row :gutter="[24, 24]">
<j-col :span="24">
<j-card>
<j-descriptions size="small" :column="3" bordered>
<template #title>
<Guide>
<template #title>
<span>基本信息</span>
<a-button
<j-button
type="link"
@click="
() => {
@ -28,74 +28,74 @@
>
<AIcon type="EditOutlined"></AIcon>
编辑
</a-button>
</j-button>
</template>
</Guide>
</template>
<a-descriptions-item label="卡号">{{
<j-descriptions-item label="卡号">{{
detail.id
}}</a-descriptions-item>
<a-descriptions-item label="ICCID">{{
}}</j-descriptions-item>
<j-descriptions-item label="ICCID">{{
detail.iccId
}}</a-descriptions-item>
<a-descriptions-item label="绑定设备">{{
}}</j-descriptions-item>
<j-descriptions-item label="绑定设备">{{
detail.deviceName
}}</a-descriptions-item>
<a-descriptions-item label="平台类型">{{
}}</j-descriptions-item>
<j-descriptions-item label="平台类型">{{
detail.operatorPlatformType?.text
}}</a-descriptions-item>
<a-descriptions-item label="平台名称">{{
}}</j-descriptions-item>
<j-descriptions-item label="平台名称">{{
detail.platformConfigName
}}</a-descriptions-item>
<a-descriptions-item label="运营商">{{
}}</j-descriptions-item>
<j-descriptions-item label="运营商">{{
detail.operatorName
}}</a-descriptions-item>
<a-descriptions-item label="类型">{{
}}</j-descriptions-item>
<j-descriptions-item label="类型">{{
detail.cardType?.text
}}</a-descriptions-item>
<a-descriptions-item label="激活日期">{{
}}</j-descriptions-item>
<j-descriptions-item label="激活日期">{{
detail.activationDate
? moment(detail.activationDate).format(
'YYYY-MM-DD HH:mm:ss',
)
: ''
}}</a-descriptions-item>
<a-descriptions-item label="更新时间">{{
}}</j-descriptions-item>
<j-descriptions-item label="更新时间">{{
detail.updateTime
? moment(detail.updateTime).format(
'YYYY-MM-DD HH:mm:ss',
)
: ''
}}</a-descriptions-item>
<a-descriptions-item label="总流量">{{
}}</j-descriptions-item>
<j-descriptions-item label="总流量">{{
detail.totalFlow
? detail.totalFlow.toFixed(2) + ' M'
: ''
}}</a-descriptions-item>
<a-descriptions-item label="使用流量">{{
}}</j-descriptions-item>
<j-descriptions-item label="使用流量">{{
detail.usedFlow
? detail.usedFlow.toFixed(2) + ' M'
: ''
}}</a-descriptions-item>
<a-descriptions-item label="剩余流量">{{
}}</j-descriptions-item>
<j-descriptions-item label="剩余流量">{{
detail.residualFlow
? detail.residualFlow.toFixed(2) + ' M'
: ''
}}</a-descriptions-item>
<a-descriptions-item label="状态">{{
}}</j-descriptions-item>
<j-descriptions-item label="状态">{{
detail?.cardState?.text
}}</a-descriptions-item>
<a-descriptions-item label="说明">{{
}}</j-descriptions-item>
<j-descriptions-item label="说明">{{
detail?.describe
}}</a-descriptions-item>
</a-descriptions>
</a-card>
</a-col>
<a-col :span="24">
}}</j-descriptions-item>
</j-descriptions>
</j-card>
</j-col>
<j-col :span="24">
<!-- 流量统计 -->
<a-row :gutter="24">
<a-col :span="16">
<j-row :gutter="24">
<j-col :span="16">
<div class="card">
<Guide title="流量统计">
<template #extra>
@ -113,15 +113,15 @@
:chartData="flowData"
/>
</div>
</a-col>
<a-col :span="8">
</j-col>
<j-col :span="8">
<div class="card">
<Guide title="数据统计" />
<div class="static-info" style="min-height: 490px">
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">昨日流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ dayTotal }} M</span>
</template>
@ -129,7 +129,7 @@
{{ dayTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart
color="#FBA500"
@ -139,7 +139,7 @@
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">当月流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ monthTotal }} M</span>
</template>
@ -147,14 +147,14 @@
{{ monthTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart :chartData="monthOptions" />
</div>
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">本年流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ yearTotal }} M</span>
</template>
@ -162,7 +162,7 @@
{{ yearTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart
color="#58E1D3"
@ -171,10 +171,10 @@
</div>
</div>
</div>
</a-col>
</a-row>
</a-col>
</a-row>
</j-col>
</j-row>
</j-col>
</j-row>
</page-container>
</template>

View File

@ -1,6 +1,6 @@
<template>
<!-- 导入 -->
<a-modal
<j-modal
:maskClosable="false"
:visible="true"
title="导入"
@ -10,30 +10,30 @@
@cancel="handleCancel"
>
<div style="margin-top: 10px">
<a-form :layout="'vertical'">
<a-form-item label="平台对接" required>
<a-select
<j-form :layout="'vertical'">
<j-form-item label="平台对接" required>
<j-select
showSearch
v-model:value="modelRef.configId"
:options="configList"
placeholder="请选择平台对接"
>
</a-select>
</a-form-item>
</j-select>
</j-form-item>
<a-form-item v-if="modelRef.configId" label="文件格式">
<a-radio-group
<j-form-item v-if="modelRef.configId" label="文件格式">
<j-radio-group
button-style="solid"
v-model:value="modelRef.fileType"
placeholder="请选择文件格式"
>
<a-radio-button value="xlsx">xlsx</a-radio-button>
<a-radio-button value="csv">csv</a-radio-button>
</a-radio-group>
</a-form-item>
<j-radio-button value="xlsx">xlsx</j-radio-button>
<j-radio-button value="csv">csv</j-radio-button>
</j-radio-group>
</j-form-item>
<a-form-item label="文件上传" v-if="modelRef.configId">
<a-upload
<j-form-item label="文件上传" v-if="modelRef.configId">
<j-upload
v-model:fileList="modelRef.upload"
name="file"
:action="FILE_UPLOAD"
@ -44,24 +44,24 @@
:showUploadList="false"
@change="fileChange"
>
<a-button :loading="loading">
<j-button :loading="loading">
<template #icon>
<AIcon type="UploadOutlined" />
</template>
文件上传
</a-button>
</a-upload>
</a-form-item>
<a-form-item v-if="modelRef.configId" label="下载模板">
<a-space>
<a-button icon="file" @click="downFileFn('xlsx')">
</j-button>
</j-upload>
</j-form-item>
<j-form-item v-if="modelRef.configId" label="下载模板">
<j-space>
<j-button icon="file" @click="downFileFn('xlsx')">
.xlsx
</a-button>
<a-button icon="file" @click="downFileFn('csv')">
</j-button>
<j-button icon="file" @click="downFileFn('csv')">
.csv
</a-button>
</a-space>
</a-form-item>
</j-button>
</j-space>
</j-form-item>
<div v-if="totalCount">
<a-icon class="check-num" type="check" /> 已完成 总数量
<span class="check-num">{{ totalCount }}</span>
@ -71,9 +71,9 @@
失败 总数量
<span class="check-num">{{ errCount }}</span>
</div>
</a-form>
</j-form>
</div>
</a-modal>
</j-modal>
</template>
<script setup lang="ts">

View File

@ -1,5 +1,5 @@
<template>
<a-modal
<j-modal
:maskClosable="false"
width="600px"
:visible="true"
@ -11,39 +11,39 @@
:confirmLoading="btnLoading"
>
<div style="margin-top: 10px">
<a-form
<j-form
:layout="'vertical'"
ref="formRef"
:rules="rules"
:model="modelRef"
>
<a-form-item label="卡号" name="id">
<a-input
<j-form-item label="卡号" name="id">
<j-input
v-model:value="modelRef.id"
placeholder="请输入卡号"
:disabled="type === 'edit'"
></a-input>
</a-form-item>
<a-form-item name="iccId">
></j-input>
</j-form-item>
<j-form-item name="iccId">
<template #label>
<span>
ICCID
<a-tooltip title="IC卡的唯一识别号码">
<j-tooltip title="IC卡的唯一识别号码">
<AIcon
type="QuestionCircleOutlined"
style="margin-left: 2px"
/>
</a-tooltip>
</j-tooltip>
</span>
</template>
<a-input
<j-input
v-model:value="modelRef.iccId"
placeholder="请输入ICCID"
:disabled="type === 'edit'"
/>
</a-form-item>
<a-form-item label="平台对接" name="platformConfigId">
<a-select
</j-form-item>
<j-form-item label="平台对接" name="platformConfigId">
<j-select
showSearch
:filter-option="filterOption"
:disabled="type === 'edit'"
@ -52,11 +52,11 @@
v-model:value="modelRef.platformConfigId"
placeholder="请选择平台对接"
>
</a-select>
</a-form-item>
</j-select>
</j-form-item>
<a-form-item label="运营商" name="operatorName">
<a-select
<j-form-item label="运营商" name="operatorName">
<j-select
allowClear
showSearch
:filter-option="filterOption"
@ -64,10 +64,10 @@
v-model:value="modelRef.operatorName"
placeholder="请选择运营商"
>
</a-select>
</a-form-item>
<a-form-item label="类型" name="cardType">
<a-select
</j-select>
</j-form-item>
<j-form-item label="类型" name="cardType">
<j-select
allowClear
showSearch
:disabled="type === 'edit'"
@ -76,19 +76,19 @@
v-model:value="modelRef.cardType"
placeholder="请选择类型"
>
</a-select>
</a-form-item>
<a-form-item label="说明" name="describe">
<a-textarea
</j-select>
</j-form-item>
<j-form-item label="说明" name="describe">
<j-textarea
v-model:value="modelRef.describe"
placeholder="请输入说明"
showCount
:maxlength="200"
/>
</a-form-item>
</a-form>
</j-form-item>
</j-form>
</div>
</a-modal>
</j-modal>
</template>
<script lang="ts" setup>

View File

@ -2,37 +2,40 @@
<template>
<page-container>
<Search :columns="columns" target="iot-card-management-search" @search="handleSearch" />
<JTable ref="cardManageRef" :columns="columns" :request="query"
<j-pro-table ref="cardManageRef" :columns="columns" :request="query"
:defaultParams="{ sorts: [{ name: 'createTime', order: 'desc' }] }" :rowSelection="{
selectedRowKeys: _selectedRowKeys,
onChange: onSelectChange,
}" @cancelSelect="cancelSelect" :params="params" :gridColumn="3">
<template #headerTitle>
<a-space>
<a-button type="primary" @click="handleAdd">
<j-space>
<!-- <a-button type="primary" @click="handleAdd">
<AIcon type="PlusOutlined" />新增
</a-button>
<a-dropdown>
<a-button>
</a-button> -->
<PermissionButton @click="handleAdd" :hasPermission="'iot-card/CardManagement:add'" type="primary">
<AIcon type="PlusOutlined" />新增
</PermissionButton>
<j-dropdown>
<j-button>
批量操作
<AIcon type="DownOutlined" />
</a-button>
</j-button>
<template #overlay>
<a-menu>
<a-menu-item>
<j-menu>
<j-menu-item>
<PermissionButton @click="exportVisible = true"
:hasPermission="'iot-card/CardManagement:export'">
<AIcon type="ExportOutlined" />
批量导出
</PermissionButton>
</a-menu-item>
<a-menu-item>
</j-menu-item>
<j-menu-item>
<PermissionButton @click="importVisible = true"
:hasPermission="'iot-card/CardManagement:import'">
<AIcon type="ImportOutlined" />批量导入
</PermissionButton>
</a-menu-item>
<a-menu-item>
</j-menu-item>
<j-menu-item>
<PermissionButton :popConfirm="{
title: '确认激活吗?',
onConfirm: handleActive,
@ -40,8 +43,8 @@
<AIcon type="CheckCircleOutlined" />
批量激活
</PermissionButton>
</a-menu-item>
<a-menu-item>
</j-menu-item>
<j-menu-item>
<PermissionButton :popConfirm="{
title: '确认停用吗?',
onConfirm: handleStop,
@ -49,8 +52,8 @@
<AIcon type="StopOutlined" />
批量停用
</PermissionButton>
</a-menu-item>
<a-menu-item>
</j-menu-item>
<j-menu-item>
<PermissionButton :popConfirm="{
title: '确认复机吗?',
onConfirm: handleResumption,
@ -58,8 +61,8 @@
<AIcon type="PoweroffOutlined" />
批量复机
</PermissionButton>
</a-menu-item>
<a-menu-item>
</j-menu-item>
<j-menu-item>
<PermissionButton :popConfirm="{
title: '确认同步状态吗?',
onConfirm: handleSync,
@ -67,8 +70,8 @@
<AIcon type="SwapOutlined" />
同步状态
</PermissionButton>
</a-menu-item>
<a-menu-item v-if="_selectedRowKeys.length > 0">
</j-menu-item>
<j-menu-item v-if="_selectedRowKeys.length > 0">
<PermissionButton :popConfirm="{
title: '确认删除吗?',
onConfirm: handelRemove,
@ -76,11 +79,11 @@
<AIcon type="SwapOutlined" />
批量删除
</PermissionButton>
</a-menu-item>
</a-menu>
</j-menu-item>
</j-menu>
</template>
</a-dropdown>
</a-space>
</j-dropdown>
</j-space>
</template>
<template #card="slotProps">
<CardBox :value="slotProps" @click="handleClick" :actions="getActions(slotProps, 'card')" v-bind="slotProps"
@ -99,23 +102,23 @@
<h3 class="card-item-content-title">
{{ slotProps.id }}
</h3>
<a-row>
<a-col :span="8">
<j-row>
<j-col :span="8">
<div class="card-item-content-text">
平台对接
</div>
<div>{{ slotProps.platformConfigName }}</div>
</a-col>
<a-col :span="6">
</j-col>
<j-col :span="6">
<div class="card-item-content-text">类型</div>
<div>{{ slotProps.cardType.text }}</div>
</a-col>
<a-col :span="6">
</j-col>
<j-col :span="6">
<div class="card-item-content-text">提醒</div>
<!-- <div>{{ slotProps.cardType.text }}</div> -->
</a-col>
</a-row>
<a-divider style="margin: 12px 0" />
</j-col>
</j-row>
<j-divider style="margin: 12px 0" />
<div v-if="slotProps.usedFlow === 0">
<span class="flow-text">
{{ slotProps.totalFlow }}
@ -135,7 +138,7 @@
总共 {{ slotProps.totalFlow }} M
</div>
</div>
<a-progress :strokeColor="'#ADC6FF'" :showInfo="false" :percent="
<j-progress :strokeColor="'#ADC6FF'" :showInfo="false" :percent="
slotProps.totalFlow - slotProps.usedFlow
" />
</div>
@ -185,7 +188,7 @@
</template>
</a-button>
</template>
</a-tooltip> -->
</j-tooltip> -->
</template>
</CardBox>
</template>
@ -244,7 +247,7 @@
}}
</template>
<template #action="slotProps">
<a-space :size="16">
<j-space :size="16">
<template
v-for="i in getActions(slotProps,'table')"
:key="i.key"
@ -263,9 +266,9 @@
<template #icon><AIcon :type="i.icon" /></template>
</PermissionButton>
</template>
</a-space>
</j-space>
</template>
</JTable>
</j-pro-table>
<!-- 批量导入 -->
<Import v-if="importVisible" @close="importVisible = false" />
<!-- 批量导出 -->

View File

@ -2,14 +2,14 @@
<template>
<page-container>
<div class="card-dashboard-container">
<a-card style="margin-bottom: 24px">
<a-row :gutter="24">
<a-col :span="24"><Guide title="数据统计" /></a-col>
<a-col :span="8">
<j-card style="margin-bottom: 24px">
<j-row :gutter="24">
<j-col :span="24"><Guide title="数据统计" /></j-col>
<j-col :span="8">
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">昨日流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ dayTotal }} M</span>
</template>
@ -17,19 +17,19 @@
{{ dayTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart
color="#FBA500"
:chartData="dayOptions"
/>
</div>
</a-col>
<a-col :span="8">
</j-col>
<j-col :span="8">
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">当月流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ monthTotal }} M</span>
</template>
@ -37,16 +37,16 @@
{{ monthTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart :chartData="monthOptions" />
</div>
</a-col>
<a-col :span="8">
</j-col>
<j-col :span="8">
<div class="data-statistics-item">
<div class="flow-info" style="width: 100%">
<div class="label">本年流量消耗</div>
<a-tooltip placement="bottomLeft">
<j-tooltip placement="bottomLeft">
<template #title>
<span>{{ yearTotal }} M</span>
</template>
@ -54,18 +54,18 @@
{{ yearTotal }}
<span class="unit">M</span>
</div>
</a-tooltip>
</j-tooltip>
</div>
<LineChart
color="#58E1D3"
:chartData="yearOptions"
/>
</div>
</a-col>
</a-row>
</a-card>
<a-row :gutter="24">
<a-col :span="16">
</j-col>
</j-row>
</j-card>
<j-row :gutter="24">
<j-col :span="16">
<div class="static-card">
<Guide title="流量统计">
<template #extra>
@ -85,11 +85,11 @@
:chartData="flowData"
/>
<div class="empty-body" v-else>
<a-empty :image="Empty.PRESENTED_IMAGE_SIMPLE" />
<j-empty :image="Empty.PRESENTED_IMAGE_SIMPLE" />
</div>
</div>
</a-col>
<a-col :span="8">
</j-col>
<j-col :span="8">
<div class="static-card">
<Guide title="流量使用TOP10">
<template #extra>
@ -118,7 +118,7 @@
</div>
<div class="cardNum">{{ item.cardNum }}</div>
<div class="progress">
<a-progress
<j-progress
:strokeColor="'#ADC6FF'"
:trailColor="'#E0E4E8'"
:strokeLinecap="'butt'"
@ -128,7 +128,7 @@
(item.value / topTotal) * 100,
)
"
></a-progress>
></j-progress>
</div>
<div class="total">
{{ item?.value?.toFixed(2) }} M
@ -136,11 +136,11 @@
</div>
</div>
<div class="empty-body" v-else>
<a-empty :image="Empty.PRESENTED_IMAGE_SIMPLE" />
<j-empty :image="Empty.PRESENTED_IMAGE_SIMPLE" />
</div>
</div>
</a-col>
</a-row>
</j-col>
</j-row>
</div>
</page-container>
</template>

View File

@ -1,8 +1,8 @@
<!-- 物联卡-首页 -->
<template>
<page-container>
<a-row :gutter="24">
<a-col :span="14">
<j-row :gutter="24">
<j-col :span="14">
<div class="home-guide">
<Guide title="物联卡引导"></Guide>
<div
@ -25,8 +25,8 @@
</div>
</div>
</div>
</a-col>
<a-col :span="10">
</j-col>
<j-col :span="10">
<div class="home-statistics">
<Guide title="基础统计">
<template #extra>
@ -71,8 +71,8 @@
</div>
</div>
</div>
</a-col>
<a-col :span="24" style="min-height: 580px">
</j-col>
<j-col :span="24" style="min-height: 580px">
<div class="home-body">
<Guide
title="平台架构图"
@ -82,22 +82,20 @@
<img :src="getImage('/iot-card/iotcard-home.png')" />
</div>
</div>
</a-col>
</a-row>
</j-col>
</j-row>
</page-container>
</template>
<script setup lang="ts">
import { getImage } from '@/utils/comm';
import Guide from '../components/Guide.vue';
import { message } from 'ant-design-vue';
import moment from 'moment';
import { queryFlow, list } from '@/api/iot-card/home';
import * as echarts from 'echarts';
import { useMenuStore } from '@/store/menu';
import { usePermissionStore } from '@/store/permission';
const router = useRouter();
const { proxy } = <any>getCurrentInstance();
interface GuideItemProps {

View File

@ -1,16 +1,16 @@
<template>
<page-container>
<a-card>
<a-row :gutter="24">
<a-col :span="14">
<j-card>
<j-row :gutter="24">
<j-col :span="14">
<TitleComponent data="详情" />
<a-form
<j-form
:layout="'vertical'"
ref="formRef"
:rules="rules"
:model="form"
>
<a-form-item
<j-form-item
label="平台类型"
name="operatorName"
required
@ -28,104 +28,104 @@
v-model:value="form.operatorName"
@change="typeChange"
></PlatformType
></a-form-item>
<a-form-item label="名称" name="name">
<a-input
></j-form-item>
<j-form-item label="名称" name="name">
<j-input
v-model:value="form.name"
placeholder="请输入名称"
/>
</a-form-item>
</j-form-item>
<!-- onelink -->
<div v-if="form.operatorName === 'onelink'">
<a-form-item label="App ID" name="appId">
<a-input
<j-form-item label="App ID" name="appId">
<j-input
v-model:value="form.appId"
placeholder="请输入App ID"
/>
</a-form-item>
<a-form-item label="Password" name="passWord">
<a-input-password
</j-form-item>
<j-form-item label="Password" name="passWord">
<j-input-password
v-model:value="form.passWord"
placeholder="请输入密码"
/>
</a-form-item>
<a-form-item label="接口地址" name="apiAddr">
<a-input
</j-form-item>
<j-form-item label="接口地址" name="apiAddr">
<j-input
v-model:value="form.apiAddr"
placeholder="请输入接口地址"
/>
</a-form-item>
</j-form-item>
</div>
<!-- ctwing -->
<div v-if="form.operatorName === 'ctwing'">
<a-form-item label="用户id" name="userId">
<a-input
<j-form-item label="用户id" name="userId">
<j-input
v-model:value="form.userId"
placeholder="请输入用户id"
/>
</a-form-item>
<a-form-item label="密码" name="passWord">
<a-input-password
</j-form-item>
<j-form-item label="密码" name="passWord">
<j-input-password
v-model:value="form.passWord"
placeholder="请输入密码"
/>
</a-form-item>
<a-form-item label="secretKey" name="secretKey">
<a-input
</j-form-item>
<j-form-item label="secretKey" name="secretKey">
<j-input
v-model:value="form.secretKey"
placeholder="请输入secretKey"
/>
</a-form-item>
</j-form-item>
</div>
<!-- unicom -->
<div v-if="form.operatorName === 'unicom'">
<a-form-item label="App ID" name="appId">
<a-input
<j-form-item label="App ID" name="appId">
<j-input
v-model:value="form.appId"
placeholder="请输入App ID"
/>
</a-form-item>
<a-form-item label="App Secret" name="appSecret">
<a-input
</j-form-item>
<j-form-item label="App Secret" name="appSecret">
<j-input
v-model:value="form.appSecret"
placeholder="请输入App Secret"
/>
</a-form-item>
<a-form-item label="创建者ID" name="openId">
<a-input
</j-form-item>
<j-form-item label="创建者ID" name="openId">
<j-input
v-model:value="form.openId"
placeholder="请输入创建者ID"
/>
</a-form-item>
</j-form-item>
</div>
<a-form-item label="说明" name="explain">
<a-textarea
<j-form-item label="说明" name="explain">
<j-textarea
v-model:value="form.explain"
placeholder="请输入说明"
showCount
:rows="3"
:maxlength="200"
/>
</a-form-item>
<a-form-item>
<a-divider />
<a-button
</j-form-item>
<j-form-item>
<j-divider />
<j-button
:loading="saveBtnLoading"
type="primary"
@click="handleSave"
>
保存
</a-button>
</a-form-item>
</a-form>
</a-col>
<a-col :span="10">
</j-button>
</j-form-item>
</j-form>
</j-col>
<j-col :span="10">
<Doc :type="form.operatorName" />
</a-col>
</a-row>
</a-card>
</j-col>
</j-row>
</j-card>
</page-container>
</template>

View File

@ -24,7 +24,7 @@
获取路径中移物联卡能力开放平台--个人中心--客户信息--接入信息
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/onelink-appid.png')"
/>
@ -37,7 +37,7 @@
获取路径中移物联卡能力开放平台--个人中心--客户信息--接入信息
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/onelink-pass.png')"
/>
@ -77,7 +77,7 @@
获取路径5G连接管理平台--能力开放--API网关账号管理
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/ctwing-id.png')"
/>
@ -90,7 +90,7 @@
获取路径5G连接管理平台--能力开放--API网关账号管理
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/ctwing-pass.png')"
/>
@ -103,7 +103,7 @@
获取路径5G连接管理平台--能力开放--API网关账号管理
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/ctwing-secret.png')"
/>
@ -137,7 +137,7 @@
获取路径雁飞智连CMP平台--我的应用--应用列表
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/unicom-id.png')"
/>
@ -150,7 +150,7 @@
获取路径雁飞智连CMP平台--我的应用--应用列表
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/unicom-secret.png')"
/>
@ -164,7 +164,7 @@
<br />
</p>
<div class="image">
<a-image
<j-image
width="100%"
:src="getImage('/iot-card/unicom-openid.png')"
/>

View File

@ -6,7 +6,7 @@
target="platform-search"
@search="handleSearch"
/>
<JTable
<j-pro-table
ref="platformRef"
:columns="columns"
:request="queryList"
@ -15,11 +15,14 @@
:gridColumn="3"
>
<template #headerTitle>
<a-space>
<a-button type="primary" @click="handleAdd">
<j-space>
<!-- <j-button type="primary" @click="handleAdd">
<AIcon type="PlusOutlined" />新增
</a-button>
</a-space>
</j-button> -->
<PermissionButton @click="handleAdd" :hasPermission="'iot-card/Platform:add'" type="primary">
<AIcon type="PlusOutlined" />新增
</PermissionButton>
</j-space>
</template>
<template #card="slotProps">
<CardBox
@ -42,18 +45,18 @@
<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.operatorName }}</div>
</a-col>
<a-col :span="12">
</j-col>
<j-col :span="12">
<div class="card-item-content-text">说明</div>
<div>{{ slotProps.explain }}</div>
</a-col>
</a-row>
</j-col>
</j-row>
</template>
<template #actions="item">
<PermissionButton :disabled="item.disabled" :popConfirm="item.popConfirm" :tooltip="{
@ -69,7 +72,7 @@
</CardBox>
</template>
<template #state="slotProps">
<a-badge
<j-badge
:text="slotProps.state.text"
:status="
slotProps.state.value === 'disabled'
@ -79,7 +82,7 @@
/>
</template>
<template #action="slotProps">
<a-space :size="16">
<j-space :size="16">
<template
v-for="i in getActions(slotProps,'table')"
:key="i.key"
@ -98,9 +101,9 @@
<template #icon><AIcon :type="i.icon" /></template>
</PermissionButton>
</template>
</a-space>
</j-space>
</template>
</JTable>
</j-pro-table>
</page-container>
</template>

View File

@ -1,5 +1,5 @@
<template>
<a-modal
<j-modal
:maskClosable="false"
width="1000px"
:visible="true"
@ -10,40 +10,40 @@
@cancel="handleCancel"
>
<div style="margin-top: 10px">
<a-descriptions
<j-descriptions
:column="2"
bordered
:contentStyle="{ minWidth: '300px' }"
:labelStyle="{ minWidth: '120px' }"
>
<a-descriptions-item label="充值金额">{{
<j-descriptions-item label="充值金额">{{
data.chargeMoney
}}</a-descriptions-item>
<a-descriptions-item label="账户id">{{
}}</j-descriptions-item>
<j-descriptions-item label="账户id">{{
data?.rechargeId
}}</a-descriptions-item>
<a-descriptions-item label="平台对接">{{
}}</j-descriptions-item>
<j-descriptions-item label="平台对接">{{
data.configName
}}</a-descriptions-item>
<a-descriptions-item label="订单号">{{
}}</j-descriptions-item>
<j-descriptions-item label="订单号">{{
data.orderNumber
}}</a-descriptions-item>
<a-descriptions-item label="支付方式">{{
}}</j-descriptions-item>
<j-descriptions-item label="支付方式">{{
data.paymentType
}}</a-descriptions-item>
<a-descriptions-item label="支付URL">
}}</j-descriptions-item>
<j-descriptions-item label="支付URL">
<div style="height: 100px; overflow: auto">
{{ data.url ? data.url : '' }}
</div>
</a-descriptions-item>
<a-descriptions-item label="订单时间">{{
</j-descriptions-item>
<j-descriptions-item label="订单时间">{{
data.createTime
? moment(data.createTime).format('YYYY-MM-DD HH:mm:ss')
: '-'
}}</a-descriptions-item>
</a-descriptions>
}}</j-descriptions-item>
</j-descriptions>
</div>
</a-modal>
</j-modal>
</template>
<script lang="ts" setup>

View File

@ -1,5 +1,5 @@
<template>
<a-modal
<j-modal
:maskClosable="false"
width="600px"
:visible="true"
@ -17,14 +17,14 @@
style="margin-right: 6px"
/>OneLink
</div>
<a-form
<j-form
layout="vertical"
ref="formRef"
:rules="rules"
:model="modelRef"
>
<a-form-item label="平台对接" name="configId">
<a-select
<j-form-item label="平台对接" name="configId">
<j-select
v-model:value="modelRef.configId"
:options="configList"
allowClear
@ -32,16 +32,16 @@
style="width: 100%"
placeholder="请选择平台对接"
>
</a-select>
</a-form-item>
<a-form-item label="账户id" name="rechargeId">
<a-input
</j-select>
</j-form-item>
<j-form-item label="账户id" name="rechargeId">
<j-input
v-model:value="modelRef.rechargeId"
placeholder="请输入账户id"
/>
</a-form-item>
<a-form-item label="充值金额" name="chargeMoney">
<a-input-number
</j-form-item>
<j-form-item label="充值金额" name="chargeMoney">
<j-input-number
allowClear
:precision="2"
style="width: 100%"
@ -50,20 +50,20 @@
:max="500"
placeholder="请输入1~500之间的金额"
/>
</a-form-item>
</j-form-item>
<a-form-item label="支付方式" name="paymentType">
<a-select
<j-form-item label="支付方式" name="paymentType">
<j-select
allowClear
:options="PaymentMethod"
v-model:value="modelRef.paymentType"
placeholder="请选择支付方式"
>
</a-select>
</a-form-item>
</a-form>
</j-select>
</j-form-item>
</j-form>
</div>
</a-modal>
</j-modal>
</template>
<script lang="ts" setup>

View File

@ -2,10 +2,10 @@
<template>
<page-container>
<Search :columns="columns" target="recharge-search" @search="handleSearch" />
<JTable ref="rechargeRef" :columns="columns" :request="queryRechargeList" model="TABLE"
<j-pro-table ref="rechargeRef" :columns="columns" :request="queryRechargeList" model="TABLE"
:defaultParams="{ sorts: [{ name: 'createTime', order: 'desc' }] }" :params="params">
<template #headerTitle>
<a-space>
<j-space>
<PermissionButton @click="visible = true" :hasPermission="'iot-card/Recharge:pay'" type="primary">
充值
</PermissionButton>
@ -15,7 +15,7 @@
</span>
本平台仅提供充值入口具体充值结果需以运营商的充值结果为准
</div>
</a-space>
</j-space>
</template>
<template #createTime="slotProps">
{{
@ -27,7 +27,7 @@
}}
</template>
<template #action="slotProps">
<a-space :size="16">
<j-space :size="16">
<template
v-for="i in getActions(slotProps)"
:key="i.key"
@ -46,9 +46,9 @@
<template #icon><AIcon :type="i.icon" /></template>
</PermissionButton>
</template>
</a-space>
</j-space>
</template>
</JTable>
</j-pro-table>
<!-- 充值 -->
<Save v-if="visible" @change="saveChange" />
<Detail v-if="detailVisible" :data="current" @close="close" />

View File

@ -6,7 +6,7 @@
target="record-search"
@search="handleSearch"
/>
<JTable
<j-pro-table
ref="RecordRef"
:columns="columns"
:request="queryList"
@ -21,7 +21,7 @@
: ''
}}
</template>
</JTable>
</j-pro-table>
</page-container>
</template>

View File

@ -1,21 +1,21 @@
<template>
<div>
<a-radio-group
<j-radio-group
v-if="quickBtn"
default-value="today"
button-style="solid"
v-model:value="radioValue"
@change="(e) => handleBtnChange(e.target.value)"
>
<a-radio-button
<j-radio-button
v-for="item in quickBtnList"
:key="item.value"
:value="item.value"
>
{{ item.label }}
</a-radio-button>
</a-radio-group>
<a-range-picker
</j-radio-button>
</j-radio-group>
<j-range-picker
format="YYYY-MM-DD"
valueFormat="YYYY-MM-DD"
style="margin-left: 12px"
@ -23,7 +23,7 @@
v-model:value="rangeVal"
:allowClear="false"
>
</a-range-picker>
</j-range-picker>
</div>
</template>

View File

@ -61,10 +61,13 @@ import { getImage } from '@/utils/comm';
import { message } from 'ant-design-vue';
import { useMenuStore } from '@/store/menu';
import { useRoute } from 'vue-router';
import { Store } from 'jetlinks-store';
import { useAlarmConfigurationStore } from '@/store/alarm';
import { storeToRefs } from 'pinia';
const route = useRoute();
const id = route.query?.id;
let selectDisable = ref(false);
const alarmConfigurationStore = useAlarmConfigurationStore();
let { configurationData } = storeToRefs(alarmConfigurationStore);
const queryData = () => {
if (id) {
detail(id).then((res) => {
@ -73,7 +76,7 @@ const queryData = () => {
form.name = res?.result?.name;
form.targetType = res?.result?.targetType;
form.description = res?.result?.description;
Store.set('configuration-data', res.result);
configurationData.value.current = res.result;
query({
terms: [
{
@ -183,7 +186,7 @@ const handleSave = async () => {
{ id: res.result?.id },
);
if (!id) {
Store.set('configuration-data', res.result);
configurationData.value.current = res.result;
}
}
})

View File

@ -0,0 +1,14 @@
<template>
<div>
<TabComponent type="detail" :id="id"/>
</div>
</template>
<script lang="ts" setup>
import TabComponent from '@/views/rule-engine/Alarm/Log/TabComponent/indev.vue'
import { useRoute } from 'vue-router';
const route = useRoute();
const id = route.query?.id
</script>
<style lang="less" scoped>
</style>

View File

@ -0,0 +1,233 @@
<template>
<a-modal
visible
title="新增"
okText="确定"
cancelText="取消"
:width="1000"
@cancel="closeModal"
@ok="saveCorrelation"
>
<Search :columns="columns" @search="handleSearch"></Search>
<div style="height: 500px; overflow-y: auto">
<JTable
model="CARD"
:request="query"
:rowSelection="{
selectedRowKeys: _selectedRowKeys,
}"
@cancelSelect="cancelSelect"
:gridColumns="[1, 1, 1]"
:defaultParams="{
sorts: [
{
name: 'createTime',
order: 'desc',
},
],
terms,
}"
:params="params"
>
<template #card="slotProps">
<SceneCard
:value="slotProps"
:status="slotProps.state?.value"
:statusText="slotProps.state?.text"
:active="_selectedRowKeys.includes(slotProps.id)"
@click="handleClick"
:statusNames="{
started: 'success',
disable: 'error',
}"
>
<template #type>
<span
><img
:height="16"
:src="
typeMap.get(slotProps.triggerType)?.icon
"
style="margin-right: 5px"
/>{{
typeMap.get(slotProps.triggerType)?.text
}}</span
>
</template>
<template #img>
<img
:src="typeMap.get(slotProps.triggerType)?.img"
/>
</template>
<template #title>
<Ellipsis style="width: calc(100% - 100px)">
<span style="font-size: 16px; font-weight: 600">
{{ slotProps.name }}
</span>
</Ellipsis>
</template>
<template #subTitle>
<Ellipsis :lineClamp="2">
说明{{
slotProps?.description ||
typeMap.get(slotProps.triggerType)?.tip
}}
</Ellipsis>
</template>
</SceneCard>
</template>
</JTable>
</div>
</a-modal>
</template>
<script lang="ts" setup>
import { query } from '@/api/rule-engine/scene';
import { bindScene } from '@/api/rule-engine/configuration';
import SceneCard from '@/views/rule-engine/Scene/SceneCard.vue';
import { getImage } from '@/utils/comm';
import { message } from 'ant-design-vue';
const columns = [
{
title: '名称',
dataIndex: 'name',
key: 'name',
search: {
type: 'string',
},
},
{
title: '触发方式',
dataIndex: 'triggerType',
key: 'triggerType',
search: {
type: 'select',
options: [
{
label: '手动触发',
value: 'manual',
},
{
label: '定时触发',
value: 'timer',
},
{
label: '设备触发',
value: 'device',
},
],
},
},
{
title: '状态',
dataIndex: 'state',
key: 'state',
search: {
type: 'select',
options: [
{
label: '正常',
value: 'started',
},
{
label: '禁用',
value: 'disable',
},
],
},
},
];
const props = defineProps({
id: {
type: String,
},
type: {
type: String,
},
});
const terms = [
{
terms: [
{
column: 'id',
termType: 'alarm-bind-rule$not',
value: props.id,
type: 'and',
},
{
column: 'triggerType',
termType: 'eq',
value: props.type === 'other' ? undefined : 'device',
},
],
type: 'and',
},
];
const params = ref();
const typeMap = new Map();
typeMap.set('manual', {
text: '手动触发',
img: getImage('/scene/scene-hand.png'),
icon: getImage('/scene/trigger-type-icon/manual.png'),
tip: '适用于第三方平台向物联网平台下发指令控制设备',
});
typeMap.set('timer', {
text: '定时触发',
img: getImage('/scene/scene-timer.png'),
icon: getImage('/scene/trigger-type-icon/timing.png'),
tip: '适用于定期执行固定任务',
});
typeMap.set('device', {
text: '设备触发',
img: getImage('/scene/scene-device.png'),
icon: getImage('/scene/trigger-type-icon/device.png'),
tip: '适用于设备数据或行为满足触发条件时,执行指定的动作',
});
const _selectedRowKeys = ref<string[]>([]);
const handleClick = (dt: any) => {
if (_selectedRowKeys.value.includes(dt.id)) {
const _index = _selectedRowKeys.value.findIndex((i) => i === dt.id);
_selectedRowKeys.value.splice(_index, 1);
} else {
_selectedRowKeys.value = [..._selectedRowKeys.value, dt.id];
}
console.log(_selectedRowKeys.value);
};
/**
* 取消选择事件
*/
const cancelSelect = () => {
_selectedRowKeys.value = [];
};
const log = () => {};
log();
const handleSearch = (e: any) => {
params.value = e;
};
const emit = defineEmits(['closeSave','saveScene']);
/**
* 保存选中关联场景
*/
const saveCorrelation = async () => {
if (_selectedRowKeys.value.length > 0) {
const list = _selectedRowKeys.value.map((item: any) => {
return {
alarmId: props.id,
releId: item,
};
});
const res = await bindScene([...list]);
if (res.status === 200) {
message.success('操作成功');
emit('saveScene');
}
} else {
message.error('请选择至少一条数据');
}
};
const closeModal = () => {
emit('closeSave');
};
</script>
<style lang="less" scoped>
</style>

View File

@ -1,9 +1,174 @@
<template>
<div>123</div>
<JTable
model="CARD"
:request="query"
:defaultParams="{
sorts: [{ name: 'createTime', order: 'desc' }],
terms,
}"
:gridColumns="[1, 1, 1]"
ref="actionRef"
>
<template #headerTitle>
<a-space>
<PermissionButton type="primary" @click="showModal">
<template #icon><AIcon type="PlusOutlined" /></template>
新增
</PermissionButton>
</a-space>
</template>
<template #card="slotProps">
<SceneCard
:value="slotProps"
@click="handleClick"
:actions="getActions(slotProps, 'card')"
:status="slotProps.state?.value"
:statusText="slotProps.state?.text"
:statusNames="{
started: 'success',
disable: 'error',
}"
>
<template #type>
<span
><img
:height="16"
:src="typeMap.get(slotProps.triggerType)?.icon"
style="margin-right: 5px"
/>{{ typeMap.get(slotProps.triggerType)?.text }}</span
>
</template>
<template #img>
<img :src="typeMap.get(slotProps.triggerType)?.img" />
</template>
<template #title>
<Ellipsis style="width: calc(100% - 100px)">
<span style="font-size: 16px; font-weight: 600">
{{ slotProps.name }}
</span>
</Ellipsis>
</template>
<template #subTitle>
<Ellipsis :lineClamp="2">
说明{{
slotProps?.description ||
typeMap.get(slotProps.triggerType)?.tip
}}
</Ellipsis>
</template>
<template #actions="item">
<PermissionButton
:disabled="item.disabled"
:popConfirm="item.popConfirm"
:tooltip="{
...item.tooltip,
}"
@click="item.onClick"
>
<AIcon :type="item.icon" />
<span>{{ item?.text }}</span>
</PermissionButton>
</template>
</SceneCard>
</template>
</JTable>
<Save
:id="id"
:type="configurationData.current?.targetType"
@close-save="closeSave"
@save-scene="saveSuccess"
v-if="visible"
></Save>
</template>
<script lang="ts" setup>
import { query } from '@/api/rule-engine/scene';
import { unbindScene } from '@/api/rule-engine/configuration';
import { useRoute } from 'vue-router';
import SceneCard from '@/views/rule-engine/Scene/SceneCard.vue';
import type { ActionsType } from '@/components/Table';
import { getImage } from '@/utils/comm';
import { message } from 'ant-design-vue/es';
import Save from './save/index.vue';
import { useAlarmConfigurationStore } from '@/store/alarm';
import { storeToRefs } from 'pinia';
const route = useRoute();
const id = route.query?.id;
const alarmConfigurationStore = useAlarmConfigurationStore();
const { configurationData } = storeToRefs(alarmConfigurationStore);
const terms = [
{
terms: [
{
column: 'id',
termType: 'alarm-bind-rule',
value: id,
},
],
type: 'and',
},
];
const actionRef = ref();
const typeMap = new Map();
typeMap.set('manual', {
text: '手动触发',
img: getImage('/scene/scene-hand.png'),
icon: getImage('/scene/trigger-type-icon/manual.png'),
tip: '适用于第三方平台向物联网平台下发指令控制设备',
});
typeMap.set('timer', {
text: '定时触发',
img: getImage('/scene/scene-timer.png'),
icon: getImage('/scene/trigger-type-icon/timing.png'),
tip: '适用于定期执行固定任务',
});
typeMap.set('device', {
text: '设备触发',
img: getImage('/scene/scene-device.png'),
icon: getImage('/scene/trigger-type-icon/device.png'),
tip: '适用于设备数据或行为满足触发条件时,执行指定的动作',
});
const getActions = (
data: Partial<Record<string, any>>,
type: 'card' | 'table',
): ActionsType[] => {
if (!data) return [];
const actions: ActionsType[] = [
{
key: 'unbind',
text: '解绑',
icon: 'DisconnectOutlined',
popConfirm: {
title: '确定解绑?',
onConfirm: async () => {
const res = await unbindScene(id, [data.id]);
if (res.status === 200) {
message.success('操作成功');
actionRef.value.reload();
}
},
},
},
];
return actions;
};
const visible = ref(false);
const log = () => {
console.log();
};
log();
const showModal = () => {
visible.value = true;
};
const closeSave = () => {
visible.value = false;
};
const saveSuccess = () =>{
visible.value = false;
actionRef.value.reload();
}
</script>
<style lang="less" scoped>
</style>

View File

@ -8,7 +8,9 @@
<a-tab-pane key="2" tab="关联场景联动">
<Scene></Scene>
</a-tab-pane>
<a-tab-pane key="3" tab="告警记录"></a-tab-pane>
<a-tab-pane key="3" tab="告警记录">
<Log/>
</a-tab-pane>
</a-tabs>
</a-card>
</page-container>
@ -17,7 +19,8 @@
<script lang="ts" setup>
import Base from './Base/index.vue';
import Scene from './Scene/index.vue'
const activeKey = ref('2');
import Log from './Log/indev.vue'
const activeKey = ref('1');
</script>
<style lang="less" scoped>
</style>

View File

@ -280,11 +280,6 @@ let params = ref({
sorts: [{ name: 'alarmTime', order: 'desc' }],
terms: [],
});
let param = reactive({
pageSize: 10,
terms: [],
});
const handleSearch = async (params: any) => {
const resp = await query(params);
if (resp.status === 200) {

View File

@ -19,7 +19,12 @@
</a-steps>
<a-divider style='margin-bottom: 0px' />
<div class='steps-content'>
<Product v-if='addModel.stepNumber === 0' v-model:rowKey='addModel.productId' v-model:detail='addModel.productDetail' />
<Product
v-if='addModel.stepNumber === 0'
v-model:rowKey='addModel.productId'
v-model:detail='addModel.productDetail'
@change='productChange'
/>
<DeviceSelect
v-else-if='addModel.stepNumber === 1'
:productId='addModel.productId'
@ -32,6 +37,7 @@
ref='typeRef'
v-else-if='addModel.stepNumber === 2'
:metadata='addModel.metadata'
:operator='addModel.operator'
/>
</div>
<template #footer>
@ -53,11 +59,11 @@ import { detail as deviceDetail } from '@/api/device/instance'
import Product from './Product.vue'
import DeviceSelect from './DeviceSelect.vue'
import Type from './Type.vue'
import { continuousValue, timeUnitEnum } from '@/views/rule-engine/Scene/Save/components/Timer/util'
type Emit = {
(e: 'cancel'): void
(e: 'update:value', data: TriggerDevice): void
(e: 'update:options', data: any): void
(e: 'save', data: TriggerDevice, options: Record<string, any>): void
}
interface AddModelType extends Omit<TriggerDevice, 'selectorValues'> {
@ -65,8 +71,9 @@ interface AddModelType extends Omit<TriggerDevice, 'selectorValues'> {
deviceKeys: Array<{ label: string, value: string }>
orgId: Array<{ label: string, value: string }>
productDetail: any
selectorValues: Array<{ label: string, value: string }>
metadata: metadataType
selectorValues: Array<Record<string, any>>
metadata: metadataType,
operator: TriggerDeviceOptions
}
const emit = defineEmits<Emit>()
@ -82,7 +89,7 @@ const props = defineProps({
})
},
options: {
type: Object as PropType<any>,
type: Object as PropType<Record<string, any>>,
default: () => ({})
}
})
@ -95,13 +102,106 @@ const addModel = reactive<AddModelType>({
deviceKeys: [],
orgId: [],
productDetail: {},
metadata: {}
metadata: {},
operator: {
operator: 'online'
}
})
const optionsCache = ref(props.options)
Object.assign(addModel, props.value)
const handleOptions = (data: TriggerDeviceOptions) => {
const typeIconMap = {
writeProperty: 'icon-bianji1',
invokeFunction: 'icon-widgets',
reportEvent: 'icon-shijian',
readProperty: 'icon-Group',
};
const _options: any = {
name: '', //
extraName: '', //
onlyName: false,
type: '', //
typeIcon: typeIconMap[data.operator],
productName: '',
selectorIcon: '',
time: undefined,
when: undefined,
extraTime: undefined,
action: optionsCache.value?.action,
};
if (addModel.selector === 'fixed') {
let isLimit = false;
let indexOf = 0;
const nameStr = addModel.selectorValues!.reduce((_prev, next, index) => {
if (_prev.length <= 30) {
indexOf = index;
return index === 0 ? next.name : _prev + '、' + next.name;
} else {
isLimit = true;
}
return _prev;
}, '');
// _options.name = TriggerDeviceModel.selectorValues?.map((item) => item.name).join('');
_options.name = nameStr;
if (isLimit && addModel.selectorValues!.length > indexOf) {
_options.extraName = `${addModel.selectorValues!.length}台设备`;
}
_options.selectorIcon = 'icon-shebei1';
} else if (addModel.selector === 'org') {
_options.name = addModel.selectorValues?.[0].name + '的';
_options.productName = addModel.productDetail.name; //
_options.selectorIcon = 'icon-zuzhi';
} else {
_options.name = '所有的' + addModel.productDetail.name;
}
if (data.timer) {
const _timer = data.timer;
if (_timer.trigger === 'cron') {
_options.time = _timer.cron;
} else {
// console.log('continuousValue', continuousValue(_timer.when! || [], _timer!.trigger))
let whenStr = '每天';
if (_timer.when!.length) {
whenStr = _timer!.trigger === 'week' ? '每周' : '每月';
const whenStrArr = continuousValue(_timer.when! || [], _timer!.trigger);
const whenStrArr3 = whenStrArr.splice(0, 3);
whenStr += whenStrArr3.join('、');
whenStr += `${_timer.when!.length}`;
}
_options.when = whenStr;
if (_timer.once) {
_options.time = _timer.once.time + ' 执行1次';
} else if (_timer.period) {
_options.time = _timer.period.from + '-' + _timer.period.to;
_options.extraTime = `${_timer.period.every}${timeUnitEnum[_timer.period.unit]}执行1次`;
}
}
if (data.operator === 'online') {
_options.type = '上线';
_options.action = '';
_options.typeIcon = 'icon-a-Group4713';
}
if (data.operator === 'offline') {
_options.type = '离线';
_options.action = '';
_options.typeIcon = 'icon-a-Group4892';
}
if (data.operator === 'reportProperty') {
_options.type = '属性上报';
_options.action = '';
_options.typeIcon = 'icon-file-upload-outline';
}
return _options;
}
}
const prev = () => {
@ -120,6 +220,16 @@ const handleMetadata = (metadata?: string) => {
}
}
const productChange = () => {
addModel.deviceKeys = []
addModel.orgId = []
addModel.selector = 'fixed'
addModel.operator = {
operator: 'online'
}
addModel.selectorValues = []
}
const save = async (step?: number) => {
let _step = step !== undefined ? step : addModel.stepNumber
if (_step === 0) {
@ -139,9 +249,16 @@ const save = async (step?: number) => {
addModel.stepNumber = 2
} else {
const typeData = await typeRef.value.vail()
console.log(typeData)
if (typeData) {
const _options = handleOptions(typeData);
optionsCache.value.action = typeData.action
const _options = handleOptions(typeData.data);
const data = {
operator: typeData.data,
selector: addModel.selector,
selectorValues: addModel.selectorValues,
productId: addModel.productId
}
emit('save', data, _options)
}
}
}

View File

@ -66,6 +66,7 @@ import { getImage } from '@/utils/comm'
type Emit = {
(e: 'update:rowKey', data: string): void
(e: 'update:detail', data: string): void
(e: 'change', data: string): void
}
const actionRef = ref()
@ -246,6 +247,7 @@ const productQuery = (p: any) => {
const handleClick = (detail: any) => {
emit('update:rowKey', detail.id)
emit('update:detail', detail)
emit('change', detail)
}
</script>

View File

@ -57,7 +57,7 @@
import { filterSelectNode } from '@/utils/comm'
import { TopCard, Timer } from '@/views/rule-engine/Scene/Save/components'
import { getImage } from '@/utils/comm'
import { metadataType } from '@/views/rule-engine/Scene/typings'
import type { metadataType, TriggerDeviceOptions } from '@/views/rule-engine/Scene/typings'
import type { PropType } from 'vue'
import { TypeEnum } from '@/views/rule-engine/Scene/Save/Device/util'
import ReadProperties from './ReadProperties.vue'
@ -70,6 +70,10 @@ const props = defineProps({
metadata: {
type: Object as PropType<metadataType>,
default: () => ({})
},
operator: {
type: Object as PropType<TriggerDeviceOptions>,
default: () => ({})
}
})
@ -83,6 +87,8 @@ const formModel = reactive({
functionParameters: []
})
Object.assign(formModel, props.operator)
const optionCache = reactive({
action: ''
})
@ -222,7 +228,7 @@ defineExpose({
filterKey.push('writeProperties')
}
resolve(omit(cloneModel, filterKey))
resolve({ data: omit(cloneModel, filterKey), action: optionCache.action })
})
}
})

View File

@ -15,7 +15,7 @@
</AddButton>
</a-form-item>
<Action />
<AddModel v-if='visible' @cancel='visible = false' v-model='data.device' v-model:options='data.options.trigger' />
<AddModel v-if='visible' @cancel='visible = false' @save='save' :value='data.trigger.device' :options='data.options.trigger' />
</div>
</template>
@ -26,9 +26,10 @@ import AddModel from './AddModal.vue'
import AddButton from '../components/AddButton.vue'
import Title from '../components/Title.vue'
import Action from '../action/index.vue'
import type { TriggerDevice } from '@/views/rule-engine/Scene/typings'
const sceneStore = useSceneStore()
const { data } = storeToRefs<any>(sceneStore)
const { data } = storeToRefs(sceneStore)
const visible = ref(false)
@ -41,6 +42,11 @@ const rules = [{
},
}]
const save = (device: TriggerDevice, options: Record<string, any>) => {
data.value.trigger!.device = device
data.value.options!.trigger = options
}
</script>
<style scoped lang='less'>

View File

@ -1,3 +1,4 @@
import { isArray } from 'lodash-es'
export const numberToString = {
1: '星期一',
2: '星期二',
@ -7,3 +8,45 @@ export const numberToString = {
6: '星期六',
7: '星期日',
};
export const timeUnitEnum = {
seconds: '秒',
minutes: '分',
hours: '小时',
};
type continuousValueFn = (data: (string | number)[], type: string) => (number | string)[];
export const continuousValue: continuousValueFn = (data, type) => {
let start = 0;
const newArray: (number | string)[] = [];
const isWeek = type === 'week';
if (isArray(data)) {
data.forEach((item, index) => {
const _item = Number(item);
const nextValue = data[index + 1];
const previousValue = data[index - 1];
const nextItemValue = _item + 1;
const previousItemValue = _item - 1;
if (nextItemValue === nextValue && previousItemValue !== previousValue) {
start = _item;
} else if (previousItemValue === previousValue && nextItemValue !== nextValue) {
// 表示前start和item连续并且item与nextValue不连续
if (_item - start >= 2) {
// 至少三位连续
newArray.push(
isWeek
? `${numberToString[start]} - ${numberToString[_item]}`
: `${start} - ${_item}`,
);
} else {
newArray.push(isWeek ? numberToString[start] : `${start}`);
newArray.push(isWeek ? numberToString[_item] : `${_item}`);
}
} else if (previousItemValue !== previousValue && nextItemValue !== nextValue) {
newArray.push(isWeek ? numberToString[_item] : `${_item}`);
}
});
}
return newArray;
};

View File

@ -5,13 +5,13 @@
<div class='center-item'>
<AIcon v-if='options.selectorIcon' :type='options.selectorIcon' class='icon-padding-right' />
<span class='trigger-options-name'>
<Ellipsis style='width: 310px'>
<Ellipsis style='max-width: 310px'>
{{ options.name }}
</Ellipsis>
</span>
<span v-if='options.extraName'>{{ options.extraName }}</span>
</div>
<template v-if='options.onlyName'>
<template v-if='!options.onlyName'>
<div v-if='options.productName' class='center-item'>
<AIcon type='icon-chanpin1' class='icon-padding-right' />
<span className='trigger-options-type'>{{ options.productName }}</span>
@ -28,7 +28,7 @@
</div>
<div v-if='options.action' class='center-item'>
<AIcon :type='options.typeIcon' class='icon-padding-right' />
<span className='trigger-options-action'>{{ options.productName }}</span>
<span className='trigger-options-action'>{{ options.action }}</span>
</div>
<div v-if='options.type' class='center-item'>
<AIcon :type='options.typeIcon' class='icon-padding-right' />
@ -57,6 +57,8 @@ const isAdd = computed(() => {
<style scoped lang='less'>
.trigger-options-content {
display: inline-flex;
gap: 16px;
.center-item {
display: flex;

View File

@ -3,7 +3,7 @@
<div class="apply-container">
<Search :columns="columns" @search="search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="columns"
:request="getApplyList_api"
@ -158,7 +158,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
</div>
<div class="dialogs">
<MenuDialog ref="dialogRef" mode="edit" />

View File

@ -45,7 +45,7 @@
>保存</a-button
>
</div>
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
model="TABLE"
@ -109,7 +109,7 @@
<AIcon type="DeleteOutlined" />
</PermissionButton>
</template>
</JTable>
</j-pro-table>
<a-botton class="add-row" @click="table.addRow">
<AIcon type="PlusOutlined" /> 新增行
</a-botton>

View File

@ -3,7 +3,7 @@
<div class="data-source-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getDataSourceList_api"
@ -122,7 +122,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<EditDialog ref="editDialogRef" @confirm="table.refresh" />

View File

@ -30,7 +30,7 @@
<Search :columns="props.queryColumns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:request="table.requestFun"
:gridColumn="2"
@ -101,7 +101,7 @@
</template>
</CardBox>
</template>
</JTable>
</j-pro-table>
</a-modal>
</template>
@ -115,6 +115,7 @@ import {
bindDeviceOrProductList_api,
} from '@/api/system/department';
import { message } from 'ant-design-vue';
import { dictType } from '../typing';
const emits = defineEmits(['confirm']);
const props = defineProps<{

View File

@ -1,7 +1,7 @@
<template>
<div class="product-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:request="table.requestFun"
:gridColumn="2"
@ -130,7 +130,7 @@
</template>
</CardBox>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<AddDeviceOrProductDialog

View File

@ -1,7 +1,7 @@
<template>
<div class="product-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:request="table.requestFun"
:gridColumn="2"
@ -130,7 +130,7 @@
</template>
</CardBox>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<AddDeviceOrProductDialog

View File

@ -12,7 +12,7 @@
>
<Search :columns="query.columns" @search="query.search" />
<div class="table">
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="table.requestFun"

View File

@ -2,7 +2,7 @@
<div>
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="table.requestFun"
@ -58,7 +58,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<AddBindUserDialog

View File

@ -1,6 +1,6 @@
<template>
<div class="button-mange-container">
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
model="TABLE"
@ -47,7 +47,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialog">
<ButtonAddDialog

View File

@ -3,7 +3,7 @@
<div class="menu-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="table.getList"
@ -71,7 +71,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
</div>
</page-container>
</template>

View File

@ -3,7 +3,7 @@
<div class="permission-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getPermission_api"
@ -115,7 +115,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<EditDialog ref="editDialogRef" @refresh="table.refresh" />

View File

@ -21,7 +21,7 @@
<div class="api-card">
<h5>请求参数</h5>
<div class="content">
<JTable
<j-pro-table
:columns="requestCard.columns"
:dataSource="requestCard.tableData"
noPagination
@ -33,19 +33,19 @@
<template #type="slotProps">
<span>{{ slotProps.schema.type }}</span>
</template>
</JTable>
</j-pro-table>
</div>
</div>
<div class="api-card">
<h5>响应状态</h5>
<div class="content">
<JTable
<j-pro-table
:columns="responseStatusCard.columns"
:dataSource="responseStatusCard.tableData"
noPagination
model="TABLE"
>
</JTable>
</j-pro-table>
<a-tabs v-model:activeKey="responseStatusCard.activeKey">
<a-tab-pane
@ -60,13 +60,13 @@
<div class="api-card">
<h5>响应参数</h5>
<div class="content">
<JTable
<j-pro-table
:columns="respParamsCard.columns"
:dataSource="respParamsCard.tableData"
noPagination
model="TABLE"
>
</JTable>
</j-pro-table>
</div>
<MonacoEditor

View File

@ -1,6 +1,6 @@
<template>
<div class="choose-api-container">
<JTable
<j-pro-table
:columns="columns"
:dataSource="props.tableData"
:rowSelection="props.mode !== 'home' ? rowSelection : undefined"
@ -14,7 +14,7 @@
>{{ slotProps.url }}</span
>
</template>
</JTable>
</j-pro-table>
<a-button type="primary" @click="save" v-if="props.mode !== 'home'"
>保存</a-button

View File

@ -60,7 +60,7 @@
<div style="width: 50%">
<h3>示例数据</h3>
<div>
<JTable
<j-pro-table
:dataSource="data"
model="TABLE"
noPagination

View File

@ -3,7 +3,7 @@
<div class="relationship-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getRelationshipList_api"
@ -49,7 +49,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<EditDialog ref="editDialogRef" @refresh="table.refresh" />
</div>

View File

@ -2,7 +2,7 @@
<a-card class="role-user-container">
<Search :columns="query.columns" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getUserByRole_api"
@ -37,7 +37,7 @@
</a-popconfirm>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<AddUserDialog :open="dialog.openAdd" @refresh="table.refresh" />

View File

@ -7,7 +7,7 @@
>
<Search :columns="query.columns" type="simple" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getUserByRole_api"
@ -19,7 +19,7 @@
}"
@cancelSelect="table.cancelSelect"
>
</JTable>
</j-pro-table>
<template #footer>
<a-button key="back" @click="dialog.visible = false">取消</a-button>

View File

@ -3,7 +3,7 @@
<a-card class="role-container">
<Search :columns="query.columns" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getRoleList_api"
@ -45,7 +45,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<AddDialog ref="addDialogRef" />

View File

@ -3,7 +3,7 @@
<div class="user-container">
<Search :columns="query.columns" @search="query.search" />
<JTable
<j-pro-table
ref="tableRef"
:columns="table.columns"
:request="getUserList_api"
@ -43,62 +43,6 @@
</template>
<template #action="slotProps">
<a-space :size="16">
<!-- <a-tooltip>
<template #title>编辑</template>
<a-button
style="padding: 0"
type="link"
@click="table.openDialog('edit', slotProps)"
>
<AIcon type="EditOutlined" />
</a-button>
</a-tooltip> -->
<!-- <a-popconfirm
:title="`确定${slotProps.status ? '禁用' : '启用'}吗?`"
ok-text="确定"
cancel-text="取消"
@confirm="table.changeStatus(slotProps)"
>
<a-tooltip>
<template #title>{{
slotProps.status ? '禁用' : '启用'
}}</template>
<a-button style="padding: 0" type="link">
<stop-outlined v-if="slotProps.status" />
<play-circle-outlined v-else />
</a-button>
</a-tooltip>
</a-popconfirm> -->
<!-- <a-tooltip>
<template #title>重置密码</template>
<a-button
style="padding: 0"
type="link"
@click="table.openDialog('reset', slotProps)"
>
<AIcon type="icon-zhongzhimima" />
</a-button>
</a-tooltip> -->
<!-- <a-popconfirm
title="确认删除"
ok-text="确定"
cancel-text="取消"
@confirm="table.clickDel(slotProps)"
:disabled="slotProps.status"
>
<a-tooltip>
<template #title>{{
slotProps.status ? '请先禁用,再删除' : '删除'
}}</template>
<a-button
style="padding: 0"
type="link"
:disabled="slotProps.status"
>
<AIcon type="DeleteOutlined" />
</a-button>
</a-tooltip>
</a-popconfirm> -->
<PermissionButton
:uhasPermission="`${permission}:update`"
@ -154,7 +98,7 @@
</PermissionButton>
</a-space>
</template>
</JTable>
</j-pro-table>
<div class="dialogs">
<EditUserDialog ref="editDialogRef" @confirm="table.refresh" />

458
yarn.lock
View File

@ -36,19 +36,19 @@
"@ant-design/colors@^6.0.0":
version "6.0.0"
resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz"
resolved "https://registry.jetlinks.cn/@ant-design%2fcolors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298"
integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==
dependencies:
"@ctrl/tinycolor" "^3.4.0"
"@ant-design/icons-svg@^4.2.1":
version "4.2.1"
resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz"
resolved "https://registry.jetlinks.cn/@ant-design%2ficons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a"
integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==
"@ant-design/icons-vue@^6.1.0":
version "6.1.0"
resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz"
resolved "https://registry.jetlinks.cn/@ant-design%2ficons-vue/-/icons-vue-6.1.0.tgz#f9324fdc0eb4cea943cf626d2bf3db9a4ff4c074"
integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==
dependencies:
"@ant-design/colors" "^6.0.0"
@ -288,9 +288,9 @@
"@babel/plugin-syntax-typescript" "^7.20.0"
"@babel/runtime@^7.10.5":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz"
integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
version "7.21.0"
resolved "https://registry.jetlinks.cn/@babel%2fruntime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
dependencies:
regenerator-runtime "^0.13.11"
@ -502,9 +502,9 @@
"@jridgewell/trace-mapping" "0.3.9"
"@ctrl/tinycolor@^3.4.0":
version "3.5.0"
resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz"
integrity sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==
version "3.6.0"
resolved "https://registry.jetlinks.cn/@ctrl%2ftinycolor/-/tinycolor-3.6.0.tgz#53fa5fe9c34faee89469e48f91d51a3766108bc8"
integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==
"@esbuild/android-arm64@0.16.12":
version "0.16.12"
@ -855,6 +855,107 @@
node-gyp "^7.1.0"
read-package-json-fast "^2.0.1"
"@octokit/auth-token@^2.4.4":
version "2.5.0"
resolved "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36"
integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==
dependencies:
"@octokit/types" "^6.0.3"
"@octokit/core@^3.5.1":
version "3.6.0"
resolved "https://registry.npmmirror.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085"
integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==
dependencies:
"@octokit/auth-token" "^2.4.4"
"@octokit/graphql" "^4.5.8"
"@octokit/request" "^5.6.3"
"@octokit/request-error" "^2.0.5"
"@octokit/types" "^6.0.3"
before-after-hook "^2.2.0"
universal-user-agent "^6.0.0"
"@octokit/endpoint@^6.0.1":
version "6.0.12"
resolved "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658"
integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==
dependencies:
"@octokit/types" "^6.0.3"
is-plain-object "^5.0.0"
universal-user-agent "^6.0.0"
"@octokit/graphql@^4.5.8":
version "4.8.0"
resolved "https://registry.npmmirror.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3"
integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==
dependencies:
"@octokit/request" "^5.6.0"
"@octokit/types" "^6.0.3"
universal-user-agent "^6.0.0"
"@octokit/openapi-types@^12.11.0":
version "12.11.0"
resolved "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0"
integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==
"@octokit/plugin-paginate-rest@^2.16.8":
version "2.21.3"
resolved "https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e"
integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==
dependencies:
"@octokit/types" "^6.40.0"
"@octokit/plugin-request-log@^1.0.4":
version "1.0.4"
resolved "https://registry.npmmirror.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
"@octokit/plugin-rest-endpoint-methods@^5.12.0":
version "5.16.2"
resolved "https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342"
integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==
dependencies:
"@octokit/types" "^6.39.0"
deprecation "^2.3.1"
"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0":
version "2.1.0"
resolved "https://registry.npmmirror.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677"
integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==
dependencies:
"@octokit/types" "^6.0.3"
deprecation "^2.0.0"
once "^1.4.0"
"@octokit/request@^5.6.0", "@octokit/request@^5.6.3":
version "5.6.3"
resolved "https://registry.npmmirror.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0"
integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==
dependencies:
"@octokit/endpoint" "^6.0.1"
"@octokit/request-error" "^2.1.0"
"@octokit/types" "^6.16.1"
is-plain-object "^5.0.0"
node-fetch "^2.6.7"
universal-user-agent "^6.0.0"
"@octokit/rest@^18":
version "18.12.0"
resolved "https://registry.npmmirror.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881"
integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==
dependencies:
"@octokit/core" "^3.5.1"
"@octokit/plugin-paginate-rest" "^2.16.8"
"@octokit/plugin-request-log" "^1.0.4"
"@octokit/plugin-rest-endpoint-methods" "^5.12.0"
"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0":
version "6.41.0"
resolved "https://registry.npmmirror.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04"
integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==
dependencies:
"@octokit/openapi-types" "^12.11.0"
"@rollup/pluginutils@^4.1.2", "@rollup/pluginutils@^4.2.0":
version "4.2.1"
resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz"
@ -874,7 +975,7 @@
"@simonwep/pickr@~1.8.0":
version "1.8.2"
resolved "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz"
resolved "https://registry.jetlinks.cn/@simonwep%2fpickr/-/pickr-1.8.2.tgz#96dc86675940d7cad63d69c22083dd1cbb9797cb"
integrity sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==
dependencies:
core-js "^3.15.1"
@ -927,6 +1028,14 @@
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz"
integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
"@types/glob@*":
version "8.1.0"
resolved "https://registry.npmmirror.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc"
integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==
dependencies:
"@types/minimatch" "^5.1.2"
"@types/node" "*"
"@types/lodash-es@^4.17.6":
version "4.17.6"
resolved "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz"
@ -944,6 +1053,11 @@
resolved "https://registry.npmjs.org/@types/marked/-/marked-4.0.8.tgz"
integrity sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==
"@types/minimatch@^5.1.2":
version "5.1.2"
resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/minimist@^1.2.0":
version "1.2.2"
resolved "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz"
@ -966,6 +1080,14 @@
resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz"
integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
"@types/shelljs@^0.8.11":
version "0.8.11"
resolved "https://registry.npmmirror.com/@types/shelljs/-/shelljs-0.8.11.tgz#17a5696c825974e96828e96e89585d685646fcb8"
integrity sha512-x9yaMvEh5BEaZKeVQC4vp3l+QoFj3BXcd4aYfuKSzIIyihjdVARAadYy3SMNIz0WCCdS2vB9JL/U6GQk5PaxQw==
dependencies:
"@types/glob" "*"
"@types/node" "*"
"@types/three@0.143.0":
version "0.143.0"
resolved "https://registry.npmjs.org/@types/three/-/three-0.143.0.tgz"
@ -1072,6 +1194,16 @@
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-core@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fcompiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8"
integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.47"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-dom@3.2.45", "@vue/compiler-dom@^3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz"
@ -1080,6 +1212,14 @@
"@vue/compiler-core" "3.2.45"
"@vue/shared" "3.2.45"
"@vue/compiler-dom@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fcompiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
dependencies:
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-sfc@3.2.45", "@vue/compiler-sfc@^3.2.29", "@vue/compiler-sfc@^3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz"
@ -1096,6 +1236,22 @@
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-sfc@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fcompiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.47"
"@vue/compiler-dom" "3.2.47"
"@vue/compiler-ssr" "3.2.47"
"@vue/reactivity-transform" "3.2.47"
"@vue/shared" "3.2.47"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-ssr@3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz"
@ -1104,6 +1260,14 @@
"@vue/compiler-dom" "3.2.45"
"@vue/shared" "3.2.45"
"@vue/compiler-ssr@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fcompiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==
dependencies:
"@vue/compiler-dom" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/devtools-api@^6.4.5":
version "6.4.5"
resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz"
@ -1120,6 +1284,17 @@
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity-transform@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2freactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e"
integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity@3.2.45", "@vue/reactivity@^3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz"
@ -1127,6 +1302,13 @@
dependencies:
"@vue/shared" "3.2.45"
"@vue/reactivity@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2freactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6"
integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==
dependencies:
"@vue/shared" "3.2.47"
"@vue/runtime-core@3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz"
@ -1135,6 +1317,14 @@
"@vue/reactivity" "3.2.45"
"@vue/shared" "3.2.45"
"@vue/runtime-core@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fruntime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d"
integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==
dependencies:
"@vue/reactivity" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/runtime-dom@3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz"
@ -1144,6 +1334,15 @@
"@vue/shared" "3.2.45"
csstype "^2.6.8"
"@vue/runtime-dom@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fruntime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382"
integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==
dependencies:
"@vue/runtime-core" "3.2.47"
"@vue/shared" "3.2.47"
csstype "^2.6.8"
"@vue/server-renderer@3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz"
@ -1152,11 +1351,24 @@
"@vue/compiler-ssr" "3.2.45"
"@vue/shared" "3.2.45"
"@vue/server-renderer@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fserver-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0"
integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==
dependencies:
"@vue/compiler-ssr" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/shared@3.2.45", "@vue/shared@^3.2.45":
version "3.2.45"
resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz"
integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==
"@vue/shared@3.2.47":
version "3.2.47"
resolved "https://registry.jetlinks.cn/@vue%2fshared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
"@vuemap/layer-3dtiles@^0.0.3":
version "0.0.3"
resolved "https://registry.npmjs.org/@vuemap/layer-3dtiles/-/layer-3dtiles-0.0.3.tgz"
@ -1187,13 +1399,13 @@
"@vueuse/core@^7.5.5":
version "7.7.1"
resolved "https://registry.jetlinks.cn/@vueuse%2fcore/-/core-7.7.1.tgz"
resolved "https://registry.jetlinks.cn/@vueuse%2fcore/-/core-7.7.1.tgz#fc284f4103de73c7fb79bc06579d8066790db511"
integrity sha512-PRRgbATMpoeUmkCEBtUeJgOwtew8s+4UsEd+Pm7MhkjL2ihCNrSqxNVtM6NFE4uP2sWnkGcZpCjPuNSxowJ1Ow==
dependencies:
"@vueuse/shared" "7.7.1"
vue-demi "*"
"@vueuse/core@^9.10.0", "@vueuse/core@^9.12.0":
"@vueuse/core@^9.10.0":
version "9.12.0"
resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.12.0.tgz"
integrity sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==
@ -1203,14 +1415,29 @@
"@vueuse/shared" "9.12.0"
vue-demi "*"
"@vueuse/core@^9.12.0":
version "9.13.0"
resolved "https://registry.jetlinks.cn/@vueuse%2fcore/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4"
integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
dependencies:
"@types/web-bluetooth" "^0.0.16"
"@vueuse/metadata" "9.13.0"
"@vueuse/shared" "9.13.0"
vue-demi "*"
"@vueuse/metadata@9.12.0":
version "9.12.0"
resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.12.0.tgz"
integrity sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==
"@vueuse/metadata@9.13.0":
version "9.13.0"
resolved "https://registry.jetlinks.cn/@vueuse%2fmetadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff"
integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
"@vueuse/shared@7.7.1":
version "7.7.1"
resolved "https://registry.jetlinks.cn/@vueuse%2fshared/-/shared-7.7.1.tgz"
resolved "https://registry.jetlinks.cn/@vueuse%2fshared/-/shared-7.7.1.tgz#77e312de7275380efce86b0079bd7938791a076b"
integrity sha512-rN2qd22AUl7VdBxihagWyhUNHCyVk9IpvBTTfHoLH9G7rGE552X1f+zeCfehuno0zXif13jPw+icW/wn2a0rnQ==
dependencies:
vue-demi "*"
@ -1222,6 +1449,13 @@
dependencies:
vue-demi "*"
"@vueuse/shared@9.13.0":
version "9.13.0"
resolved "https://registry.jetlinks.cn/@vueuse%2fshared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9"
integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
dependencies:
vue-demi "*"
JSONStream@^1.0.4:
version "1.3.5"
resolved "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz"
@ -1371,7 +1605,7 @@ ansistyles@~0.1.3:
ant-design-vue@^3.2.15:
version "3.2.15"
resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-3.2.15.tgz"
resolved "https://registry.jetlinks.cn/ant-design-vue/-/ant-design-vue-3.2.15.tgz#eab52877fa08a9e4c8cb311ea479a90203dcb302"
integrity sha512-sJfE7LWimSdAPe4dzNyQBrmVMnOTNQTkG9oOyr+7W8qIYrX8sYWyC68Nn1uum4KBJUSZUa/BU6dohvTG0urBhA==
dependencies:
"@ant-design/colors" "^6.0.0"
@ -1448,7 +1682,7 @@ array-ify@^1.0.0:
array-tree-filter@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz"
resolved "https://registry.jetlinks.cn/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
arrify@^1.0.1:
@ -1480,7 +1714,7 @@ astral-regex@^2.0.0:
async-validator@^4.0.0:
version "4.2.5"
resolved "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz"
resolved "https://registry.jetlinks.cn/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
async@^1.5.2:
@ -1550,6 +1784,11 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
before-after-hook@^2.2.0:
version "2.2.3"
resolved "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c"
integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==
bin-links@^2.2.1:
version "2.3.0"
resolved "https://registry.jetlinks.cn/bin-links/-/bin-links-2.3.0.tgz#1ff241c86d2c29b24ae52f49544db5d78a4eb967"
@ -1774,7 +2013,7 @@ chalk@^3.0.0:
chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.jetlinks.cn/chalk/-/chalk-4.1.2.tgz"
resolved "https://registry.jetlinks.cn/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
@ -1907,7 +2146,7 @@ cli-width@^3.0.0:
resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz"
integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
clipboard@^2.0.10, clipboard@^2.0.4:
clipboard@^2.0.4:
version "2.0.11"
resolved "https://registry.jetlinks.cn/clipboard/-/clipboard-2.0.11.tgz"
integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==
@ -2010,7 +2249,7 @@ colorette@^2.0.16, colorette@^2.0.19:
colorpicker-v3@^2.10.2:
version "2.10.2"
resolved "https://registry.jetlinks.cn/colorpicker-v3/-/colorpicker-v3-2.10.2.tgz"
resolved "https://registry.jetlinks.cn/colorpicker-v3/-/colorpicker-v3-2.10.2.tgz#f5e2f9ea603eee4d227ba10fa436d86963aa2bd0"
integrity sha512-ZWPq5wcugS3NcL7DwYqVSP5mE/x45FK31olGpig+Tko5jUXk0danfEYi1Aei3lgYs+Z0zAfhbhqVuDgOdUs5Mw==
dependencies:
"@vueuse/core" "^7.5.5"
@ -2033,7 +2272,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
commander@^2.19.0, commander@^2.20.0, commander@^2.9.0:
version "2.20.3"
resolved "https://registry.jetlinks.cn/commander/-/commander-2.20.3.tgz"
resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^8.3.0:
@ -2041,7 +2280,7 @@ commander@^8.3.0:
resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz"
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
commander@^9.4.1:
commander@^9, commander@^9.4.1:
version "9.5.0"
resolved "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz"
integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
@ -2079,7 +2318,7 @@ compare-func@^2.0.0:
compute-scroll-into-view@^1.0.20:
version "1.0.20"
resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz"
resolved "https://registry.jetlinks.cn/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43"
integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
concat-map@0.0.1:
@ -2182,9 +2421,9 @@ copy-anything@^2.0.1:
is-what "^3.14.1"
core-js@^3.15.1:
version "3.27.0"
resolved "https://registry.npmjs.org/core-js/-/core-js-3.27.0.tgz"
integrity sha512-wY6cKosevs430KRkHUIsvepDXHGjlXOZO3hYXNyqpD6JvB0X28aXyv0t1Y1vZMwE7SoKmtfa6IASHCPN52FwBQ==
version "3.29.0"
resolved "https://registry.jetlinks.cn/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6"
integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==
core-util-is@1.0.2:
version "1.0.2"
@ -2286,7 +2525,7 @@ dashdash@^1.12.0:
dayjs@^1.10.5:
version "1.11.7"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz"
resolved "https://registry.jetlinks.cn/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2"
integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==
de-indent@^1.0.2:
@ -2375,6 +2614,11 @@ depd@^1.1.2:
resolved "https://registry.jetlinks.cn/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
deprecation@^2.0.0, deprecation@^2.3.1:
version "2.3.1"
resolved "https://registry.npmmirror.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
detect-indent@^6.0.0:
version "6.1.0"
resolved "https://registry.npmmirror.com/detect-indent/-/detect-indent-6.1.0.tgz"
@ -2400,12 +2644,12 @@ diff@^5.0.0:
dom-align@^1.12.1:
version "1.12.4"
resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz"
resolved "https://registry.jetlinks.cn/dom-align/-/dom-align-1.12.4.tgz#3503992eb2a7cfcb2ed3b2a6d21e0b9c00d54511"
integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==
dom-scroll-into-view@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz"
resolved "https://registry.jetlinks.cn/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b"
integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
dom-serializer@^1.0.1:
@ -2644,6 +2888,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escape-string-regexp@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz"
@ -3007,7 +3256,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
version "7.2.3"
resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@ -3167,11 +3416,6 @@ highlight.js@^11.3.1:
resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.7.0.tgz"
integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==
hls.js@^1.0.10:
version "1.3.4"
resolved "https://registry.jetlinks.cn/hls.js/-/hls.js-1.3.4.tgz#8212a3f95c3321f64a586f20e67876f3a9d09488"
integrity sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg==
homedir-polyfill@^1.0.0:
version "1.0.3"
resolved "https://registry.npmmirror.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz"
@ -3386,6 +3630,11 @@ inquirer@^7.0.4:
strip-ansi "^6.0.0"
through "^2.3.6"
interpret@^1.0.0:
version "1.4.0"
resolved "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
ip-regex@^4.1.0:
version "4.3.0"
resolved "https://registry.jetlinks.cn/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
@ -3555,9 +3804,14 @@ is-plain-obj@^1.1.0:
is-plain-object@3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz"
resolved "https://registry.jetlinks.cn/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
is-plain-object@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/is-redirect/-/is-redirect-1.0.0.tgz"
@ -3642,10 +3896,10 @@ jetlinks-store@^0.0.3:
resolved "https://registry.npmjs.org/jetlinks-store/-/jetlinks-store-0.0.3.tgz"
integrity sha512-AZf/soh1hmmwjBZ00fr1emuMEydeReaI6IBTGByQYhTmK1Zd5pQAxC7WLek2snRAn/HHDgJfVz2hjditKThl6Q==
jetlinks-ui-components@^1.0.1:
version "1.0.1"
resolved "https://registry.jetlinks.cn/jetlinks-ui-components/-/jetlinks-ui-components-1.0.1.tgz#12fe9a193af14b859e1baf02fbd706a2be5b31cf"
integrity sha512-4hdEJUaKNMSIcmbn4qKcG8oK7h6VSYP3X3fCNndBm6WhHh+9ONf8f+3OSrUy1PvxdenmqO0VN2QdWV0KupByKQ==
jetlinks-ui-components@^1.0.2:
version "1.0.2"
resolved "https://registry.jetlinks.cn/jetlinks-ui-components/-/jetlinks-ui-components-1.0.2.tgz#753507e4a84dee966c65d4ae33943507bd60cc9d"
integrity sha512-LXKetf75/uqzWP4XOobm+iUWTVEeMJNnwEk+GrNftQdcDzGvUxBaoFCoS+HBH06FnE2VBbh6rEwrpDhkLSNEow==
dependencies:
"@vueuse/core" "^9.12.0"
ant-design-vue "^3.2.15"
@ -4119,7 +4373,7 @@ longest@^2.0.1:
loose-envify@^1.0.0:
version "1.4.0"
resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
resolved "https://registry.jetlinks.cn/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
@ -4315,6 +4569,13 @@ marked@^4.2.12:
resolved "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz"
integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==
matcher@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/matcher/-/matcher-4.0.0.tgz#a42a05a09aaed92e2d241eb91fddac689461ea51"
integrity sha512-S6x5wmcDmsDRRU/c2dkccDwQPXoFczc5+HpQ2lON8pnvHlnvHAHj5WlLVvw6n6vNyHuVugYrFohYxbS+pvFpKQ==
dependencies:
escape-string-regexp "^4.0.0"
mdurl@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz"
@ -4532,13 +4793,17 @@ moment@*, moment@^2.29.4:
monaco-editor@^0.35.0:
version "0.35.0"
resolved "https://registry.jetlinks.cn/monaco-editor/-/monaco-editor-0.35.0.tgz"
resolved "https://registry.jetlinks.cn/monaco-editor/-/monaco-editor-0.35.0.tgz#49c4220c815262a900dacf0ae8a59bef66efab8b"
integrity sha512-BJfkAZ0EJ7JgrgWzqjfBNP9hPSS8NlfECEDMEIIiozV2UaPq22yeuOjgbd3TwMh3anH0krWZirXZfn8KUSxiOA==
monaco-editor@^0.36.0:
version "0.36.1"
resolved "https://registry.jetlinks.cn/monaco-editor/-/monaco-editor-0.36.1.tgz"
integrity sha512-/CaclMHKQ3A6rnzBzOADfwdSJ25BFoFT0Emxsc4zYVyav5SkK9iA6lEtIeuN/oRYbwPgviJT+t3l+sjFa28jYg==
version "0.36.0"
resolved "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.36.0.tgz#8e7dba92f8110b369fdbc2312366184216419fc7"
integrity sha512-1Pn3AatfK88flUigyBozA4mt8+SB5xlgloQDu1RqivARw9yKaml/jceIvndae7Z2Nq8T7xZccFlmH+n6rkFg6g==
dependencies:
"@types/shelljs" "^0.8.11"
pin-github-action "^1.8.0"
shelljs "^0.8.5"
mrm-core@^7.1.13:
version "7.1.13"
@ -4616,7 +4881,7 @@ nanoid@^3.3.4:
nanopop@^2.1.0:
version "2.2.0"
resolved "https://registry.npmjs.org/nanopop/-/nanopop-2.2.0.tgz"
resolved "https://registry.jetlinks.cn/nanopop/-/nanopop-2.2.0.tgz#bd1c25588a7beaf68865bc2df19db4c58c77dcc9"
integrity sha512-E9JaHcxh3ere8/BEZHAcnuD10RluTSPyTToBvoFWS9/7DcCx6gyKjbn7M7Bx7E1veCxCuY1iO6h4+gdAf1j73Q==
needle@^3.1.0:
@ -4641,6 +4906,13 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
node-fetch@^2.6.7:
version "2.6.9"
resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
dependencies:
whatwg-url "^5.0.0"
node-gyp@^7.1.0, node-gyp@^7.1.2:
version "7.1.2"
resolved "https://registry.jetlinks.cn/node-gyp/-/node-gyp-7.1.2.tgz"
@ -5280,6 +5552,17 @@ pify@^4.0.1:
resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pin-github-action@^1.8.0:
version "1.8.0"
resolved "https://registry.npmmirror.com/pin-github-action/-/pin-github-action-1.8.0.tgz#50f0833e6af5bbba2bbfc978ca5e498b5670b9d8"
integrity sha512-8QMKGbDUmMLFSyeV7hDIVmlI8B3ThJed1uFYuhcCBLi/w8xHPbrPhnCvJndYdugNc8aj1FrijrOMDLQ93ATc7A==
dependencies:
"@octokit/rest" "^18"
commander "^9"
debug "^4.3.4"
matcher "^4.0.0"
yaml "^2.1.3"
pinia@^2.0.28:
version "2.0.28"
resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.28.tgz"
@ -5548,6 +5831,13 @@ readme-badger@^0.3.0:
dependencies:
balanced-match "^1.0.0"
rechoir@^0.6.2:
version "0.6.2"
resolved "https://registry.npmmirror.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==
dependencies:
resolve "^1.1.6"
redent@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz"
@ -5558,7 +5848,7 @@ redent@^3.0.0:
regenerator-runtime@^0.13.11:
version "0.13.11"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
resolved "https://registry.jetlinks.cn/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
registry-auth-token@^3.0.1:
@ -5650,7 +5940,7 @@ require-main-filename@^2.0.0:
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz"
resolved "https://registry.jetlinks.cn/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve-from@5.0.0, resolve-from@^5.0.0:
@ -5670,7 +5960,7 @@ resolve-global@1.0.0, resolve-global@^1.0.0:
dependencies:
global-dirs "^0.1.1"
resolve@^1.10.0, resolve@^1.22.1:
resolve@^1.1.6, resolve@^1.10.0, resolve@^1.22.1:
version "1.22.1"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@ -5778,7 +6068,7 @@ sax@^1.2.4:
scroll-into-view-if-needed@^2.2.25:
version "2.2.31"
resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz"
resolved "https://registry.jetlinks.cn/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587"
integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
dependencies:
compute-scroll-into-view "^1.0.20"
@ -5845,7 +6135,7 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
shallow-equal@^1.0.0:
version "1.2.1"
resolved "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz"
resolved "https://registry.jetlinks.cn/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
shebang-command@^1.2.0:
@ -5872,6 +6162,15 @@ shebang-regex@^3.0.0:
resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shelljs@^0.8.5:
version "0.8.5"
resolved "https://registry.npmmirror.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
rechoir "^0.6.2"
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/sigmund/-/sigmund-1.0.1.tgz"
@ -6255,11 +6554,6 @@ three@0.143.0:
resolved "https://registry.npmjs.org/three/-/three-0.143.0.tgz"
integrity sha512-oKcAGYHhJ46TGEuHjodo2n6TY2R6lbvrkp+feKZxqsUL/WkH7GKKaeu6RHeyb2Xjfk2dPLRKLsOP0KM2VgT8Zg==
throttle-debounce@^3.0.1:
version "3.0.1"
resolved "https://registry.jetlinks.cn/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb"
integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==
through2@^4.0.0:
version "4.0.2"
resolved "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz"
@ -6319,6 +6613,11 @@ tough-cookie@~2.5.0:
psl "^1.1.28"
punycode "^2.1.1"
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
treeverse@^1.0.4:
version "1.0.4"
resolved "https://registry.jetlinks.cn/treeverse/-/treeverse-1.0.4.tgz#a6b0ebf98a1bca6846ddc7ecbc900df08cb9cd5f"
@ -6474,6 +6773,11 @@ unique-string@^2.0.0:
dependencies:
crypto-random-string "^2.0.0"
universal-user-agent@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz"
@ -6628,7 +6932,7 @@ user-meta@^1.0.0:
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.jetlinks.cn/util-deprecate/-/util-deprecate-1.0.2.tgz"
resolved "https://registry.jetlinks.cn/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
uuid@^3.3.2:
@ -6636,11 +6940,6 @@ uuid@^3.3.2:
resolved "https://registry.jetlinks.cn/uuid/-/uuid-3.4.0.tgz"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
v-clipboard3@^0.1.4:
version "0.1.4"
resolved "https://registry.jetlinks.cn/v-clipboard3/-/v-clipboard3-0.1.4.tgz#13bdd12ce9728190d70f6ebf8b71de59d88b550e"
integrity sha512-iGIXgluf2WLbT+/Z1de9kKzoK9c9aPpy+zcPlY8/fneO+NHK95QEmFx2Q9LoxeUPRemD+nOfEv1J20Ki7W0v7Q==
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
@ -6695,7 +6994,7 @@ vite-plugin-html@^3.2.0:
vite-plugin-monaco-editor@^1.1.0:
version "1.1.0"
resolved "https://registry.jetlinks.cn/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz"
resolved "https://registry.jetlinks.cn/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz#a6238c2e13d5e98dd54a1bc51f6f189325219de3"
integrity sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==
vite-plugin-style-import@^2.0.0:
@ -6768,18 +7067,11 @@ vue-tsc@^1.0.11:
vue-types@^3.0.0:
version "3.0.2"
resolved "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz"
resolved "https://registry.jetlinks.cn/vue-types/-/vue-types-3.0.2.tgz#ec16e05d412c038262fc1efa4ceb9647e7fb601d"
integrity sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==
dependencies:
is-plain-object "3.0.1"
vue3-json-viewer@^2.2.2:
version "2.2.2"
resolved "https://registry.jetlinks.cn/vue3-json-viewer/-/vue3-json-viewer-2.2.2.tgz#43a512f378c602bb6b7f2a72adeaf7d15b443885"
integrity sha512-56l3XDGggnpwEqZieXsSMhNT4NhtO6d7zuSAxHo4i0UVxymyY2jRb7UMQOU1ztChKALZCAzX7DlgrsnEhxu77A==
dependencies:
clipboard "^2.0.10"
vue3-markdown-it@^1.0.10:
version "1.0.10"
resolved "https://registry.npmmirror.com/vue3-markdown-it/-/vue3-markdown-it-1.0.10.tgz"
@ -6807,16 +7099,7 @@ vue3-ts-jsoneditor@^2.7.1:
vanilla-jsoneditor "^0.7.9"
vue "^3.2.37"
vue3-video-play@^1.3.1-beta.6:
version "1.3.1-beta.6"
resolved "https://registry.jetlinks.cn/vue3-video-play/-/vue3-video-play-1.3.1-beta.6.tgz#bca3f55a11053eaa37053835e4610c04d9cc509e"
integrity sha512-Olrx2/LNAds7fuor/yX9ZKT9sOcwcfTt2g2YbbCrEaAmZ5Tb0hwBr5z+/CoLwELzzRzXCHPmWWoT0Wm5W/Nwpw==
dependencies:
hls.js "^1.0.10"
throttle-debounce "^3.0.1"
vue "^3.2.2"
vue@^3.2.2, vue@^3.2.25:
vue@^3.2.25:
version "3.2.47"
resolved "https://registry.jetlinks.cn/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0"
integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==
@ -6845,7 +7128,7 @@ walk-up-path@^1.0.0:
warning@^4.0.0:
version "4.0.3"
resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
resolved "https://registry.jetlinks.cn/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
dependencies:
loose-envify "^1.0.0"
@ -6857,6 +7140,11 @@ wcwidth@^1.0.0:
dependencies:
defaults "^1.0.3"
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
webpack-merge@^4.2.2:
version "4.2.2"
resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz"
@ -6874,6 +7162,14 @@ webpack-virtual-modules@^0.5.0:
resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz"
integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz"