detail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="form" :rules="rules" ref="form" label-width="auto" :disabled="disabled">
  4. <!-- <el-form-item label="应用类型:" prop="applicationType">
  5. <el-select v-model="form.applicationType" placeholder="请选择设备分类">
  6. <el-option
  7. v-for="item in applicationType"
  8. :key="item.value"
  9. :label="item.label"
  10. :value="item.value"
  11. />
  12. </el-select>
  13. </el-form-item> -->
  14. <!-- disabled === false -->
  15. <el-form-item label="应用类型:" prop="applicationType">
  16. <input type="checkbox" v-model="isChecked1" :disabled="disabled" />
  17. 小程序
  18. <input type="checkbox" style="margin-left: 30px" v-model="isChecked2" :disabled="disabled" />
  19. APP
  20. </el-form-item>
  21. <el-form-item label="设备型号:" prop="clientType">
  22. <el-input v-model="form.clientType" placeholder="请输入设备型号" />
  23. </el-form-item>
  24. <el-form-item label="设备名称:" prop="name">
  25. <el-input v-model="form.name" placeholder="请输入设备名称" />
  26. </el-form-item>
  27. <el-form-item v-if="form.id" label="旧版蓝牙名称:">
  28. <el-input v-model="form.bluetoothName" disabled />
  29. </el-form-item>
  30. <el-form-item label="蓝牙名称:" prop="bluetoothNames">
  31. <el-tag v-for="(item, index) in form.bluetoothNames" :key="item" :closable="!disabled"
  32. :disable-transition="false" @close="handleClose(index)" style="margin-right: 10px">{{ item }}</el-tag>
  33. <el-input v-if="inputVisible" v-model="bluetoothName" ref="saveTagInput" @input="handleInput"
  34. @keyup.enter.native="handleInputConfirm" @blur="handleInputConfirm" style="width: 100px" />
  35. <el-button v-else @click="showInput" size="mini">+ 新增</el-button>
  36. </el-form-item>
  37. <el-form-item label="制造商:" prop="manufacturer">
  38. <el-select v-model="form.manufacturer" placeholder="请选择设备制造商" clearable>
  39. <el-option v-for="item in manuOptions" :key="item.value" :label="item.label" :value="item.value" />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="多频多台:" prop="isChannelsPlatforms">
  43. <el-switch v-model="form.isChannelsPlatforms" :active-value="1" :inactive-value="0" />
  44. </el-form-item>
  45. <el-form-item label="扫码授权:" prop="isScanAuth">
  46. <el-switch v-model="form.isScanAuth" :active-value="1" :inactive-value="0" />
  47. </el-form-item>
  48. <el-form-item label="流量平台:">
  49. <el-select v-model="form.platform" placeholder="请选择流量平台">
  50. <el-option v-for="item in typeOptions" :key="item.value" :value="item.value" :label="item.label" />
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item label="设备分类:" prop="categoryId">
  54. <el-select v-model="form.categoryId" placeholder="请选择设备分类">
  55. <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label" :value="item.value" />
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item label="设备类型:" prop="deviceType">
  59. <el-select v-model="form.deviceType" placeholder="请选择设备类型">
  60. <el-option v-for="item in devTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item label="是否热门:" prop="isHot">
  64. <el-select v-model="form.isHot" placeholder="请选择是否热门">
  65. <el-option v-for="item in yesOrNoOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item label="资源平台:">
  69. <el-button @click="clickAddPlatform" size="mini">新增+</el-button>
  70. </el-form-item>
  71. <el-form-item v-if="isShowPlatform">
  72. <el-table :data="contentVipPlatformList" border style="width: min-content">
  73. <el-table-column prop="platformId" label="资源平台" width="180">
  74. <template slot-scope="scope">
  75. <el-select v-model="scope.row.platformId" placeholder="请选择流量平台" clearable>
  76. <el-option v-for="item in platformOptions" :key="item.value" :label="item.label" :value="item.value" />
  77. </el-select>
  78. </template>
  79. </el-table-column>
  80. <el-table-column prop="contentVip" label="设备会员收费时间" width="180">
  81. <template slot-scope="scope">
  82. <el-select v-model="scope.row.contentVip" placeholder="请设备会员收费时间" clearable>
  83. <el-option v-for="item in contentVipOptions" :key="item.value" :label="item.label"
  84. :value="item.value" />
  85. </el-select>
  86. </template>
  87. </el-table-column>
  88. </el-table>
  89. </el-form-item>
  90. <el-form-item label="设备会员收费时间:" prop="contentVip">
  91. <el-select v-model="form.contentVip" placeholder="默认关闭">
  92. <el-option v-for="item in contentVipOptions" :key="item.value" :label="item.label"
  93. :value="Number(item.value)" />
  94. </el-select>
  95. </el-form-item>
  96. <el-row>
  97. <el-col :span="12">
  98. <el-form-item label="在线图片:" prop="img">
  99. <Upload listType="picture-card" :url="form.img" @upload="handleUploadImg($event, 'online')"
  100. :disabled="disabled" />
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span="12">
  104. <el-form-item label="离线图片:" prop="offlineImg" style="float: right">
  105. <Upload listType="picture-card" :url="form.offlineImg" @upload="handleUploadImg($event, 'offline')"
  106. :disabled="disabled" />
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. <!-- 子表单 -->
  111. <el-button v-if="disabled === false && form.typeList.length < 4" type="primary" icon="el-icon-plus"
  112. @click="getAdd">新增</el-button>
  113. <div class="sub-form" v-for="(item, index) in form.typeList" :key="item.id">
  114. <el-form-item label="设备模式:" :prop="`typeList.${index}.type`" :rules="{
  115. required: true,
  116. message: '请选择设备模式',
  117. trigger: 'change',
  118. }">
  119. <el-select v-model="item.type" placeholder="请选择设备模式" @change="getTypeChange(item)">
  120. <el-option v-for="item in devModeOptions" :key="item.value" :label="item.label" :value="Number(item.value)"
  121. :disabled="item.disabled" />
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item v-if="item.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`" :rules="{
  125. type: 'array',
  126. required: true,
  127. message: '请选择功能权限',
  128. trigger: 'change',
  129. }">
  130. <el-select v-model="item.functionList" placeholder="请选择功能权限" multiple>
  131. <el-option v-for="item in devFucOptions" :key="item.value" :label="item.label" :value="item.value" />
  132. </el-select>
  133. </el-form-item>
  134. <el-form-item v-if="item.type == 2" label="芯片方案:" :prop="`typeList.${index}.is5g`" :rules="{
  135. required: true,
  136. message: '请选择芯片方案',
  137. trigger: 'change',
  138. }">
  139. <el-select v-model="item.is5g" placeholder="请选择芯片方案">
  140. <el-option v-for="item in planOptions" :key="item.value" :value="item.value" :label="item.label" />
  141. </el-select>
  142. </el-form-item>
  143. <el-form-item v-if="item.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`" :rules="{
  144. required: true,
  145. message: '请选择连接方式',
  146. trigger: 'change',
  147. }">
  148. <el-select v-model="item.connectType" placeholder="请选择连接方式">
  149. <el-option v-for="item in connectTypeOptions" :key="item.value" :label="item.label"
  150. :value="Number(item.value)" />
  151. </el-select>
  152. </el-form-item>
  153. <el-row>
  154. <el-col :span="12">
  155. <el-form-item :label="item.type === 1 || item.type === 3
  156. ? '连接引导图:'
  157. : '开机引导图:'
  158. " :prop="`typeList.${index}.icon1`" :rules="{
  159. required: true,
  160. message: '请上传引导图片',
  161. trigger: 'change',
  162. }">
  163. <Upload listType="picture-card" :url="item.icon1" @upload="handleUploadIcon($event, index, 'icon1')"
  164. :disabled="disabled" />
  165. </el-form-item>
  166. </el-col>
  167. <el-col :span="12">
  168. <el-form-item label="配对键引导图:" :prop="`typeList.${index}.icon2`" style="float: right" :rules="{
  169. required: true,
  170. message: '请上传配对键引导图',
  171. trigger: 'change',
  172. }">
  173. <Upload listType="picture-card" :url="item.icon2" @upload="handleUploadIcon($event, index, 'icon2')"
  174. :disabled="disabled" />
  175. </el-form-item>
  176. </el-col>
  177. </el-row>
  178. <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页内容:"
  179. :prop="`typeList.${index}.guidePageContent`" :rules="{
  180. required: true,
  181. message: '请输入引导页内容',
  182. trigger: 'blur',
  183. }">
  184. <Editor v-model="item.guidePageContent" :min-height="250" :readOnly="disabled" />
  185. </el-form-item>
  186. <!-- 删除按钮 -->
  187. <el-link class="el-icon-close" v-if="form.typeList.length > 1" :underline="false"
  188. @click="getDelete(item.type, index)" />
  189. </div>
  190. </el-form>
  191. <div>
  192. <el-button @click="getCancel">取消</el-button>
  193. <el-button v-if="disabled === false" type="primary" @click="getSubmit">提交</el-button>
  194. </div>
  195. </div>
  196. </template>
  197. <script>
  198. import { create, detail, edit } from "@/api/device/list";
  199. import {
  200. devCategoryMixin,
  201. devFucMixin,
  202. devModeMixin,
  203. devTypeMixin,
  204. yesOrNoMixin,
  205. } from "@/mixin/index";
  206. export default {
  207. name: "deviceListDetail",
  208. mixins: [
  209. devModeMixin,
  210. devTypeMixin,
  211. devCategoryMixin,
  212. yesOrNoMixin,
  213. devFucMixin,
  214. ],
  215. data() {
  216. return {
  217. isChecked1: false,
  218. isChecked2: false,
  219. isShowPlatform: false,
  220. contentVipPlatformList: [
  221. ],
  222. platformOptions: [
  223. { label: "QQ音乐", value: 6 },
  224. { label: "喜马拉雅", value: 12 },
  225. ],
  226. platformContentVipOptions: [],
  227. // 表单
  228. form: {
  229. typeList: [
  230. {
  231. functionList: [],
  232. },
  233. ],
  234. bluetoothNames: [],
  235. contentVipPlatformList: [],
  236. },
  237. // 显示蓝牙输入框
  238. inputVisible: false,
  239. // 蓝牙名称
  240. bluetoothName: "",
  241. // 表单验证
  242. rules: {
  243. applicationType: [
  244. { required: true, message: "请选择应用类型", trigger: "blur" },
  245. ],
  246. clientType: [
  247. { required: true, message: "请输入设备型号", trigger: "blur" },
  248. ],
  249. name: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
  250. bluetoothNames: [
  251. {
  252. type: "array",
  253. required: true,
  254. message: "请输入蓝牙名称",
  255. trigger: "blur",
  256. },
  257. ],
  258. isHot: [{ required: true, message: "是否热门", trigger: "change" }],
  259. categoryId: [
  260. { required: true, message: "请选择设备分类", trigger: "change" },
  261. ],
  262. deviceType: [
  263. { required: true, message: "请选择设备类型", trigger: "change" },
  264. ],
  265. img: [{ required: true, message: "请上传在线图片", trigger: "change" }],
  266. offlineImg: [
  267. { required: true, message: "请上传离线图片", trigger: "change" },
  268. ],
  269. },
  270. contentVipOptions: [
  271. {
  272. value: 0,
  273. label: "默认关闭",
  274. },
  275. {
  276. value: 1,
  277. label: "开机激活收取",
  278. },
  279. {
  280. value: 2,
  281. label: "1年后",
  282. },
  283. {
  284. value: 3,
  285. label: "2年后",
  286. },
  287. {
  288. value: 4,
  289. label: "3年后",
  290. },
  291. ],
  292. // 设备连接
  293. connectTypeOptions: [
  294. {
  295. value: 2,
  296. label: "UPnP",
  297. },
  298. {
  299. value: 3,
  300. label: "MQTT",
  301. },
  302. ],
  303. // 制造商
  304. manuOptions: [
  305. {
  306. value: "ShanJing",
  307. label: "ShanJing",
  308. },
  309. {
  310. value: "JieLi",
  311. label: "JieLi",
  312. },
  313. {
  314. value: "LingXin",
  315. label: "LingXin",
  316. },
  317. {
  318. value: "QiXinWei",
  319. label: "QiXinWei",
  320. },
  321. ],
  322. // 芯片方案
  323. planOptions: [
  324. {
  325. value: 1,
  326. label: "兼容5GHZ频段芯片方案",
  327. },
  328. {
  329. value: 0,
  330. label: "不兼容5GHZ频段芯片方案",
  331. },
  332. ],
  333. // 流量平台
  334. typeOptions: [
  335. {
  336. value: -1,
  337. label: "默认",
  338. },
  339. {
  340. value: 0,
  341. label: "树米",
  342. },
  343. {
  344. value: 1,
  345. label: "联通",
  346. },
  347. ],
  348. // 只读
  349. disabled: Boolean(this.$route.query.boolean),
  350. };
  351. },
  352. mounted() {
  353. this.getCateGory(1);
  354. this.getList();
  355. },
  356. methods: {
  357. // 详情
  358. getList() {
  359. if (this.$route.query.id) {
  360. detail({
  361. id: this.$route.query.id,
  362. }).then((res) => {
  363. if (res.code === 0) {
  364. this.form = res.data;
  365. this.contentVipPlatformList = this.form.contentVipPlatformList;
  366. this.isShowPlatform = this.form.contentVipPlatformList.length > 0;
  367. this.form.typeList.map((i) => {
  368. this.devModeOptions[i.type - 1].disabled = true;
  369. });
  370. var applicationType = this.form.applicationType;
  371. this.isChecked1 = false;
  372. this.isChecked2 = false;
  373. if (applicationType != null && applicationType != "") {
  374. applicationType = applicationType.replace(/[\[\]]/g, "");
  375. // 使用split按逗号分割字符串
  376. let result = applicationType.split(",");
  377. if (result != null && result != "" && result.length > 0) {
  378. if (result.length == 2) {
  379. this.isChecked1 = true;
  380. this.isChecked2 = true;
  381. } else {
  382. if (result[0] == "0") {
  383. this.isChecked1 = true;
  384. } else {
  385. this.isChecked2 = true;
  386. }
  387. }
  388. } else {
  389. if (applicationType == 0) {
  390. this.isChecked1 = true;
  391. } else if (applicationType == 1) {
  392. this.isChecked2 = true;
  393. }
  394. }
  395. }
  396. }
  397. });
  398. }
  399. },
  400. // 删除蓝牙名称
  401. handleClose(index) {
  402. this.form.bluetoothNames.splice(index, 1);
  403. },
  404. // 显示输入框
  405. showInput() {
  406. this.inputVisible = true;
  407. this.$nextTick(() => {
  408. this.$refs.saveTagInput.$refs.input.focus();
  409. });
  410. },
  411. // 禁止输入逗号
  412. handleInput(e) {
  413. this.bluetoothName = e.replace(/[,,]/g, "");
  414. },
  415. // 保存蓝牙名称
  416. handleInputConfirm() {
  417. let inputValue = this.bluetoothName;
  418. if (inputValue) {
  419. this.form.bluetoothNames.push(inputValue);
  420. }
  421. this.inputVisible = false;
  422. this.bluetoothName = "";
  423. },
  424. // 上传设备图片
  425. handleUploadImg(e, key) {
  426. key === "online"
  427. ? (this.form.img = e.file)
  428. : (this.form.offlineImg = e.file);
  429. },
  430. // 上传设备图标
  431. handleUploadIcon(e, index, obj) {
  432. this.form.typeList[index][obj] = e.file;
  433. },
  434. // 选中一个设备类型就从数组中去掉
  435. getTypeChange(i) {
  436. for (let key in this.devModeOptions) {
  437. this.devModeOptions[key].disabled = false;
  438. }
  439. // 选中的设备模式禁止再选
  440. this.form.typeList.map((item) => {
  441. if (item.type) {
  442. let index = this.devModeOptions.findIndex(
  443. (j) => j.value == item.type
  444. );
  445. this.devModeOptions[index].disabled = true;
  446. }
  447. });
  448. // 除了设备模式都为空
  449. Object.keys(i).map((e) => {
  450. if (!["type", "icon1", "icon2"].includes(e)) {
  451. i[e] = e === "functionList" ? [] : null;
  452. }
  453. });
  454. },
  455. // 新增子表单
  456. getAdd() {
  457. this.form.typeList.push({
  458. type: null,
  459. functionList: [],
  460. connectType: null,
  461. icon1: "",
  462. icon2: "",
  463. guidePageContent: "",
  464. });
  465. },
  466. // 删除子表单
  467. getDelete(type, index) {
  468. this.form.typeList.splice(index, 1);
  469. if (type) {
  470. this.devModeOptions.find((i) => i.value == type).disabled = false;
  471. }
  472. },
  473. // 取消
  474. getCancel() {
  475. this.$tab.closeOpenPage("/device/deviceList");
  476. },
  477. // 提交
  478. getSubmit() {
  479. if (!this.isChecked1 && !this.isChecked2) {
  480. this.$message.success("请选择应用类型");
  481. return;
  482. }
  483. if (this.isChecked1 && this.isChecked2) {
  484. this.form.applicationType = "[0,1]";
  485. } else if (this.isChecked2) {
  486. this.form.applicationType = "[1]";
  487. } else {
  488. this.form.applicationType = "[0]";
  489. }
  490. this.form.contentVipPlatformList = []
  491. this.contentVipPlatformList.forEach(element => {
  492. if (element.platformId != null) {
  493. this.form.contentVipPlatformList.push({
  494. contentVip: element.contentVip ?? 0,
  495. platformId: element.platformId,
  496. })
  497. }
  498. });
  499. console.log("this.contentVipPlatformList===", JSON.stringify(this.contentVipPlatformList), JSON.stringify(this.form.contentVipPlatformList));
  500. this.$refs.form.validate((valid) => {
  501. if (valid) {
  502. if (this.$route.query.id) {
  503. // 编辑
  504. edit(this.form).then((res) => {
  505. console.log("gadsfqewrqewrqr====" + JSON.stringify(res));
  506. if (res.code === 0) {
  507. this.$message.success("修改成功!");
  508. this.getCancel();
  509. }
  510. });
  511. } else {
  512. // 新建
  513. create(this.form).then((res) => {
  514. if (res.code === 0) {
  515. this.$message.success("添加成功!");
  516. this.getCancel();
  517. }
  518. });
  519. }
  520. } else {
  521. return false;
  522. }
  523. });
  524. },
  525. clickAddPlatform() {
  526. this.isShowPlatform = true;
  527. if (this.platformOptions.length != 0 && this.contentVipPlatformList.length <= this.platformOptions.length) {
  528. this.contentVipPlatformList.push({ "contentVip": null, "platformId": null, });
  529. } else {
  530. let tips = `最多只能添加${this.platformOptions.length}个平台`;
  531. this.$message.warning(tips);
  532. }
  533. },
  534. },
  535. };
  536. </script>
  537. <style lang="scss" scoped>
  538. .el-form {
  539. width: 580px;
  540. }
  541. .sub-form {
  542. position: relative;
  543. border: 1px solid #e8e8e8;
  544. padding: 25px 25px 0 0;
  545. margin-bottom: 20px;
  546. .el-icon-close {
  547. position: absolute;
  548. top: 5px;
  549. right: 5px;
  550. color: #c0c4cc;
  551. }
  552. }
  553. </style>