editPro.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '产品'" v-model="isShowDialog" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="90px">
  5. <el-form-item label="产品标识" prop="key">
  6. <el-input v-model="ruleForm.key" placeholder="请输入产品标识" :disabled="ruleForm.id" />
  7. </el-form-item>
  8. <el-form-item label="产品名称" prop="name">
  9. <el-input v-model="ruleForm.name" placeholder="请输入产品名称" />
  10. </el-form-item>
  11. <el-form-item label="产品图片" prop="imageUrl">
  12. <uploadVue :img="imageUrl" @set-img="handleAvatarSuccess"></uploadVue>
  13. </el-form-item>
  14. <el-form-item label="产品分类" prop="categoryId">
  15. <el-cascader :options="cateData" :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'name' }" placeholder="请选择分类" clearable class="w100" v-model="ruleForm.categoryId">
  16. <template #default="{ node, data }">
  17. <span>{{ data.name }}</span>
  18. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  19. </template>
  20. </el-cascader>
  21. </el-form-item>
  22. <!-- <el-form-item label="所属部门" prop="deptId">
  23. <el-cascader :options="deptData" :props="{ checkStrictly: true, emitPath: false, value: 'deptId', label: 'deptName' }" placeholder="请选择所属部门" clearable class="w100" v-model="ruleForm.deptId">
  24. <template #default="{ node, data }">
  25. <span>{{ data.deptName }}</span>
  26. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  27. </template>
  28. </el-cascader>
  29. </el-form-item> -->
  30. <el-form-item label="消息协议" prop="messageProtocol">
  31. <el-select v-model="ruleForm.messageProtocol" placeholder="请选择消息协议" @change="changeMessageProtocol">
  32. <el-option v-for="dict in messageData" :key="dict.types" :label="dict.title" :value="dict.types"> </el-option>
  33. <!-- 增加系统默认的mqtt选项 -->
  34. <el-option label="Sagoo Mqtt" value="SagooMqtt"> </el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="传输协议" prop="transportProtocol">
  38. <el-select v-model="ruleForm.transportProtocol" placeholder="请选择传输协议">
  39. <el-option v-for="dict in network_server_type" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="设备类型" prop="deviceType">
  43. <el-radio-group v-model="ruleForm.deviceType">
  44. <el-radio label="设备">设备</el-radio>
  45. <el-radio label="网关">网关</el-radio>
  46. </el-radio-group>
  47. </el-form-item>
  48. <el-form-item label="产品描述 " prop="desc">
  49. <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入产品描述"></el-input>
  50. </el-form-item>
  51. </el-form>
  52. <template #footer>
  53. <span class="dialog-footer">
  54. <el-button @click="onCancel" size="default">取 消</el-button>
  55. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
  56. </span>
  57. </template>
  58. </el-dialog>
  59. </div>
  60. </template>
  61. <script lang="ts">
  62. import { reactive, toRefs, defineComponent, ref, unref, getCurrentInstance } from 'vue'
  63. import api from '/@/api/device'
  64. import uploadVue from '/@/components/upload/index.vue'
  65. import { ElMessage, UploadProps } from 'element-plus'
  66. import getOrigin from '/@/utils/origin'
  67. interface RuleFormState {
  68. id: number
  69. name: string
  70. dictType: string
  71. status: number
  72. desc: string
  73. }
  74. interface DicState {
  75. isShowDialog: boolean
  76. ruleForm: RuleFormState
  77. cateData: RuleFormState[]
  78. deptData: RuleFormState[]
  79. messageData: RuleFormState[]
  80. tranData: RuleFormState[]
  81. rules: {}
  82. }
  83. export default defineComponent({
  84. name: 'deviceEditPro',
  85. components: { uploadVue },
  86. setup(prop, { emit }) {
  87. const formRef = ref<HTMLElement | null>(null)
  88. const baseURL: string | undefined | boolean = getOrigin(import.meta.env.VITE_API_URL)
  89. const { proxy } = getCurrentInstance() as any
  90. const { network_server_type } = proxy.useDict('network_server_type')
  91. const state = reactive<DicState>({
  92. isShowDialog: false,
  93. cateData: [], // 分类数据
  94. deptData: [], //
  95. messageData: [], //
  96. network_protocols: [], // 消息协议
  97. tranData: [], //
  98. imageUrl: '', //
  99. singleImg: baseURL + '/product/icon/upload',
  100. ruleForm: {
  101. id: 0,
  102. name: '',
  103. categoryId: '',
  104. // deptId: '',
  105. messageProtocol: '',
  106. transportProtocol: '',
  107. deviceType: '设备',
  108. status: 1,
  109. desc: '',
  110. },
  111. rules: {
  112. name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
  113. key: [{ required: true, message: '产品标识不能为空', trigger: 'blur' }],
  114. parentId: [{ required: true, message: '产品分类不能为空', trigger: 'blur' }],
  115. // deptId: [{ required: true, message: '所属部门不能为空', trigger: 'blur' }],
  116. messageProtocol: [{ required: true, message: '消息协议不能为空', trigger: 'blur' }],
  117. transportProtocol: [{ required: true, message: '传输协议不能为空', trigger: 'blur' }],
  118. deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
  119. },
  120. })
  121. const handleAvatarSuccess: UploadProps['onSuccess'] = (response) => {
  122. // console.log(response)
  123. state.imageUrl = response
  124. state.ruleForm.icon = response
  125. }
  126. // 打开弹窗
  127. const openDialog = (row: RuleFormState | null) => {
  128. resetForm()
  129. api.category.getList({ status: 1 }).then((res: any) => {
  130. state.cateData = res.category || []
  131. })
  132. api.dept.getList({ status: -1 }).then((res: any) => {
  133. state.deptData = res || []
  134. })
  135. api.product.getTypesAll({ handleType: 'protocol' }).then((res: any) => {
  136. console.log(res)
  137. state.messageData = res || [];
  138. });
  139. // api.product.trunsport_protocol_list({ status: -1 }).then((res: any) => {
  140. // state.tranData = res.data || [];
  141. // });
  142. if (row) {
  143. // api.dict.getType(row.dictId).then((res:any)=>{
  144. // state.ruleForm = res.data.dictType
  145. // }
  146. state.imageUrl = row.icon
  147. state.ruleForm = row
  148. }
  149. state.isShowDialog = true
  150. }
  151. const resetForm = () => {
  152. state.ruleForm = {
  153. id: 0,
  154. name: '',
  155. dictType: '',
  156. deviceType: '设备',
  157. status: 1,
  158. desc: '',
  159. }
  160. }
  161. // 关闭弹窗
  162. const closeDialog = () => {
  163. state.isShowDialog = false
  164. }
  165. // 取消
  166. const onCancel = () => {
  167. closeDialog()
  168. }
  169. // 消息协议切换的时候,获取新的传输协议列表
  170. const changeMessageProtocol = (handleType) => {
  171. console.log(handleType)
  172. }
  173. // 新增
  174. const onSubmit = () => {
  175. const formWrap = unref(formRef) as any
  176. if (!formWrap) return
  177. formWrap.validate((valid: boolean) => {
  178. if (valid) {
  179. if (state.ruleForm.id !== 0) {
  180. //修改
  181. api.product.edit(state.ruleForm).then(() => {
  182. ElMessage.success('产品类型修改成功')
  183. closeDialog() // 关闭弹窗
  184. emit('typeList')
  185. })
  186. } else {
  187. //添加
  188. console.log(state.ruleForm)
  189. api.product.add(state.ruleForm).then(() => {
  190. ElMessage.success('产品类型添加成功')
  191. closeDialog() // 关闭弹窗
  192. emit('typeList')
  193. })
  194. }
  195. }
  196. })
  197. }
  198. return {
  199. openDialog,
  200. handleAvatarSuccess,
  201. closeDialog,
  202. onCancel,
  203. onSubmit,
  204. changeMessageProtocol,
  205. network_server_type,
  206. formRef,
  207. ...toRefs(state),
  208. }
  209. },
  210. })
  211. </script>
  212. <style scoped>
  213. .avatar-uploader .avatar {
  214. width: 178px;
  215. height: 178px;
  216. display: block;
  217. }
  218. </style>
  219. <style>
  220. .avatar-uploader .el-upload {
  221. border: 1px dashed var(--el-border-color);
  222. border-radius: 6px;
  223. cursor: pointer;
  224. position: relative;
  225. overflow: hidden;
  226. transition: var(--el-transition-duration-fast);
  227. }
  228. .avatar-uploader .el-upload:hover {
  229. border-color: var(--el-color-primary);
  230. }
  231. .el-icon.avatar-uploader-icon {
  232. font-size: 28px;
  233. color: #8c939d;
  234. width: 178px;
  235. height: 178px;
  236. text-align: center;
  237. }
  238. </style>