|
@@ -1,12 +1,20 @@
|
|
|
<template>
|
|
|
- <n-modal v-model:show="modalVisible" preset="card" :title="title" class="w-700px">
|
|
|
- <n-form ref="formRef" label-placement="left" :label-width="90" :model="formModel" :rules="rules">
|
|
|
+ <n-modal v-model:show="modalVisible" preset="card" :title="title" class="w-1200px">
|
|
|
+ <n-form ref="formRef" label-placement="left" :label-width="90" :model="formModel">
|
|
|
<n-grid :cols="50" :x-gap="18">
|
|
|
- <n-form-item-grid-item :span="18" label="客户端ID" size="large" path="client_id">
|
|
|
+ <!-- <n-form-item-grid-item :span="18" label="客户端ID" size="large" path="client_id">
|
|
|
<n-input v-model:value="formModel.client_id" />
|
|
|
+ </n-form-item-grid-item>-->
|
|
|
+ <n-form-item-grid-item :span="18" label="集团名称" size="large" path="group_id">
|
|
|
+ <n-select
|
|
|
+ v-model:value="formModel.group_id"
|
|
|
+ :options="groupEnumListData"
|
|
|
+ clearable
|
|
|
+ @update:value="handleUpdateValue"
|
|
|
+ />
|
|
|
</n-form-item-grid-item>
|
|
|
<n-form-item-grid-item :span="18" label="牧场名称" size="large" path="pasture_id">
|
|
|
- <n-select v-model:value="formModel.pasture_id" :options="pastureEnumListData" />
|
|
|
+ <n-select v-model:value="formModel.pasture_id" :options="groupPastureEnumListData" clearable />
|
|
|
</n-form-item-grid-item>
|
|
|
<n-form-item-grid-item :span="18" label="用户名称" size="large" path="user_name">
|
|
|
<n-input v-model:value="formModel.user_name" />
|
|
@@ -14,10 +22,10 @@
|
|
|
<n-form-item-grid-item :span="18" label="用户密码" size="large" path="password">
|
|
|
<n-input v-model:value="formModel.password" type="password" />
|
|
|
</n-form-item-grid-item>
|
|
|
- <n-form-item-grid-item :span="18" label="订阅主题名(topic)" size="large" path="topic_ids">
|
|
|
+ <n-form-item-grid-item :span="18" label="订阅主题名(sub)" size="large" path="subscribe_topic_ids">
|
|
|
<n-select v-model:value="formModel.subscribe_topic_ids" multiple :options="subscribeTopicEnumListData" />
|
|
|
</n-form-item-grid-item>
|
|
|
- <n-form-item-grid-item :span="18" label="发布主题名(topic)" size="large" path="topic_ids">
|
|
|
+ <n-form-item-grid-item :span="18" label="发布主题名(pub)" size="large" path="publish_topic_ids">
|
|
|
<n-select v-model:value="formModel.publish_topic_ids" multiple :options="publishTopicEnumListData" />
|
|
|
</n-form-item-grid-item>
|
|
|
</n-grid>
|
|
@@ -31,9 +39,8 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { computed, ref, reactive, watch } from 'vue';
|
|
|
-import type { FormInst, FormItemRule, SelectOption } from 'naive-ui';
|
|
|
-import { createRequiredFormRule } from '@/utils';
|
|
|
-import { mqttAuthAdd, mqttAuthEdit } from '@/service/api/mqtt';
|
|
|
+import type { FormInst, SelectOption } from 'naive-ui';
|
|
|
+import { groupPastureEnumList, mqttAuthAdd, mqttAuthEdit, topicEnumList } from '@/service/api/mqtt';
|
|
|
import { MD5 } from '@/utils/crypto';
|
|
|
export interface Props {
|
|
|
/** 弹窗可见性 */
|
|
@@ -46,13 +53,29 @@ export interface Props {
|
|
|
type?: 'add' | 'edit';
|
|
|
/** 编辑的表格行数据 */
|
|
|
editData?: Mqtt.Auth | null;
|
|
|
- pastureEnumListData: SelectOption[];
|
|
|
- subscribeTopicEnumListData: SelectOption[];
|
|
|
- publishTopicEnumListData: SelectOption[];
|
|
|
+ groupEnumListData: SelectOption[];
|
|
|
}
|
|
|
|
|
|
export type ModalType = NonNullable<Props['type']>;
|
|
|
|
|
|
+const groupPastureEnumListData = ref<SelectOption[]>([]);
|
|
|
+const subscribeTopicEnumListData = ref<SelectOption[]>([]);
|
|
|
+const publishTopicEnumListData = ref<SelectOption[]>([]);
|
|
|
+const sub = 1; // 订阅
|
|
|
+const pub = 2; // 发布
|
|
|
+
|
|
|
+function setGroupPastureList(data: SelectOption[]) {
|
|
|
+ groupPastureEnumListData.value = data;
|
|
|
+}
|
|
|
+
|
|
|
+function setSubTopicEnumList(data: SelectOption[]) {
|
|
|
+ subscribeTopicEnumListData.value = data;
|
|
|
+}
|
|
|
+
|
|
|
+function setPubTopicEnumList(data: SelectOption[]) {
|
|
|
+ publishTopicEnumListData.value = data;
|
|
|
+}
|
|
|
+
|
|
|
defineOptions({ name: 'TableActionModal' });
|
|
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
@@ -80,8 +103,8 @@ const closeModal = () => {
|
|
|
};
|
|
|
|
|
|
const titles: Record<ModalType, string> = {
|
|
|
- add: '添加用户',
|
|
|
- edit: '编辑用户'
|
|
|
+ add: '添加鉴权',
|
|
|
+ edit: '编辑鉴权'
|
|
|
};
|
|
|
|
|
|
const title = computed(() => {
|
|
@@ -96,6 +119,8 @@ type FormModel = Pick<
|
|
|
| 'mount_point'
|
|
|
| 'pasture_id'
|
|
|
| 'pasture_name'
|
|
|
+ | 'group_id'
|
|
|
+ | 'group_name'
|
|
|
| 'user_name'
|
|
|
| 'password'
|
|
|
| 'client_id'
|
|
@@ -104,44 +129,26 @@ type FormModel = Pick<
|
|
|
| 'publish_acl'
|
|
|
| 'subscribe_acl'
|
|
|
| 'access'
|
|
|
- | 'is_show'
|
|
|
| 'created_at_format'
|
|
|
| 'updated_at_format'
|
|
|
>;
|
|
|
|
|
|
const formModel = reactive<FormModel>(createDefaultFormModel());
|
|
|
|
|
|
-const rules: Record<keyof FormModel, FormItemRule | FormItemRule[]> = {
|
|
|
- pasture_id: createRequiredFormRule('请选择牧场'),
|
|
|
- user_name: createRequiredFormRule('请输入用户名称'),
|
|
|
- password: createRequiredFormRule('请输入用户密码'),
|
|
|
- client_id: createRequiredFormRule('请输入客户端id'),
|
|
|
- publish_topic_ids: createRequiredFormRule('请选择topic模板'),
|
|
|
- subscribe_topic_ids: createRequiredFormRule('请选择topic模板'),
|
|
|
- access: createRequiredFormRule('请选择topic权限'),
|
|
|
- is_show: createRequiredFormRule(),
|
|
|
- mount_point: createRequiredFormRule(),
|
|
|
- pasture_name: createRequiredFormRule(),
|
|
|
- subscribe_acl: createRequiredFormRule(),
|
|
|
- publish_acl: createRequiredFormRule(),
|
|
|
- created_at_format: createRequiredFormRule(),
|
|
|
- updated_at_format: createRequiredFormRule(),
|
|
|
- id: createRequiredFormRule()
|
|
|
-};
|
|
|
-
|
|
|
function createDefaultFormModel(): FormModel {
|
|
|
return {
|
|
|
id: 0,
|
|
|
mount_point: '',
|
|
|
pasture_id: null,
|
|
|
pasture_name: '',
|
|
|
+ group_id: null,
|
|
|
+ group_name: '',
|
|
|
user_name: '',
|
|
|
password: '',
|
|
|
client_id: '',
|
|
|
publish_topic_ids: [],
|
|
|
subscribe_topic_ids: [],
|
|
|
access: 0,
|
|
|
- is_show: 1,
|
|
|
publish_acl: '',
|
|
|
subscribe_acl: '',
|
|
|
created_at_format: '',
|
|
@@ -168,6 +175,35 @@ function handleUpdateFormModelByModalType() {
|
|
|
handlers[props.type]();
|
|
|
}
|
|
|
|
|
|
+async function handleUpdateValue(value: string) {
|
|
|
+ {
|
|
|
+ const { data } = await groupPastureEnumList(value);
|
|
|
+ if (data) {
|
|
|
+ setTimeout(() => {
|
|
|
+ setGroupPastureList(data);
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ const { data } = await topicEnumList(sub, formModel.group_id);
|
|
|
+ if (data) {
|
|
|
+ setTimeout(() => {
|
|
|
+ setSubTopicEnumList(data);
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ {
|
|
|
+ const { data } = await topicEnumList(pub, formModel.group_id);
|
|
|
+ if (data) {
|
|
|
+ setTimeout(() => {
|
|
|
+ setPubTopicEnumList(data);
|
|
|
+ }, 100);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
async function handleSubmit() {
|
|
|
await formRef.value?.validate();
|
|
|
if (props.type === 'add') {
|