|
@@ -1,43 +1,43 @@
|
|
<template>
|
|
<template>
|
|
- <div class="system-edit-dic-container">
|
|
|
|
- <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '产品'" v-model="isShowDialog" width="769px">
|
|
|
|
- <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="100px">
|
|
|
|
- <el-form-item label="产品标识" prop="key">
|
|
|
|
- <el-input v-model="ruleForm.key" placeholder="请输入产品标识" :disabled="ruleForm.id" />
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="产品名称" prop="name">
|
|
|
|
- <el-input v-model="ruleForm.name" placeholder="请输入产品名称" />
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="产品图片" prop="imageUrl">
|
|
|
|
- <uploadVue :img="imageUrl" @set-img="handleAvatarSuccess"></uploadVue>
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
+ <div class="system-edit-dic-container">
|
|
|
|
+ <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '产品'" v-model="isShowDialog" width="769px">
|
|
|
|
+ <el-form :model="ruleForm" ref="formRef" :rules="rules" label-width="100px">
|
|
|
|
+ <el-form-item label="产品标识" prop="key">
|
|
|
|
+ <el-input v-model="ruleForm.key" placeholder="请输入产品标识" :disabled="ruleForm.id" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="产品名称" prop="name">
|
|
|
|
+ <el-input v-model="ruleForm.name" placeholder="请输入产品名称" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="产品图片" prop="imageUrl">
|
|
|
|
+ <uploadVue :img="imageUrl" @set-img="handleAvatarSuccess"></uploadVue>
|
|
|
|
+ </el-form-item>
|
|
|
|
|
|
- <el-form-item label="产品分类" prop="categoryId">
|
|
|
|
- <el-cascader :options="cateData" :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'name' }" placeholder="请选择分类" class="w" clearable v-model="ruleForm.categoryId">
|
|
|
|
- <template #default="{ node, data }">
|
|
|
|
- <span>{{ data.name }}</span>
|
|
|
|
- <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
|
|
|
- </template>
|
|
|
|
- </el-cascader>
|
|
|
|
|
|
+ <el-form-item label="产品分类" prop="categoryId">
|
|
|
|
+ <el-cascader :options="cateData" :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'name' }" placeholder="请选择分类" class="w" clearable v-model="ruleForm.categoryId">
|
|
|
|
+ <template #default="{ node, data }">
|
|
|
|
+ <span>{{ data.name }}</span>
|
|
|
|
+ <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-cascader>
|
|
|
|
|
|
- <!-- 添加产品分类 -->
|
|
|
|
- <el-button type="success" @click="onOpenAddCategory()" style="margin-left: 5px;">添加产品分类</el-button>
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
+ <!-- 添加产品分类 -->
|
|
|
|
+ <el-button type="success" @click="onOpenAddCategory()" style="margin-left: 5px">添加产品分类</el-button>
|
|
|
|
+ </el-form-item>
|
|
|
|
|
|
- <el-form-item label="消息协议" prop="messageProtocol">
|
|
|
|
- <el-select v-model="ruleForm.messageProtocol" placeholder="请选择消息协议">
|
|
|
|
- <el-option v-for="dict in messageData" :key="dict.types" :label="dict.title" :value="dict.name"> </el-option>
|
|
|
|
- <!-- 增加系统默认的mqtt选项 -->
|
|
|
|
- <el-option label="Sagoo Mqtt" value="SagooMqtt"> </el-option>
|
|
|
|
- </el-select>
|
|
|
|
- </el-form-item>
|
|
|
|
|
|
+ <el-form-item label="消息协议" prop="messageProtocol">
|
|
|
|
+ <el-select v-model="ruleForm.messageProtocol" placeholder="请选择消息协议">
|
|
|
|
+ <el-option v-for="dict in messageData" :key="dict.types" :label="dict.title" :value="dict.name"> </el-option>
|
|
|
|
+ <!-- 增加系统默认的mqtt选项 -->
|
|
|
|
+ <el-option label="Sagoo Mqtt" value="SagooMqtt"> </el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
|
|
- <el-form-item label="接入方式" prop="transportProtocol">
|
|
|
|
- <el-select v-model="ruleForm.transportProtocol" placeholder="请选择接入方式" @change="transportProtocolChange">
|
|
|
|
- <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
|
|
|
|
- </el-select>
|
|
|
|
- </el-form-item>
|
|
|
|
- <!-- 1,mqtt协议设备的认证
|
|
|
|
|
|
+ <el-form-item label="接入方式" prop="transportProtocol">
|
|
|
|
+ <el-select v-model="ruleForm.transportProtocol" placeholder="请选择接入方式" @change="transportProtocolChange">
|
|
|
|
+ <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <!-- 1,mqtt协议设备的认证
|
|
在添加设备的页面,增加MQTT服务协议设备的认证方式的处理。
|
|
在添加设备的页面,增加MQTT服务协议设备的认证方式的处理。
|
|
当传输协议选择为:MQTT服务的时候,下面出现 认证方式的下拉列,分别为Basic、AccessToken接入两个下拉选项。
|
|
当传输协议选择为:MQTT服务的时候,下面出现 认证方式的下拉列,分别为Basic、AccessToken接入两个下拉选项。
|
|
Basic方式:
|
|
Basic方式:
|
|
@@ -46,312 +46,319 @@
|
|
选择这个方式的时候:页面出现 Aceess Token的输入框
|
|
选择这个方式的时候:页面出现 Aceess Token的输入框
|
|
2,TCP及其它协议认证
|
|
2,TCP及其它协议认证
|
|
这些配合【网络组件】功能中涉及到的设备通讯协议认证的处理。如果涉及到证书的,需要调用【证书管理】功能维护的证书列表。 -->
|
|
这些配合【网络组件】功能中涉及到的设备通讯协议认证的处理。如果涉及到证书的,需要调用【证书管理】功能维护的证书列表。 -->
|
|
- <!-- 设备认证、网络组件服务增加认证方式authType(1=Basic,2=AccessToken,3=证书)
|
|
|
|
|
|
+ <!-- 设备认证、网络组件服务增加认证方式authType(1=Basic,2=AccessToken,3=证书)
|
|
涉及接口:产品添加、编辑、扩展信息更新;设备添加、编辑;网络组件服务添加、编辑 -->
|
|
涉及接口:产品添加、编辑、扩展信息更新;设备添加、编辑;网络组件服务添加、编辑 -->
|
|
- <!-- 设备认证 -->
|
|
|
|
- <template v-if="ruleForm.authType === 1 || ruleForm.authType === 2">
|
|
|
|
- <el-form-item label="认证方式" prop="">
|
|
|
|
- <el-radio-group v-model="ruleForm.authType">
|
|
|
|
- <el-radio :label="1">Basic</el-radio>
|
|
|
|
- <el-radio :label="2">AccessToken</el-radio>
|
|
|
|
- </el-radio-group>
|
|
|
|
- </el-form-item>
|
|
|
|
- <template v-if="ruleForm.authType === 1">
|
|
|
|
- <el-form-item label="用户名" prop="authUser">
|
|
|
|
- <el-input v-model="ruleForm.authUser" placeholder="请输入用户名" />
|
|
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="密码" prop="authPasswd">
|
|
|
|
- <el-input type="password" v-model="ruleForm.authPasswd" placeholder="请输入密码" />
|
|
|
|
- </el-form-item>
|
|
|
|
- </template>
|
|
|
|
- <template v-else>
|
|
|
|
- <el-form-item label="Aceess Token" prop="accessToken">
|
|
|
|
- <el-input v-model="ruleForm.accessToken" placeholder="请输入Aceess Token" />
|
|
|
|
- </el-form-item>
|
|
|
|
- </template>
|
|
|
|
- </template>
|
|
|
|
- <template v-else-if="ruleForm.authType === 3">
|
|
|
|
- <el-form-item label="认证证书" prop="certificateId">
|
|
|
|
- <el-select v-model="ruleForm.certificateId" placeholder="请选择证书">
|
|
|
|
- <el-option v-for="cert in certList" :key="cert.id" :label="cert.name" :value="cert.id"> </el-option>
|
|
|
|
- </el-select>
|
|
|
|
- </el-form-item>
|
|
|
|
- </template>
|
|
|
|
|
|
+ <!-- 设备认证 -->
|
|
|
|
+ <template v-if="ruleForm.authType === 1 || ruleForm.authType === 2">
|
|
|
|
+ <el-form-item label="认证方式" prop="">
|
|
|
|
+ <el-radio-group v-model="ruleForm.authType">
|
|
|
|
+ <el-radio :label="1">Basic</el-radio>
|
|
|
|
+ <el-radio :label="2">AccessToken</el-radio>
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <template v-if="ruleForm.authType === 1">
|
|
|
|
+ <el-form-item label="用户名" prop="authUser">
|
|
|
|
+ <el-input v-model="ruleForm.authUser" placeholder="请输入用户名" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="密码" prop="authPasswd">
|
|
|
|
+ <el-input type="password" v-model="ruleForm.authPasswd" placeholder="请输入密码" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <el-form-item label="Aceess Token" prop="accessToken">
|
|
|
|
+ <el-input v-model="ruleForm.accessToken" placeholder="请输入Aceess Token" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else-if="ruleForm.authType === 3">
|
|
|
|
+ <el-form-item label="认证证书" prop="certificateId">
|
|
|
|
+ <el-select v-model="ruleForm.certificateId" placeholder="请选择证书">
|
|
|
|
+ <el-option v-for="cert in certList" :key="cert.id" :label="cert.name" :value="cert.id"> </el-option>
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
|
|
- <el-form-item label="设备类型" prop="deviceType">
|
|
|
|
- <el-radio-group v-model="ruleForm.deviceType">
|
|
|
|
- <el-radio label="设备">直连设备</el-radio>
|
|
|
|
- <el-radio label="子设备">子设备</el-radio>
|
|
|
|
- <el-radio label="网关">网关设备</el-radio>
|
|
|
|
|
|
+ <el-form-item label="设备类型" prop="deviceType">
|
|
|
|
+ <el-radio-group v-model="ruleForm.deviceType">
|
|
|
|
+ <el-radio label="设备">设备</el-radio>
|
|
|
|
+ <el-radio label="网关">设备</el-radio>
|
|
|
|
+ <!-- <el-radio label="设备">直连设备</el-radio>
|
|
|
|
+ <el-radio label="网关">网关设备</el-radio> -->
|
|
|
|
+ <el-radio label="子设备">子设备</el-radio>
|
|
</el-radio-group>
|
|
</el-radio-group>
|
|
- </el-form-item>
|
|
|
|
- <el-form-item label="产品描述 " prop="desc">
|
|
|
|
- <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入产品描述"></el-input>
|
|
|
|
- </el-form-item>
|
|
|
|
- </el-form>
|
|
|
|
- <template #footer>
|
|
|
|
- <span class="dialog-footer">
|
|
|
|
- <el-button @click="onCancel">取 消</el-button>
|
|
|
|
- <el-button type="primary" @click="onSubmit" :loading="submitLoading">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
|
|
|
|
- </span>
|
|
|
|
- </template>
|
|
|
|
- </el-dialog>
|
|
|
|
- <EditCategory ref="editCategoryRef" @getCateList="getCategoryList" />
|
|
|
|
- </div>
|
|
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="产品描述 " prop="desc">
|
|
|
|
+ <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入产品描述"></el-input>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
|
|
+ <template #footer>
|
|
|
|
+ <span class="dialog-footer">
|
|
|
|
+ <el-button @click="onCancel">取 消</el-button>
|
|
|
|
+ <el-button type="primary" @click="onSubmit" :loading="submitLoading">{{ ruleForm.id !== 0 ? "修 改" : "添 加" }}</el-button>
|
|
|
|
+ </span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-dialog>
|
|
|
|
+ <EditCategory ref="editCategoryRef" @getCateList="getCategoryList" />
|
|
|
|
+ </div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
-import { reactive, toRefs, defineComponent, ref, unref, getCurrentInstance } from 'vue'
|
|
|
|
-import api from '/@/api/device'
|
|
|
|
-import certApi from '/@/api/certificateManagement';
|
|
|
|
-import uploadVue from '/@/components/upload/index.vue'
|
|
|
|
-import { validateNoSpace } from '/@/utils/validator';
|
|
|
|
|
|
+import { reactive, toRefs, defineComponent, ref, unref, getCurrentInstance } from "vue";
|
|
|
|
+import api from "/@/api/device";
|
|
|
|
+import certApi from "/@/api/certificateManagement";
|
|
|
|
+import uploadVue from "/@/components/upload/index.vue";
|
|
|
|
+import { validateNoSpace } from "/@/utils/validator";
|
|
|
|
|
|
-import { ElMessage, UploadProps } from 'element-plus'
|
|
|
|
-import getOrigin from '/@/utils/origin'
|
|
|
|
|
|
+import { ElMessage, UploadProps } from "element-plus";
|
|
|
|
+import getOrigin from "/@/utils/origin";
|
|
import EditCategory from "/@/views/iot/device/category/component/edit.vue";
|
|
import EditCategory from "/@/views/iot/device/category/component/edit.vue";
|
|
|
|
|
|
interface RuleFormState {
|
|
interface RuleFormState {
|
|
- id: number
|
|
|
|
- categoryId: number | string
|
|
|
|
- messageProtocol: string
|
|
|
|
- transportProtocol: string
|
|
|
|
- deviceType: string
|
|
|
|
- name: string
|
|
|
|
- key: string
|
|
|
|
- authType: number| null
|
|
|
|
- status: number
|
|
|
|
- desc: string
|
|
|
|
- icon: string
|
|
|
|
- authUser: string
|
|
|
|
- authPasswd: string
|
|
|
|
- accessToken: string
|
|
|
|
- certificateId: string
|
|
|
|
|
|
+ id: number;
|
|
|
|
+ categoryId: number | string;
|
|
|
|
+ messageProtocol: string;
|
|
|
|
+ transportProtocol: string;
|
|
|
|
+ deviceType: string;
|
|
|
|
+ name: string;
|
|
|
|
+ key: string;
|
|
|
|
+ authType: number | null;
|
|
|
|
+ status: number;
|
|
|
|
+ desc: string;
|
|
|
|
+ icon: string;
|
|
|
|
+ authUser: string;
|
|
|
|
+ authPasswd: string;
|
|
|
|
+ accessToken: string;
|
|
|
|
+ certificateId: string;
|
|
}
|
|
}
|
|
interface DicState {
|
|
interface DicState {
|
|
- isShowDialog: boolean
|
|
|
|
- ruleForm: RuleFormState
|
|
|
|
- cateData: any[]
|
|
|
|
- deptData: any[]
|
|
|
|
- messageData: any[]
|
|
|
|
- network_protocols: any[]
|
|
|
|
- tranData: any[]
|
|
|
|
- rules: {}
|
|
|
|
- imageUrl: string
|
|
|
|
- singleImg: string
|
|
|
|
|
|
+ isShowDialog: boolean;
|
|
|
|
+ ruleForm: RuleFormState;
|
|
|
|
+ cateData: any[];
|
|
|
|
+ deptData: any[];
|
|
|
|
+ messageData: any[];
|
|
|
|
+ network_protocols: any[];
|
|
|
|
+ tranData: any[];
|
|
|
|
+ rules: {};
|
|
|
|
+ imageUrl: string;
|
|
|
|
+ singleImg: string;
|
|
}
|
|
}
|
|
|
|
|
|
const form = {
|
|
const form = {
|
|
- id: 0,
|
|
|
|
- name: '',
|
|
|
|
- key: '',
|
|
|
|
- categoryId: '',
|
|
|
|
- messageProtocol: '',
|
|
|
|
- transportProtocol: '',
|
|
|
|
- deviceType: '设备',
|
|
|
|
- status: 1,
|
|
|
|
- desc: '',
|
|
|
|
- icon: '',
|
|
|
|
- authType: null,
|
|
|
|
- authUser: '',
|
|
|
|
- authPasswd: '',
|
|
|
|
- accessToken: '',
|
|
|
|
- certificateId: '',
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
|
|
+ id: 0,
|
|
|
|
+ name: "",
|
|
|
|
+ key: "",
|
|
|
|
+ categoryId: "",
|
|
|
|
+ messageProtocol: "",
|
|
|
|
+ transportProtocol: "",
|
|
|
|
+ deviceType: "设备",
|
|
|
|
+ status: 1,
|
|
|
|
+ desc: "",
|
|
|
|
+ icon: "",
|
|
|
|
+ authType: null,
|
|
|
|
+ authUser: "",
|
|
|
|
+ authPasswd: "",
|
|
|
|
+ accessToken: "",
|
|
|
|
+ certificateId: "",
|
|
|
|
+};
|
|
|
|
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
- name: 'deviceEditPro',
|
|
|
|
- components: { EditCategory, uploadVue },
|
|
|
|
- setup(prop, { emit }) {
|
|
|
|
- const formRef = ref<HTMLElement | null>(null)
|
|
|
|
- const baseURL: string | undefined | boolean = getOrigin()
|
|
|
|
|
|
+ name: "deviceEditPro",
|
|
|
|
+ components: { EditCategory, uploadVue },
|
|
|
|
+ setup(prop, { emit }) {
|
|
|
|
+ const formRef = ref<HTMLElement | null>(null);
|
|
|
|
+ const baseURL: string | undefined | boolean = getOrigin();
|
|
|
|
|
|
- const { proxy } = getCurrentInstance() as any
|
|
|
|
- const { network_server_type } = proxy.useDict('network_server_type')
|
|
|
|
|
|
+ const { proxy } = getCurrentInstance() as any;
|
|
|
|
+ const { network_server_type } = proxy.useDict("network_server_type");
|
|
|
|
|
|
- const certList = ref<any[]>([])
|
|
|
|
- const submitLoading = ref(false)
|
|
|
|
- const editCategoryRef = ref();
|
|
|
|
|
|
+ const certList = ref<any[]>([]);
|
|
|
|
+ const submitLoading = ref(false);
|
|
|
|
+ const editCategoryRef = ref();
|
|
|
|
|
|
- const state = reactive<DicState>({
|
|
|
|
- isShowDialog: false,
|
|
|
|
- cateData: [], // 分类数据
|
|
|
|
- deptData: [], //
|
|
|
|
- messageData: [], //
|
|
|
|
- network_protocols: [], // 消息协议
|
|
|
|
- tranData: [], //
|
|
|
|
- imageUrl: '', //
|
|
|
|
- singleImg: baseURL + '/product/icon/upload',
|
|
|
|
- ruleForm: {
|
|
|
|
- ...form
|
|
|
|
- },
|
|
|
|
- rules: {
|
|
|
|
- name: [
|
|
|
|
- { required: true, message: '产品名称不能为空', trigger: 'change' },
|
|
|
|
- { max: 32, message: '产品名称不能超过32个字符', trigger: 'change' },
|
|
|
|
- { validator: validateNoSpace, message: '产品名称不能包含空格', trigger: 'change' }
|
|
|
|
- ],
|
|
|
|
- key: [
|
|
|
|
- { required: true, message: '产品标识不能为空', trigger: 'change' },
|
|
|
|
- { validator: validateNoSpace, message: '产品标识不能包含空格', trigger: 'change' }
|
|
|
|
- ],
|
|
|
|
- messageProtocol: [{ required: true, message: '消息协议不能为空', trigger: 'change' }],
|
|
|
|
- transportProtocol: [{ required: true, message: '接入方式不能为空', trigger: 'change' }],
|
|
|
|
- categoryId: [{ required: true, message: '产品分类不能为空', trigger: 'change' }],
|
|
|
|
- deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'change' }],
|
|
|
|
- },
|
|
|
|
- })
|
|
|
|
|
|
+ const state = reactive<DicState>({
|
|
|
|
+ isShowDialog: false,
|
|
|
|
+ cateData: [], // 分类数据
|
|
|
|
+ deptData: [], //
|
|
|
|
+ messageData: [], //
|
|
|
|
+ network_protocols: [], // 消息协议
|
|
|
|
+ tranData: [], //
|
|
|
|
+ imageUrl: "", //
|
|
|
|
+ singleImg: baseURL + "/product/icon/upload",
|
|
|
|
+ ruleForm: {
|
|
|
|
+ ...form,
|
|
|
|
+ },
|
|
|
|
+ rules: {
|
|
|
|
+ name: [
|
|
|
|
+ { required: true, message: "产品名称不能为空", trigger: "change" },
|
|
|
|
+ { max: 32, message: "产品名称不能超过32个字符", trigger: "change" },
|
|
|
|
+ { validator: validateNoSpace, message: "产品名称不能包含空格", trigger: "change" },
|
|
|
|
+ ],
|
|
|
|
+ key: [
|
|
|
|
+ { required: true, message: "产品标识不能为空", trigger: "change" },
|
|
|
|
+ { validator: validateNoSpace, message: "产品标识不能包含空格", trigger: "change" },
|
|
|
|
+ ],
|
|
|
|
+ messageProtocol: [{ required: true, message: "消息协议不能为空", trigger: "change" }],
|
|
|
|
+ transportProtocol: [{ required: true, message: "接入方式不能为空", trigger: "change" }],
|
|
|
|
+ categoryId: [{ required: true, message: "产品分类不能为空", trigger: "change" }],
|
|
|
|
+ deviceType: [{ required: true, message: "设备类型不能为空", trigger: "change" }],
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
|
|
- const handleAvatarSuccess: UploadProps['onSuccess'] = (response) => {
|
|
|
|
- state.imageUrl = response
|
|
|
|
- state.ruleForm.icon = response
|
|
|
|
- }
|
|
|
|
|
|
+ const handleAvatarSuccess: UploadProps["onSuccess"] = (response) => {
|
|
|
|
+ state.imageUrl = response;
|
|
|
|
+ state.ruleForm.icon = response;
|
|
|
|
+ };
|
|
|
|
|
|
- // 打开弹窗
|
|
|
|
- const openDialog = (row?: any) => {
|
|
|
|
- resetForm()
|
|
|
|
- api.category.getList({ status: 1 }).then((res: any) => {
|
|
|
|
- state.cateData = res.category || []
|
|
|
|
- })
|
|
|
|
- api.dept.getList({ status: -1 }).then((res: any) => {
|
|
|
|
- state.deptData = res || []
|
|
|
|
- })
|
|
|
|
- api.product.getTypesAll({ types: 'protocol' }).then((res: any) => {
|
|
|
|
- state.messageData = res || [];
|
|
|
|
- });
|
|
|
|
|
|
+ // 打开弹窗
|
|
|
|
+ const openDialog = (row?: any) => {
|
|
|
|
+ resetForm();
|
|
|
|
+ api.category.getList({ status: 1 }).then((res: any) => {
|
|
|
|
+ state.cateData = res.category || [];
|
|
|
|
+ });
|
|
|
|
+ api.dept.getList({ status: -1 }).then((res: any) => {
|
|
|
|
+ state.deptData = res || [];
|
|
|
|
+ });
|
|
|
|
+ api.product.getTypesAll({ types: "protocol" }).then((res: any) => {
|
|
|
|
+ state.messageData = res || [];
|
|
|
|
+ });
|
|
|
|
|
|
- // 证书列表
|
|
|
|
- certApi.certificateManagement.getAll().then((res: any) => {
|
|
|
|
- certList.value = res.Info || []
|
|
|
|
- });
|
|
|
|
- // api.product.trunsport_protocol_list({ status: -1 }).then((res: any) => {
|
|
|
|
- // state.tranData = res.data || [];
|
|
|
|
- // });
|
|
|
|
- if (row) {
|
|
|
|
- // api.dict.getType(row.dictId).then((res:any)=>{
|
|
|
|
- // state.ruleForm = res.data.dictType
|
|
|
|
- // }
|
|
|
|
- state.imageUrl = row.icon
|
|
|
|
|
|
+ // 证书列表
|
|
|
|
+ certApi.certificateManagement.getAll().then((res: any) => {
|
|
|
|
+ certList.value = res.Info || [];
|
|
|
|
+ });
|
|
|
|
+ // api.product.trunsport_protocol_list({ status: -1 }).then((res: any) => {
|
|
|
|
+ // state.tranData = res.data || [];
|
|
|
|
+ // });
|
|
|
|
+ if (row) {
|
|
|
|
+ // api.dict.getType(row.dictId).then((res:any)=>{
|
|
|
|
+ // state.ruleForm = res.data.dictType
|
|
|
|
+ // }
|
|
|
|
+ state.imageUrl = row.icon;
|
|
|
|
|
|
- state.ruleForm = row
|
|
|
|
- if (row.authType === 0) {
|
|
|
|
- transportProtocolChange(row.transportProtocol)
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- state.imageUrl = ""
|
|
|
|
- }
|
|
|
|
- state.isShowDialog = true
|
|
|
|
- }
|
|
|
|
- const resetForm = () => {
|
|
|
|
- state.ruleForm = {
|
|
|
|
- ...form
|
|
|
|
- }
|
|
|
|
- const formWrap = unref(formRef) as any;
|
|
|
|
- if (formWrap) {
|
|
|
|
- formWrap.resetFields();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 关闭弹窗
|
|
|
|
- const closeDialog = () => {
|
|
|
|
- resetForm();
|
|
|
|
|
|
+ state.ruleForm = row;
|
|
|
|
+ if (row.authType === 0) {
|
|
|
|
+ transportProtocolChange(row.transportProtocol);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ state.imageUrl = "";
|
|
|
|
+ }
|
|
|
|
+ state.isShowDialog = true;
|
|
|
|
+ };
|
|
|
|
+ const resetForm = () => {
|
|
|
|
+ state.ruleForm = {
|
|
|
|
+ ...form,
|
|
|
|
+ };
|
|
|
|
+ const formWrap = unref(formRef) as any;
|
|
|
|
+ if (formWrap) {
|
|
|
|
+ formWrap.resetFields();
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ // 关闭弹窗
|
|
|
|
+ const closeDialog = () => {
|
|
|
|
+ resetForm();
|
|
|
|
|
|
- state.isShowDialog = false
|
|
|
|
- }
|
|
|
|
- // 取消
|
|
|
|
- const onCancel = () => {
|
|
|
|
- closeDialog()
|
|
|
|
- }
|
|
|
|
- const transportProtocolChange = (type: string) => {
|
|
|
|
- if (type === 'mqtt_server') {
|
|
|
|
- state.ruleForm.authType = 1
|
|
|
|
- } else {
|
|
|
|
- state.ruleForm.authType = 3
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 新增
|
|
|
|
- const onSubmit = () => {
|
|
|
|
- const formWrap = unref(formRef) as any
|
|
|
|
- if (!formWrap) return
|
|
|
|
- formWrap.validate((valid: boolean) => {
|
|
|
|
- if (valid) {
|
|
|
|
- submitLoading.value = true
|
|
|
|
- if (state.ruleForm.id !== 0) {
|
|
|
|
- //修改
|
|
|
|
- api.product.edit(state.ruleForm).then(() => {
|
|
|
|
- ElMessage.success('产品修改成功')
|
|
|
|
- closeDialog() // 关闭弹窗
|
|
|
|
- emit('typeList')
|
|
|
|
- }).finally(() => submitLoading.value = false)
|
|
|
|
- } else {
|
|
|
|
- //添加
|
|
|
|
- api.product.add(state.ruleForm).then(() => {
|
|
|
|
- ElMessage.success('产品添加成功')
|
|
|
|
- closeDialog() // 关闭弹窗
|
|
|
|
- emit('typeList')
|
|
|
|
- }).finally(() => submitLoading.value = false)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
- // 打开新增产品分类弹窗
|
|
|
|
- const onOpenAddCategory = () => {
|
|
|
|
- editCategoryRef.value.openDialog();
|
|
|
|
- };
|
|
|
|
- // 获取产品分类列表
|
|
|
|
- const getCategoryList = () => {
|
|
|
|
- api.category.getList({ status: 1 }).then((res: any) => {
|
|
|
|
- state.cateData = res.category || []
|
|
|
|
- })
|
|
|
|
- }
|
|
|
|
|
|
+ state.isShowDialog = false;
|
|
|
|
+ };
|
|
|
|
+ // 取消
|
|
|
|
+ const onCancel = () => {
|
|
|
|
+ closeDialog();
|
|
|
|
+ };
|
|
|
|
+ const transportProtocolChange = (type: string) => {
|
|
|
|
+ if (type === "mqtt_server") {
|
|
|
|
+ state.ruleForm.authType = 1;
|
|
|
|
+ } else {
|
|
|
|
+ state.ruleForm.authType = 3;
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ // 新增
|
|
|
|
+ const onSubmit = () => {
|
|
|
|
+ const formWrap = unref(formRef) as any;
|
|
|
|
+ if (!formWrap) return;
|
|
|
|
+ formWrap.validate((valid: boolean) => {
|
|
|
|
+ if (valid) {
|
|
|
|
+ submitLoading.value = true;
|
|
|
|
+ if (state.ruleForm.id !== 0) {
|
|
|
|
+ //修改
|
|
|
|
+ api.product
|
|
|
|
+ .edit(state.ruleForm)
|
|
|
|
+ .then(() => {
|
|
|
|
+ ElMessage.success("产品修改成功");
|
|
|
|
+ closeDialog(); // 关闭弹窗
|
|
|
|
+ emit("typeList");
|
|
|
|
+ })
|
|
|
|
+ .finally(() => (submitLoading.value = false));
|
|
|
|
+ } else {
|
|
|
|
+ //添加
|
|
|
|
+ api.product
|
|
|
|
+ .add(state.ruleForm)
|
|
|
|
+ .then(() => {
|
|
|
|
+ ElMessage.success("产品添加成功");
|
|
|
|
+ closeDialog(); // 关闭弹窗
|
|
|
|
+ emit("typeList");
|
|
|
|
+ })
|
|
|
|
+ .finally(() => (submitLoading.value = false));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
+ // 打开新增产品分类弹窗
|
|
|
|
+ const onOpenAddCategory = () => {
|
|
|
|
+ editCategoryRef.value.openDialog();
|
|
|
|
+ };
|
|
|
|
+ // 获取产品分类列表
|
|
|
|
+ const getCategoryList = () => {
|
|
|
|
+ api.category.getList({ status: 1 }).then((res: any) => {
|
|
|
|
+ state.cateData = res.category || [];
|
|
|
|
+ });
|
|
|
|
+ };
|
|
|
|
|
|
- return {
|
|
|
|
- transportProtocolChange,
|
|
|
|
- submitLoading,
|
|
|
|
- certList,
|
|
|
|
- openDialog,
|
|
|
|
- onOpenAddCategory,
|
|
|
|
- handleAvatarSuccess,
|
|
|
|
- closeDialog,
|
|
|
|
- onCancel,
|
|
|
|
- onSubmit,
|
|
|
|
- network_server_type,
|
|
|
|
- getCategoryList,
|
|
|
|
- formRef,
|
|
|
|
- editCategoryRef,
|
|
|
|
- ...toRefs(state),
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
-})
|
|
|
|
|
|
+ return {
|
|
|
|
+ transportProtocolChange,
|
|
|
|
+ submitLoading,
|
|
|
|
+ certList,
|
|
|
|
+ openDialog,
|
|
|
|
+ onOpenAddCategory,
|
|
|
|
+ handleAvatarSuccess,
|
|
|
|
+ closeDialog,
|
|
|
|
+ onCancel,
|
|
|
|
+ onSubmit,
|
|
|
|
+ network_server_type,
|
|
|
|
+ getCategoryList,
|
|
|
|
+ formRef,
|
|
|
|
+ editCategoryRef,
|
|
|
|
+ ...toRefs(state),
|
|
|
|
+ };
|
|
|
|
+ },
|
|
|
|
+});
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
.avatar-uploader .avatar {
|
|
.avatar-uploader .avatar {
|
|
- width: 178px;
|
|
|
|
- height: 178px;
|
|
|
|
- display: block;
|
|
|
|
|
|
+ width: 178px;
|
|
|
|
+ height: 178px;
|
|
|
|
+ display: block;
|
|
}
|
|
}
|
|
</style>
|
|
</style>
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
.avatar-uploader .el-upload {
|
|
.avatar-uploader .el-upload {
|
|
- border: 1px dashed var(--el-border-color);
|
|
|
|
- border-radius: 6px;
|
|
|
|
- cursor: pointer;
|
|
|
|
- position: relative;
|
|
|
|
- overflow: hidden;
|
|
|
|
- transition: var(--el-transition-duration-fast);
|
|
|
|
|
|
+ border: 1px dashed var(--el-border-color);
|
|
|
|
+ border-radius: 6px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ position: relative;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+ transition: var(--el-transition-duration-fast);
|
|
}
|
|
}
|
|
|
|
|
|
.avatar-uploader .el-upload:hover {
|
|
.avatar-uploader .el-upload:hover {
|
|
- border-color: var(--el-color-primary);
|
|
|
|
|
|
+ border-color: var(--el-color-primary);
|
|
}
|
|
}
|
|
|
|
|
|
.el-icon.avatar-uploader-icon {
|
|
.el-icon.avatar-uploader-icon {
|
|
- font-size: 28px;
|
|
|
|
- color: #8c939d;
|
|
|
|
- width: 178px;
|
|
|
|
- height: 178px;
|
|
|
|
- text-align: center;
|
|
|
|
|
|
+ font-size: 28px;
|
|
|
|
+ color: #8c939d;
|
|
|
|
+ width: 178px;
|
|
|
|
+ height: 178px;
|
|
|
|
+ text-align: center;
|
|
}
|
|
}
|
|
</style>
|
|
</style>
|