detail.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <template>
  2. <div class='app-container'>
  3. <el-form :model="form" ref="form" :rules="rules" label-width="auto" :disabled="disabled">
  4. <el-form-item label="大类名称:" prop="name">
  5. <el-input v-model="form.name" placeholder="请输入大类名称" />
  6. </el-form-item>
  7. <el-form-item label="设备分类:" prop="categoryId">
  8. <el-select v-model="form.categoryId" placeholder="请选择设备分类">
  9. <el-option v-for="item in categoryOptions" :key="item.value" :value="item.value" :label="item.label" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="设备类型:" prop="type">
  13. <el-select v-model="form.type" placeholder="请选择设备类型">
  14. <el-option v-for="item in devTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item label="是否热门:" prop="isHot">
  18. <el-select v-model="form.isHot" placeholder="请选择是否热门">
  19. <el-option v-for="item in yesOrNoOptions" :key="item.value" :value="item.value" :label="item.label" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="关联设备:" prop="deviceIds">
  23. <el-select v-model="form.deviceIds" filterable multiple placeholder="请选择关联的设备">
  24. <el-option v-for="item in devOptions" :key="item.clientTypeId" :value="item.clientTypeId" :label="item.name" />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="可见用户:" prop="userType">
  28. <el-select v-model="form.userType" placeholder="请选择可见用户">
  29. <el-option v-for="item in pushOptions" :key="item.value" :value="item.value" :label="item.label" />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item v-if="form.userType === 3" label="指定用户:" prop="user">
  33. <el-input v-model="form.user" placeholder="请输入指定用户(逗号隔开)" />
  34. </el-form-item>
  35. <el-row :gutter="70">
  36. <el-col :span="12">
  37. <el-form-item label="在线图片:" prop="img">
  38. <Upload listType="picture-card" :url="form.img" @upload="upload($event, 'img')" :disabled="disabled" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="12">
  42. <el-form-item label="离线图片:" prop="offlineImg">
  43. <Upload listType="picture-card" :url="form.offlineImg" @upload="upload($event, 'offlineImg')"
  44. :disabled="disabled" />
  45. </el-form-item>
  46. </el-col>
  47. </el-row>
  48. <el-button v-if="disabled === false && form.typeList.length < 4" type="primary" icon="el-icon-plus"
  49. @click="getAdd">新增</el-button>
  50. <div class="sub-form" v-for="(i, index) in form.typeList" :key="i.id">
  51. <el-form-item label="设备模式:" :prop="`typeList.${index}.type`"
  52. :rules="{ required: true, message: '请选择设备模式', trigger: 'change' }">
  53. <el-select v-model="i.type" placeholder="请选择设备模式" @change="getTypeChange(i)">
  54. <el-option v-for="item in devModeOptions" :key="item.value" :value="item.value" :label="item.label"
  55. :disabled="item.disabled" />
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item v-if="i.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`"
  59. :rules="{ type: 'array', required: true, message: '请选择功能权限', trigger: 'change' }">
  60. <el-select v-model="i.functionList" multiple placeholder="请选择功能权限">
  61. <el-option v-for="item in devFucOptions" :key="item.value" :value="item.value.toString()"
  62. :label="item.label" />
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item v-if="i.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`"
  66. :rules="{ required: true, message: '请选择连接方式', trigger: 'change' }">
  67. <el-select v-model="i.connectType" placeholder="请选择连接方式">
  68. <el-option v-for="item in connectOptions" :key="item.value" :value="item.value" :label="item.label" />
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item label="引导图:" :prop="`typeList.${index}.icon`"
  72. :rules="{ required: true, message: '请上传引导图', trigger: 'change' }">
  73. <Upload listType="picture-card" :url="i.icon" @upload="upload($event, 'icon', index)" :disabled="disabled" />
  74. </el-form-item>
  75. <el-form-item v-if="[1, 3].includes(i.type)" label="引导页:">
  76. <Editor v-model="i.guidePageContent" :min-height="250" :readOnly="disabled" />
  77. </el-form-item>
  78. <el-link class="el-icon-close" v-if="form.typeList.length > 1" :underline="false"
  79. @click="getDelete(i.type, index)" :disabled="disabled" />
  80. </div>
  81. </el-form>
  82. <div>
  83. <el-button @click="close">取消</el-button>
  84. <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
  85. </div>
  86. </div>
  87. </template>
  88. <script>
  89. import { devList, submit, detail } from '@/api/device/class'
  90. import { devModeMixin, yesOrNoMixin, devTypeMixin, devCategoryMixin, devFucMixin } from '@/mixin/index'
  91. export default {
  92. mixins: [devModeMixin, yesOrNoMixin, devTypeMixin, devCategoryMixin, devFucMixin],
  93. data() {
  94. return {
  95. // 表单
  96. form: {
  97. id: this.$route.query.id,
  98. deviceIds: [],
  99. typeList: [{
  100. functionList: [],
  101. icon: ''
  102. }],
  103. },
  104. // 校验
  105. rules: {
  106. name: [{ required: true, message: '请输入大类名称', trigger: 'blur' }],
  107. categoryId: [{ required: true, message: '请选择设备分类', trigger: 'chang' }],
  108. type: [{ required: true, message: '请选择设备类型', trigger: 'change' }],
  109. isHot: [{ required: true, message: '请选择是否热门', trigger: 'change' }],
  110. deviceIds: [{ required: true, message: '请选择关联的设备', trigger: 'change' }],
  111. userType: [{ required: true, message: '请选择可见用户', trigger: 'change' }],
  112. user: [{ required: true, message: '请输入指定用户', trigger: 'blur' }],
  113. img: [{ required: true, message: '请上传在线图片', trigger: 'change' }],
  114. offlineImg: [{ required: true, message: '请上传离线图片', trigger: 'change' }],
  115. },
  116. // 设备列表
  117. devOptions: [],
  118. // 可见用户
  119. pushOptions: [{
  120. value: 1,
  121. label: '全部'
  122. }, {
  123. value: 3,
  124. label: '指定'
  125. }],
  126. // 设备连接
  127. connectOptions: [{
  128. value: 2,
  129. label: 'UPnP'
  130. }, {
  131. value: 3,
  132. label: 'MQTT'
  133. }],
  134. // 只读
  135. disabled: Boolean(this.$route.query.boolean)
  136. }
  137. },
  138. mounted() {
  139. this.getDevList()
  140. if (this.form.id) {
  141. this.getDetail()
  142. }
  143. },
  144. methods: {
  145. // 详情
  146. getDetail() {
  147. detail(this.form.id).then(res => {
  148. if (res.code === 0) {
  149. this.form = res.data
  150. this.form.deviceIds = res.data.deviceIds.split(',')
  151. this.form.typeList.map((i) => {
  152. this.devModeOptions[i.type - 1].disabled = true;
  153. })
  154. }
  155. })
  156. },
  157. // 设备列表
  158. getDevList() {
  159. devList({
  160. type: 2,
  161. id: this.form.id
  162. }).then(res => {
  163. if (res.code === 0) {
  164. this.devOptions = res.data
  165. }
  166. })
  167. },
  168. // 新增子表单
  169. getAdd() {
  170. this.form.typeList.push({
  171. type: null,
  172. functionList: [],
  173. connectType: null,
  174. icon: '',
  175. guidePageContent: ''
  176. })
  177. },
  178. // 删除子表单
  179. getDelete(type, index) {
  180. this.form.typeList.splice(index, 1)
  181. this.devModeOptions.find(i => i.value == type).disabled = false
  182. },
  183. // 修改设备模式
  184. getTypeChange(i) {
  185. for (let key in this.devModeOptions) {
  186. this.devModeOptions[key].disabled = false
  187. }
  188. // 选中的设备模式禁止再选
  189. this.form.typeList.map(item => {
  190. if (item.type) {
  191. let index = this.devModeOptions.findIndex(j => j.value == item.type)
  192. this.devModeOptions[index].disabled = true
  193. }
  194. })
  195. // 除了设备模式都为空
  196. Object.keys(i).map(e => {
  197. if (!['type', 'icon'].includes(e)) {
  198. i[e] = e === 'functionList' ? [] : null
  199. }
  200. })
  201. },
  202. // 上传图片
  203. upload(e, key, index) {
  204. if (index == undefined) {
  205. this.form[key] = e.file
  206. } else {
  207. this.form.typeList[index][key] = e.file
  208. }
  209. },
  210. // 提交
  211. getSubmit() {
  212. this.$refs.form.validate((valid) => {
  213. if (valid) {
  214. this.form.deviceIds = this.form.deviceIds.join(',')
  215. submit(this.form).then(res => {
  216. if (res.code === 0) {
  217. this.$message.success('提交成功!')
  218. this.close()
  219. }
  220. })
  221. } else {
  222. return false
  223. }
  224. })
  225. },
  226. // 取消
  227. close() {
  228. this.$tab.closeOpenPage('/device/class')
  229. }
  230. }
  231. }
  232. </script>
  233. <style lang="scss" scoped>
  234. .el-form {
  235. width: 580px;
  236. }
  237. .sub-form {
  238. position: relative;
  239. border: 1px solid #e8e8e8;
  240. padding: 25px 25px 0 25px;
  241. margin-bottom: 20px;
  242. .el-icon-close {
  243. position: absolute;
  244. top: 5px;
  245. right: 5px;
  246. }
  247. }
  248. </style>