微调
This commit is contained in:
@@ -25,6 +25,7 @@ export default {
|
|||||||
personalData: "Personal Data",
|
personalData: "Personal Data",
|
||||||
changePassword: "Change Password",
|
changePassword: "Change Password",
|
||||||
changeMode:"Change Mode",
|
changeMode:"Change Mode",
|
||||||
|
versionRegister:"Version Register",
|
||||||
logout: "Logout"
|
logout: "Logout"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export default {
|
|||||||
personalData: "个人信息",
|
personalData: "个人信息",
|
||||||
changePassword: "修改密码",
|
changePassword: "修改密码",
|
||||||
changeMode:"模式切换",
|
changeMode:"模式切换",
|
||||||
|
versionRegister:"版本注册",
|
||||||
logout: "退出登录"
|
logout: "退出登录"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,6 +19,9 @@
|
|||||||
<el-dropdown-item @click="changeMode">
|
<el-dropdown-item @click="changeMode">
|
||||||
<el-icon><Edit /></el-icon>{{ $t("header.changeMode") }}
|
<el-icon><Edit /></el-icon>{{ $t("header.changeMode") }}
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
|
<el-dropdown-item @click="openDialog('versionRegisterRef')">
|
||||||
|
<el-icon><SetUp /></el-icon>{{ $t("header.versionRegister") }}
|
||||||
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
@@ -29,6 +32,8 @@
|
|||||||
<InfoDialog ref="infoRef"></InfoDialog>
|
<InfoDialog ref="infoRef"></InfoDialog>
|
||||||
<!-- passwordDialog -->
|
<!-- passwordDialog -->
|
||||||
<PasswordDialog ref="passwordRef"></PasswordDialog>
|
<PasswordDialog ref="passwordRef"></PasswordDialog>
|
||||||
|
<!-- versionRegisterDialog -->
|
||||||
|
<VersionDialog ref="versionRegisterRef"></VersionDialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -40,6 +45,7 @@ import { useUserStore } from "@/stores/modules/user";
|
|||||||
import { ElMessageBox, ElMessage } from "element-plus";
|
import { ElMessageBox, ElMessage } from "element-plus";
|
||||||
import InfoDialog from "./InfoDialog.vue";
|
import InfoDialog from "./InfoDialog.vue";
|
||||||
import PasswordDialog from "./PasswordDialog.vue";
|
import PasswordDialog from "./PasswordDialog.vue";
|
||||||
|
import VersionDialog from "@/views/system/versionRegister/index.vue";
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
import { Avatar } from "@element-plus/icons-vue";
|
import { Avatar } from "@element-plus/icons-vue";
|
||||||
import AssemblySize from "./components/AssemblySize.vue";
|
import AssemblySize from "./components/AssemblySize.vue";
|
||||||
@@ -75,9 +81,12 @@ const logout = () => {
|
|||||||
// 打开修改密码和个人信息弹窗
|
// 打开修改密码和个人信息弹窗
|
||||||
const infoRef = ref<InstanceType<typeof InfoDialog> | null>(null);
|
const infoRef = ref<InstanceType<typeof InfoDialog> | null>(null);
|
||||||
const passwordRef = ref<InstanceType<typeof PasswordDialog> | null>(null);
|
const passwordRef = ref<InstanceType<typeof PasswordDialog> | null>(null);
|
||||||
|
const versionRegisterRef = ref<InstanceType<typeof VersionDialog> | null>(null);
|
||||||
|
|
||||||
const openDialog = (ref: string) => {
|
const openDialog = (ref: string) => {
|
||||||
if (ref == "infoRef") infoRef.value?.openDialog();
|
if (ref == "infoRef") infoRef.value?.openDialog();
|
||||||
if (ref == "passwordRef") passwordRef.value?.openDialog();
|
if (ref == "passwordRef") passwordRef.value?.openDialog();
|
||||||
|
if (ref == "versionRegisterRef") versionRegisterRef.value?.openDialog();
|
||||||
};
|
};
|
||||||
//模式切换
|
//模式切换
|
||||||
const changeMode = () => {
|
const changeMode = () => {
|
||||||
|
|||||||
26
frontend/src/stores/modules/mode.ts
Normal file
26
frontend/src/stores/modules/mode.ts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
// src/stores/modules/mode.ts
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
|
|
||||||
|
// export const useModeStore = defineStore('mode', {
|
||||||
|
// state: () => ({
|
||||||
|
// currentMode: '' as string,
|
||||||
|
// }),
|
||||||
|
// actions: {
|
||||||
|
// setCurrentMode(modeName: string) {
|
||||||
|
// this.currentMode = modeName;
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
export const useModeStore = defineStore('mode', {
|
||||||
|
state: () => ({
|
||||||
|
currentMode: localStorage.getItem('currentMode') || '' as string,
|
||||||
|
}),
|
||||||
|
actions: {
|
||||||
|
setCurrentMode(modeName: string) {
|
||||||
|
this.currentMode = modeName;
|
||||||
|
localStorage.setItem('currentMode', modeName); // 保存到 localStorage
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -124,12 +124,21 @@ const resetFormContent = () => {
|
|||||||
const formRuleRef = ref<FormInstance>()
|
const formRuleRef = ref<FormInstance>()
|
||||||
const rules : Ref<Record<string, Array<FormItemRule>>> = ref({
|
const rules : Ref<Record<string, Array<FormItemRule>>> = ref({
|
||||||
name :[{required:true,trigger:'blur',message:'菜单名称必填!'}],
|
name :[{required:true,trigger:'blur',message:'菜单名称必填!'}],
|
||||||
path :[{required:true,trigger:'blur',message:'菜单路径必填!'}],
|
|
||||||
type :[{required:true,trigger:'change',message:'菜单类型必选!'}],
|
|
||||||
component :[{required:true,trigger:'blur',message:'组件地址必填!'}],
|
|
||||||
code :[{required:true,trigger:'blur',message:'编码必填!'}]
|
code :[{required:true,trigger:'blur',message:'编码必填!'}]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(() => formContent.value.type, (newVal) => {
|
||||||
|
if (newVal === 1) {
|
||||||
|
// 选择按钮时,路由地址和组件地址无需校验
|
||||||
|
rules.value.path = [];
|
||||||
|
rules.value.component = [];
|
||||||
|
} else {
|
||||||
|
// 其他情况下,路由地址和组件地址需要校验
|
||||||
|
rules.value.path = [{ required: true, trigger: 'blur', message: '路由地址必填!' }];
|
||||||
|
rules.value.component = [{ required: true, trigger: 'blur', message: '组件地址必填!' }];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 关闭弹窗
|
// 关闭弹窗
|
||||||
const close = () => {
|
const close = () => {
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
@@ -155,7 +164,7 @@ const displayPid = computed({
|
|||||||
const save = () => {
|
const save = () => {
|
||||||
try {
|
try {
|
||||||
dialogFormRef.value?.validate(async (valid: boolean) => {
|
dialogFormRef.value?.validate(async (valid: boolean) => {
|
||||||
console.log(formContent.value)
|
|
||||||
if (formContent.value.pid === undefined || formContent.value.pid === null || formContent.value.pid === '') {
|
if (formContent.value.pid === undefined || formContent.value.pid === null || formContent.value.pid === '') {
|
||||||
formContent.value.pid = '0';
|
formContent.value.pid = '0';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,7 +160,6 @@
|
|||||||
LoginNameIsShow.value = true
|
LoginNameIsShow.value = true
|
||||||
formContent.value = { ...data }
|
formContent.value = { ...data }
|
||||||
|
|
||||||
console.log(formContent.value,111);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
IsPasswordShow.value = true
|
IsPasswordShow.value = true
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { useAuthStore } from "@/stores/modules/auth";
|
import { useAuthStore } from "@/stores/modules/auth";
|
||||||
|
|
||||||
import model from "./tabs/model.vue";
|
import model from "./tabs/model.vue";
|
||||||
import dashboard from "./tabs/dashboard.vue";
|
import dashboard from "./tabs/dashboard.vue";
|
||||||
import { onMounted } from "vue";
|
import { onMounted } from "vue";
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
size="small"
|
size="small"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handelOpen(item.isActive)"
|
@click="handelOpen(item)"
|
||||||
:disabled="item.isActive == false"
|
:disabled="item.isActive == false"
|
||||||
>进入检测</el-button
|
>进入检测</el-button
|
||||||
>
|
>
|
||||||
@@ -33,7 +33,9 @@
|
|||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { useAuthStore } from "@/stores/modules/auth";
|
import { useAuthStore } from "@/stores/modules/auth";
|
||||||
|
import { useModeStore } from "@/stores/modules/mode"; // 引入模式 store
|
||||||
const authStore = useAuthStore();
|
const authStore = useAuthStore();
|
||||||
|
const modeStore = useModeStore(); // 使用模式 store
|
||||||
const activeIndex = ref("1-1");
|
const activeIndex = ref("1-1");
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const modeList = [
|
const modeList = [
|
||||||
@@ -56,8 +58,10 @@ const modeList = [
|
|||||||
isActive: false,
|
isActive: false,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const handelOpen = async (isActive: any) => {
|
const handelOpen = async (item: any) => {
|
||||||
|
|
||||||
await authStore.setShowMenu();
|
await authStore.setShowMenu();
|
||||||
|
modeStore.setCurrentMode(item.name); // 将模式名称存入 store
|
||||||
return;
|
return;
|
||||||
if (isActive) {
|
if (isActive) {
|
||||||
router.push({ path: "/static" });
|
router.push({ path: "/static" });
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<el-divider >检测配置</el-divider>
|
<el-divider >检测配置</el-divider>
|
||||||
<el-row :gutter="24" >
|
<el-row :gutter="24" >
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label='一键检测方式' prop='autoGenerate' :label-width="100">
|
<el-form-item label='一键检测方式' prop='autoGenerate' :label-width="125">
|
||||||
<el-select v-model="TestConfigForm.autoGenerate" clearable placeholder="请选择一键检测方式" >
|
<el-select v-model="TestConfigForm.autoGenerate" clearable placeholder="请选择一键检测方式" >
|
||||||
<el-option label="只检测,报告后续手动生成" :value="0"></el-option>
|
<el-option label="只检测,报告后续手动生成" :value="0"></el-option>
|
||||||
<el-option label="检测和生成报告同时进行" :value="1"></el-option>
|
<el-option label="检测和生成报告同时进行" :value="1"></el-option>
|
||||||
@@ -14,12 +14,12 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label='复检最大次数' prop='maxTime' :label-width="100">
|
<el-form-item label='复检最大次数' prop='maxTime' >
|
||||||
<el-input-number v-model='TestConfigForm.maxTime' :min='1' :max='999' />
|
<el-input-number v-model='TestConfigForm.maxTime' :min='1' :max='999' />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label='数据处理原则' prop='dataRule' :label-width="100">
|
<el-form-item label='数据处理原则' prop='dataRule' :label-width="125">
|
||||||
<el-select v-model="TestConfigForm.dataRule" clearable placeholder="请选择数据处理原则" >
|
<el-select v-model="TestConfigForm.dataRule" clearable placeholder="请选择数据处理原则" >
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in dictStore.getDictData('Data_Rule')"
|
v-for="item in dictStore.getDictData('Data_Rule')"
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<el-form :model="RegResForm" ref='dialogFormRef' :rules='rules' >
|
||||||
<el-divider >有效数据配置</el-divider>
|
<el-divider >有效数据配置</el-divider>
|
||||||
<el-row :gutter="24" >
|
<el-row :gutter="24" >
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
@@ -55,7 +56,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
</el-form>
|
||||||
</div>
|
</div>
|
||||||
<div class="dialog-footer">
|
<div class="dialog-footer">
|
||||||
<el-button type="primary" @click="submitForm()">保存配置</el-button>
|
<el-button type="primary" @click="submitForm()">保存配置</el-button>
|
||||||
@@ -77,14 +78,18 @@
|
|||||||
import PqPopup from '@/views/system/dictionary/dictPq/components/pqPopup.vue'
|
import PqPopup from '@/views/system/dictionary/dictPq/components/pqPopup.vue'
|
||||||
import { useDictStore } from '@/stores/modules/dict'
|
import { useDictStore } from '@/stores/modules/dict'
|
||||||
import { useHandleData } from '@/hooks/useHandleData'
|
import { useHandleData } from '@/hooks/useHandleData'
|
||||||
import { onMounted, reactive, ref } from 'vue'
|
import { computed, onMounted, reactive, Ref, ref } from 'vue'
|
||||||
import {type Base } from '@/api/system/base/interface'
|
import {type Base } from '@/api/system/base/interface'
|
||||||
import {type VersionRegister } from '@/api/system/versionRegister/interface'
|
import {type VersionRegister } from '@/api/system/versionRegister/interface'
|
||||||
import {getTestConfig,updateTestConfig } from '@/api/system/base/index'
|
import {getTestConfig,updateTestConfig } from '@/api/system/base/index'
|
||||||
import {getRegRes,updateRegRes } from '@/api/system/versionRegister/index'
|
import {getRegRes,updateRegRes } from '@/api/system/versionRegister/index'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage, FormItemRule } from 'element-plus'
|
||||||
import { el } from 'element-plus/es/locale'
|
import { useModeStore } from '@/stores/modules/mode'; // 引入模式 store
|
||||||
|
|
||||||
|
const modeStore = useModeStore();
|
||||||
const dictStore = useDictStore()
|
const dictStore = useDictStore()
|
||||||
|
const dialogFormRef = ref()
|
||||||
|
const mode = ref()
|
||||||
const TestConfigForm = ref<Base.ResTestConfig>({
|
const TestConfigForm = ref<Base.ResTestConfig>({
|
||||||
id: '',
|
id: '',
|
||||||
autoGenerate: 0,
|
autoGenerate: 0,
|
||||||
@@ -107,6 +112,7 @@ import { el } from 'element-plus/es/locale'
|
|||||||
})
|
})
|
||||||
|
|
||||||
const RegResForm2 = ref<VersionRegister.Sys_Reg_Res>({
|
const RegResForm2 = ref<VersionRegister.Sys_Reg_Res>({
|
||||||
|
id:'',
|
||||||
waveRecord: 0,
|
waveRecord: 0,
|
||||||
realTime: 20,
|
realTime: 20,
|
||||||
statistics: 5,
|
statistics: 5,
|
||||||
@@ -114,15 +120,44 @@ const RegResForm2 = ref<VersionRegister.Sys_Reg_Res>({
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// 定义弹出组件元信息
|
||||||
|
const rules = computed(() =>{
|
||||||
|
const baseRules : Ref<Record<string, Array<FormItemRule>>> = ref({
|
||||||
|
realTime :[
|
||||||
|
{required:true,trigger:'blur',message:'实时数据有效组数必填!'},
|
||||||
|
{ pattern: /^[0-9]\d*$/, message: '实时数据有效组数为含0的正整数', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
statistics :[
|
||||||
|
{required:true,trigger:'blur',message:'统计数据有效组数必填!'},
|
||||||
|
{ pattern: /^[0-9]\d*$/, message: '统计数据有效组数为含0的正整数', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
flicker :[
|
||||||
|
{required:true,trigger:'blur',message:'闪变数据有效组数必填!'},
|
||||||
|
{ pattern: /^[0-9]\d*$/, message: '闪变数据有效组数为含0的正整数', trigger: 'blur' }
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
if(mode.value == '比对式'){
|
||||||
|
baseRules.value.waveRecord = [
|
||||||
|
{required:true,trigger:'blur',message:'录波数据有效组数必填!'},
|
||||||
|
{ pattern: /^[0-9]\d*$/, message: '录波数据有效组数为含0的正整数', trigger: 'blur' }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseRules;
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
const TestConfigList = ref<Base.ResTestConfig>()
|
const TestConfigList = ref<Base.ResTestConfig>()
|
||||||
const RegResList = ref<VersionRegister.ResSys_Reg_Res>()
|
const RegResList = ref<VersionRegister.ResSys_Reg_Res>()
|
||||||
// 初始化时获取
|
// 初始化时获取
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
mode.value =modeStore.currentMode.replace('模块', '');//pinia中获取当前是那个模块进来的,临时处理去除模块两字
|
||||||
const response = await getTestConfig()
|
const response = await getTestConfig()
|
||||||
TestConfigForm.value = response.data as unknown as Base.ResTestConfig
|
TestConfigForm.value = response.data as unknown as Base.ResTestConfig
|
||||||
|
//console.log(mode)
|
||||||
const patternId = dictStore.getDictData('Pattern').find(item=>item.name==='模拟式')?.id
|
const patternId = dictStore.getDictData('Pattern').find(item=>item.name=== mode.value)?.id//获取数据字典中对应的id
|
||||||
RegResForm.value.type = patternId || '';
|
RegResForm.value.type = patternId || '';
|
||||||
const response2 = await getRegRes(RegResForm.value)
|
const response2 = await getRegRes(RegResForm.value)
|
||||||
RegResForm.value = response2.data as unknown as VersionRegister.ResSys_Reg_Res
|
RegResForm.value = response2.data as unknown as VersionRegister.ResSys_Reg_Res
|
||||||
@@ -131,7 +166,8 @@ const RegResForm2 = ref<VersionRegister.Sys_Reg_Res>({
|
|||||||
|
|
||||||
const submitForm = async () => {
|
const submitForm = async () => {
|
||||||
try {
|
try {
|
||||||
if (TestConfigForm.value.id) {
|
dialogFormRef.value?.validate(async (valid: boolean) => {
|
||||||
|
if (valid) {
|
||||||
await updateTestConfig(TestConfigForm.value);
|
await updateTestConfig(TestConfigForm.value);
|
||||||
|
|
||||||
// 提取并传递 4 个参数
|
// 提取并传递 4 个参数
|
||||||
@@ -145,6 +181,7 @@ const RegResForm2 = ref<VersionRegister.Sys_Reg_Res>({
|
|||||||
|
|
||||||
ElMessage.success({ message: `保存配置成功!` })
|
ElMessage.success({ message: `保存配置成功!` })
|
||||||
}
|
}
|
||||||
|
})
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('验证过程中出现错误', err)
|
console.error('验证过程中出现错误', err)
|
||||||
}
|
}
|
||||||
|
|||||||
54
frontend/src/views/system/versionRegister/index.vue
Normal file
54
frontend/src/views/system/versionRegister/index.vue
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog v-model="dialogVisible" title="程序激活" width="500px" draggable>
|
||||||
|
<el-form :model="formContent">
|
||||||
|
<el-form-item label="程序版本号" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="模拟式模块" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="数字式模块" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="比对式模块" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="序列号" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="注册码" prop="pid" :label-width="100">
|
||||||
|
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<span class="dialog-footer">
|
||||||
|
<el-button @click="dialogVisible = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="dialogVisible = false">激活</el-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
const formContent = ref<Function.ResFunction>({
|
||||||
|
id: '',//资源表Id
|
||||||
|
pid:'',//节点(0为根节点)
|
||||||
|
pids:'',//节点上层所有节点
|
||||||
|
name: '',//名称
|
||||||
|
code:'',//资源标识
|
||||||
|
path:'',//路径
|
||||||
|
component:'',
|
||||||
|
icon:undefined as string | undefined, // 图标
|
||||||
|
sort:100,//排序
|
||||||
|
type:0,//资源类型0-菜单、1-按钮、2-公共资源、3-服务间调用资源
|
||||||
|
remark: '',//权限资源描述
|
||||||
|
state:1,//权限资源状态
|
||||||
|
})
|
||||||
|
const dialogVisible = ref(false);
|
||||||
|
const openDialog = () => {
|
||||||
|
dialogVisible.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
defineExpose({ openDialog });
|
||||||
|
</script>
|
||||||
Reference in New Issue
Block a user