Browse Source

Merge branch 'test'

DESKTOP-2S67K1S\31396 2 years ago
parent
commit
56e76e9dd1
44 changed files with 1514 additions and 1409 deletions
  1. 18 0
      src/api/music/monitor.js
  2. 18 1
      src/api/operation/recommend.js
  3. 0 0
      src/api/service/package.js
  4. 190 0
      src/components/Dialog/index.vue
  5. 86 68
      src/mixin/index.js
  6. 7 24
      src/router/index.js
  7. 38 4
      src/views/content/banner/detail.vue
  8. 33 12
      src/views/content/banner/index.vue
  9. 9 3
      src/views/device/category/index.vue
  10. 15 21
      src/views/device/function/index.vue
  11. 98 102
      src/views/device/list/detail.vue
  12. 23 10
      src/views/device/list/index.vue
  13. 0 47
      src/views/device/mixin/index.js
  14. 24 15
      src/views/device/version/detail.vue
  15. 6 7
      src/views/device/version/index.vue
  16. 12 15
      src/views/device/yxw/index.vue
  17. 8 16
      src/views/goods/list/index.vue
  18. 1 0
      src/views/music/choiceness/detail.vue
  19. 1 0
      src/views/music/choiceness/index.vue
  20. 157 0
      src/views/music/monitor/index.vue
  21. 5 8
      src/views/ohplay/content/index.vue
  22. 9 2
      src/views/ohplay/operation/index.vue
  23. 13 5
      src/views/ohplay/programa/index.vue
  24. 6 9
      src/views/ohplay/recommend/index.vue
  25. 21 136
      src/views/operation/channel/detail.vue
  26. 18 19
      src/views/operation/channel/index.vue
  27. 128 67
      src/views/operation/recommend/index.vue
  28. 51 9
      src/views/operation/startPage/detail.vue
  29. 19 11
      src/views/operation/startPage/index.vue
  30. 26 131
      src/views/operation/tag/detail.vue
  31. 3 2
      src/views/operation/waken/detail.vue
  32. 22 9
      src/views/project/list/detail.vue
  33. 1 1
      src/views/project/list/index.vue
  34. 1 1
      src/views/push/message/index.vue
  35. 19 2
      src/views/service/code/index.vue
  36. 0 73
      src/views/service/flowPackage/detail.vue
  37. 0 102
      src/views/service/flowPackage/index.vue
  38. 0 277
      src/views/service/mixin/index.js
  39. 0 80
      src/views/service/musicPackage/detail.vue
  40. 0 114
      src/views/service/musicPackage/index.vue
  41. 186 0
      src/views/service/package/detail.vue
  42. 224 0
      src/views/service/package/index.vue
  43. 17 5
      src/views/service/qqmusic/index.vue
  44. 1 1
      vue.config.js

+ 18 - 0
src/api/music/monitor.js

@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(data) {
+    return request({
+        url: `/admin/monitor/list`,
+        method: 'post',
+        data
+    })
+}
+
+// 详情
+export function detail(id) {
+    return request({
+        url: `/admin/monitor/queryById/${id}`,
+        method: 'get'
+    })
+}

+ 18 - 1
src/api/operation/recommend.js

@@ -88,10 +88,27 @@ export function timeList() {
   })
 }
 
-// 上下架时间段
+// 删除 / 上下架时间段
 export function changeTime(ids, status) {
   return request({
     url: `/admin/appTime/hitOrSold/${ids}/${status}`,
     method: 'get'
   })
+}
+
+// 精选电台提交
+export function expandSave(data){
+  return request({
+    url: `/admin/recommendContentModule/expand/save`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除精选电台
+export function removeList(ids, status){
+  return request({
+    url: `/admin/recommendContentModule/highOrSold/${ids}/${status}`,
+    method: 'get'
+  })
 }

src/api/service/musicPackage.js → src/api/service/package.js


+ 190 - 0
src/components/Dialog/index.vue

@@ -0,0 +1,190 @@
+<template>
+  <!-- 弹窗 -->
+  <el-dialog :visible.sync="dialogVisible" title="关联内容" width="1400px">
+    <el-form inline size="mini" style="width:100%">
+      <el-form-item label="音频类型:">
+        <el-select v-model="dialogForm.audioType">
+          <el-option v-for="item in channelOptions[channelType]" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="资源平台:">
+        <el-select v-model="dialogForm.platformId" :disabled="[16, 17].includes(channelType)" clearable>
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="付费类型:" v-if="![2, 10, 11].includes(dialogForm.audioType)">
+        <el-select v-model="dialogForm.isFree" placeholder="请选择付费类型" clearable>
+          <el-option v-for="item in freeOptions" :key="item.value" :label="item.label" :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="内容名称:">
+        <el-input v-model="dialogForm.keyword" placeholder="请输入内容名称" clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="tableData" ref="tableData" :row-key="getRowKey" @selection-change="getChange"
+      v-loading="loading">
+      <el-table-column type="selection" align="center" :reserve-selection="true" />
+      <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
+      <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
+      <el-table-column label="音频封面" align="center" width="100px">
+        <template slot-scope="scope">
+          <el-image v-if="scope.row.audioPic" :src="scope.row.audioPic" />
+        </template>
+      </el-table-column>
+      <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
+      <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
+    </el-table>
+    <div slot="footer">
+      <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
+        :limit.sync="dialogForm.pageSize" @pagination="getList" />
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { list } from '@/api/operation/channel'
+import { platformMixin, isFreeMixin, channelMixin } from '@/mixin/index'
+export default {
+  mixins: [platformMixin, isFreeMixin, channelMixin],
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    channelType: {
+      type: String | Number,
+      default: ''
+    },
+    data: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 总数
+      total: 0,
+      dialogForm: {
+        pageNum: 1,
+        pageSize: 10,
+        status: 1,
+        platformId: null,
+        audioType: null
+      },
+      // 弹窗列表
+      tableData: [],
+    }
+  },
+  watch: {
+    dialogVisible(val) {
+      if (val) {
+        this.dialogForm.platformId = this.channelType === 16 ? 3 : this.channelType === 17 ? 2 : null
+        this.getPlatform({
+          audioType: this.dialogForm.audioType
+        })
+        this.getList()
+      }
+    },
+    channelType(val) {
+      this.dialogForm.audioType = this.channelOptions[val][0].value
+    },
+    'dialogForm.audioType'(val) {
+      if(this.dialogVisible){
+        this.getPlatform({
+          audioType: val
+        })
+        this.getList()
+      }
+    }
+  },
+  computed: {
+    // 弹窗
+    dialogVisible: {
+      get() {
+        return this.visible
+      },
+      set(val) {
+        this.$emit('close', val)
+      }
+    }
+  },
+  methods: {
+    // 搜索
+    getSearch() {
+      this.dialogForm.pageNum = 1
+      this.getList()
+    },
+
+    // 重置
+    getRefresh() {
+      this.dialogForm = {
+        pageNum: 1,
+        pageSize: 10,
+        status: 1,
+        audioType: this.dialogForm.audioType,
+        platformId: null,
+      }
+      this.getList()
+    },
+
+    // 列表
+    getList() {
+      this.loading = true
+      list(this.dialogForm).then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data.records
+          this.total = res.data.total
+          this.loading = false
+          this.$refs.tableData.clearSelection()
+          if (this.data.length > 0) {
+            this.data.map(i => {
+              let row = this.tableData.find(j => j.audioId === i.audioId)
+              if (row) {
+                this.$refs.tableData.toggleRowSelection(row, true)
+              }
+            })
+          }
+        }
+      })
+    },
+
+    getRowKey(row) {
+      return row.audioId
+    },
+
+    // 选择
+    getChange(row) {
+      if (row.length > 0) {
+        row.map(i => {
+          if (this.data.findIndex(j => j.audioId === i.audioId) === -1) {
+            this.data.push(i)
+          }
+        })
+      }
+    },
+
+    // 字典翻译
+    freeFormatter(row) {
+      return this.selectDictLabel(this.freeOptions, row.isFree)
+    },
+    platfromFormatter(row) {
+      return this.selectDictLabel(this.platformOptions, row.platformId)
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-dialog__body {
+  height: 610px;
+  overflow-y: scroll;
+}
+</style>

+ 86 - 68
src/mixin/index.js

@@ -33,7 +33,28 @@ const devMixin = {
         })
       }
     })
-  },
+  }
+}
+
+// 设备模式
+const devTypeMixin = {
+  data() {
+    return {
+      typeOptions: [{
+        value: 1,
+        label: '蓝牙'
+      }, {
+        value: 2,
+        label: 'WIFI'
+      }, {
+        value: 3,
+        label: '传统蓝牙'
+      }, {
+        value: 4,
+        label: '4G'
+      }]
+    }
+  }
 }
 
 // 服务时长
@@ -41,46 +62,63 @@ const serviceTimeMixin = {
   data() {
     return {
       serviceTimeOptions: [{
-          value: 1,
-          label: '7天'
-        },
-        {
-          value: 2,
-          label: '14天'
-        },
-        {
-          value: 3,
-          label: '1个月'
-        },
-        {
-          value: 4,
-          label: '3个月'
-        },
-        {
-          value: 5,
-          label: '6个月'
-        },
-        {
-          value: 6,
-          label: '1年'
-        },
-        {
-          value: 7,
-          label: '2年'
-        },
-        {
-          value: 8,
-          label: '3年'
-        },
-        {
-          value: 9,
-          label: '5年'
-        },
-        {
-          value: 0,
-          label: '永久'
-        }
-      ]
+        value: 1,
+        label: '7天'
+      }, {
+        value: 2,
+        label: '14天'
+      }, {
+        value: 3,
+        label: '1个月'
+      }, {
+        value: 4,
+        label: '3个月'
+      }, {
+        value: 5,
+        label: '6个月'
+      }, {
+        value: 6,
+        label: '1年'
+      }, {
+        value: 7,
+        label: '2年'
+      }, {
+        value: 8,
+        label: '3年'
+      }, {
+        value: 9,
+        label: '5年'
+      }, {
+        value: 0,
+        label: '永久'
+      }]
+    }
+  }
+}
+
+const serviceTypeMixin = {
+  data() {
+    return {
+      // 服务类型
+      serviceTypeOptions: [{
+        value: 0,
+        label: '签到'
+      }, {
+        value: 1,
+        label: '收听奖励'
+      }, {
+        value: 2,
+        label: '积分抽奖'
+      }, {
+        value: 3,
+        label: '打开手机通知'
+      }, {
+        value: 4,
+        label: '积分兑换'
+      }, {
+        value: 5,
+        label: '服务中心'
+      }],
     }
   }
 }
@@ -224,31 +262,7 @@ const languageMixin = {
 const platformMixin = {
   data() {
     return {
-      platformTypeOptions: [{
-        value: 1,
-        label: '蜻蜓'
-      }, {
-        value: 2,
-        label: '官方电台'
-      }, {
-        value: 3,
-        label: '猫王好听'
-      }, {
-        value: 4,
-        label: '海外电台'
-      }, {
-        value: 5,
-        label: '音乐随身听'
-      }, {
-        value: 6,
-        label: 'QQ音乐'
-      }, {
-        value: 7,
-        label: 'HIFIVE音乐'
-      }, {
-        value: 8,
-        label: '看见音乐'
-      }],
+      platformTypeOptions: [],
       platformOptions: [],
     }
   },
@@ -259,10 +273,12 @@ const platformMixin = {
       return new Promise((resolve, reject) => {
         audioType(e).then(res => {
           if (res.code === 0) {
-            resolve(res.data.map(i => this.platformOptions.push({
+            res.data.map(i => this.platformOptions.push({
               value: Number(i.id),
               label: i.name
-            })))
+            }))
+            e ? this.platformTypeOptions = this.platformOptions : ''
+            resolve(this.platformOptions, this.platformTypeOptions)
           }
         }).catch(err => {
           reject()
@@ -528,7 +544,9 @@ const channelMixin = {
 
 export {
   devMixin,
+  devTypeMixin,
   serviceTimeMixin,
+  serviceTypeMixin,
   isFreeMixin,
   audioMixin,
   sexMixin,

+ 7 - 24
src/router/index.js

@@ -27,7 +27,6 @@ import Layout from '@/layout'
     activeMenu: '/system/user'      // 当路由设置了该属性,则会高亮相对应的侧边栏。
   }
  */
-
 // 公共路由
 export const constantRoutes = [{
     path: '/redirect',
@@ -491,34 +490,18 @@ export const dynamicRoutes = [{
     }]
   },
   // 服务管理
-  // 音乐套餐
-  {
-    path: '/service',
-    component: Layout,
-    hidden: true,
-    permissions: ['service:musicPackage:list'],
-    children: [{
-      path: 'musicPackage/detail',
-      component: () => import('@/views/service/musicPackage/detail'),
-      name: 'musicPackageDetail',
-      meta: {
-        title: '音乐套餐',
-        activeMenu: '/service/musicPackage'
-      }
-    }]
-  },
+  // 音乐套餐 / 流量套餐
   {
     path: '/service',
     component: Layout,
     hidden: true,
-    permissions: ['service:flowPackage:list'],
+    permissions: ['service:package:list'],
     children: [{
-      path: 'flowPackage/detail',
-      component: () => import('@/views/service/flowPackage/detail'),
-      name: 'flowPackageDetail',
+      path: 'package/detail',
+      component: () => import('@/views/service/package/detail'),
+      name: 'packageDetail',
       meta: {
-        title: '流量套餐',
-        activeMenu: '/service/flowPackage'
+        title: '套餐详情'
       }
     }]
   },
@@ -579,4 +562,4 @@ export default new Router({
     y: 0
   }),
   routes: constantRoutes
-})
+})

+ 38 - 4
src/views/content/banner/detail.vue

@@ -3,7 +3,7 @@
     <el-form :model="form" label-width="110px">
       <el-form-item label="Banner位置:">
         <el-select v-model="form.type" placeholder="请选择Banner位置">
-          <el-option v-for="item in dict.type.show_the_location" :key="item.value" :label="item.label"
+          <el-option v-for="item in locationOptions" :key="item.value" :label="item.label"
             :value="Number(item.value)" />
         </el-select>
       </el-form-item>
@@ -20,7 +20,7 @@
         </el-radio-group>
         <el-select v-model="form.forwardLocation" v-if="form.forwardType === 0" placeholder="请选择跳转位置"
           style="margin: 15px 0 20px 0">
-          <el-option v-for="item in dict.type.nav_address_url" :key="item.value" :label="item.label"
+          <el-option v-for="item in addressOptions" :key="item.value" :label="item.label"
             :value="Number(item.value)" />
         </el-select>
         <el-input v-model="form.forwardUrl" placeholder="请输入跳转链接地址"></el-input>
@@ -44,7 +44,6 @@
 import Upload from '@/components/Upload/index'
 import { submit, detail, edit } from '@/api/content/banner'
 export default {
-  dicts: ['nav_address_url', 'show_the_location'],
   components: {
     Upload
   },
@@ -54,7 +53,41 @@ export default {
       form: {
         sort: 1,
         forwardType: 0
-      }
+      },
+      // 展示位置
+      locationOptions: [{
+        value: 1,
+        label: '首页-推荐'
+      }, {
+        value: 2,
+        label: '电台-首页'
+      }, {
+        value: 3,
+        label: '音乐-首页'
+      }, {
+        value: 5,
+        label: '喵舍-推荐'
+      }, {
+        value: 4,
+        label: '服务中心-音乐'
+      }, {
+        value: 6,
+        label: '服务中心-流量'
+      }, {
+        value: 7,
+        label: '服务中心-底部热门专辑'
+      }],
+      // 跳转地址
+      addressOptions:[{
+        value: 1,
+        label: '服务中心'
+      }, {
+        value: 2,
+        label: '喵舍'
+      }, {
+        value: 3,
+        label: '签到'
+      }]
     }
   },
   watch: {
@@ -114,6 +147,7 @@ export default {
 .el-form {
   width: 500px;
 }
+
 .form-btn {
   margin-left: 110px;
 }

+ 33 - 12
src/views/content/banner/index.vue

@@ -7,20 +7,17 @@
       </el-form-item>
       <el-form-item label="展示位置:">
         <el-select v-model="form.type" placeholder="请选择展示位置">
-          <el-option v-for="item in dict.type.show_the_location" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in locationOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态">
-          <el-option v-for="item in dict.type.on_off_out" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in currentOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="上/下架:">
         <el-select v-model="form.shelfStatus" placeholder="请选择上/下架状态">
-          <el-option v-for="item in dict.type.top_bottom_shelves" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in disabledOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -63,15 +60,16 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
   </div>
 </template>
 
 <script>
 import { page, changeStatus, remove } from '@/api/content/banner'
+import { disabledMixin, currentMixin } from '@/mixin/index'
 export default {
-  dicts: ['on_off_out', 'top_bottom_shelves', 'show_the_location'],
+  mixins: [disabledMixin, currentMixin],
   data() {
     return {
       // 遮罩层
@@ -83,7 +81,30 @@ export default {
       },
       total: 0,
       // 列表
-      tableData: []
+      tableData: [],
+      // 展示位置
+      locationOptions: [{
+        value: 1,
+        label: '首页-推荐'
+      }, {
+        value: 2,
+        label: '电台-首页'
+      }, {
+        value: 3,
+        label: '音乐-首页'
+      }, {
+        value: 5,
+        label: '喵舍-推荐'
+      }, {
+        value: 4,
+        label: '服务中心-音乐'
+      }, {
+        value: 6,
+        label: '服务中心-流量'
+      }, {
+        value: 7,
+        label: '服务中心-底部热门专辑'
+      }]
     }
   },
   mounted() {
@@ -164,13 +185,13 @@ export default {
 
     // 字典翻译
     statusFormatter(row) {
-      return this.selectDictLabel(this.dict.type.top_bottom_shelves, row.status)
+      return this.selectDictLabel(this.disabledOptions, row.status)
     },
     typeFormatter(row) {
-      return this.selectDictLabel(this.dict.type.show_the_location, row.type)
+      return this.selectDictLabel(this.locationOptions, row.type)
     },
     currentFormatter(row) {
-      return this.selectDictLabel(this.dict.type.on_off_out, row.currentStatus)
+      return this.selectDictLabel(this.currentOptions, row.currentStatus)
     }
   }
 }

+ 9 - 3
src/views/device/category/index.vue

@@ -14,7 +14,7 @@
       <el-table-column label="分类名称" prop="name" align="center" />
       <el-table-column label="状态" align="center">
         <template slot-scope="scope">
-          <dict-tag :options="dict.type.dev_normal_disable" :value="scope.row.status" />
+          <el-tag :type="scope.row.status === 1 ? '' : 'danger'">{{ selectDictLabel(statusOptions, scope.row.status) }}</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center">
@@ -57,9 +57,7 @@ import {
   categoryEdit,
   categoryDelete,
 } from "@/api/device/category";
-
 export default {
-  dicts: ["dev_normal_disable"],
   data() {
     return {
       // 遮罩层
@@ -91,6 +89,14 @@ export default {
           },
         ],
       },
+      // 设备状态
+      statusOptions: [{
+        value: 1,
+        label: '正常'
+      }, {
+        value: 2,
+        label: '停用'
+      }]
     };
   },
   mounted() {

+ 15 - 21
src/views/device/function/index.vue

@@ -71,27 +71,21 @@ export default {
         status: 0,
       },
       rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入功能名称",
-            trigger: "blur",
-          },
-        ],
-        type: [
-          {
-            required: true,
-            message: "请选择功能分类",
-            trigger: "change",
-          },
-        ],
-        status: [
-          {
-            required: true,
-            message: "请选择状态",
-            trigger: "change",
-          },
-        ],
+        name: [{
+          required: true,
+          message: "请输入功能名称",
+          trigger: "blur"
+        }],
+        type: [{
+          required: true,
+          message: "请选择功能分类",
+          trigger: "change"
+        }],
+        status: [{
+          required: true,
+          message: "请选择状态",
+          trigger: "change"
+        }]
       },
     };
   },

+ 98 - 102
src/views/device/list/detail.vue

@@ -12,7 +12,7 @@
       </el-form-item>
       <el-form-item label="升级方式:" prop="upgradeType">
         <el-select v-model="form.upgradeType" placeholder="请选择升级方式">
-          <el-option v-for="item in dict.type.dev_upgrade_type" :key="item.value" :label="item.label"
+          <el-option v-for="item in upgradeTypeOptions" :key="item.value" :label="item.label"
             :value="Number(item.value)" />
         </el-select>
       </el-form-item>
@@ -21,8 +21,7 @@
       </el-form-item>
       <el-form-item label="制造商:" prop="manufacturer">
         <el-select v-model="form.manufacturer" placeholder="请选择设备制造商" clearable>
-          <el-option v-for="item in dict.type.dev_manu_facturer" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in manuOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="设备类型:" prop="categoryId">
@@ -32,8 +31,7 @@
       </el-form-item>
       <el-form-item label="是否热门:" prop="isHot">
         <el-select v-model="form.isHot" placeholder="请选择是否热门">
-          <el-option v-for="item in dict.type.hot_yes_no" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in hotOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-row>
@@ -45,8 +43,8 @@
         </el-col>
         <el-col :span="12">
           <el-form-item label="离线图片:" prop="offlineImg" style="float:right">
-            <Upload listType="picture-card" :url="form.offlineImg"
-              @upload="handleUploadImg($event, 'offline')" :disabled="disabled" />
+            <Upload listType="picture-card" :url="form.offlineImg" @upload="handleUploadImg($event, 'offline')"
+              :disabled="disabled" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -54,58 +52,53 @@
       <el-button v-if="disabled === false && form.typeList.length < 4" type="primary" icon="el-icon-plus"
         @click="getAdd">新增</el-button>
       <div class="sub-form" v-for="(item, index) in form.typeList" :key="item.id">
-        <el-form-item label="设备模式:" :prop="`typeList.${index}.type`" :rules="{
-              required: true,
-              message: '请选择设备模式',
-              trigger: 'change',
-            }">
+        <el-form-item label="设备模式:" :prop="`typeList.${index}.type`"
+          :rules="{ required: true, message: '请选择设备模式', trigger: 'change' }">
           <el-select v-model="item.type" placeholder="请选择设备模式" @change="getTypeChange($event, index)">
-            <el-option v-for="item in dict.type.dev_list_type" :key="item.value" :label="item.label"
-              :value="Number(item.value)" :disabled="item.disabled" />
+            <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)"
+              :disabled="item.disabled" />
           </el-select>
         </el-form-item>
         <el-form-item v-if="item.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`"
-          :rules="{type: 'array', required: true, message: '请选择功能权限', trigger: 'change'}">
+          :rules="{ type: 'array', required: true, message: '请选择功能权限', trigger: 'change' }">
           <el-select v-model="item.functionList" placeholder="请选择功能权限" multiple>
             <el-option v-for="item in functionOptions" :key="item.id" :label="item.name" :value="item.type" />
           </el-select>
         </el-form-item>
         <el-form-item v-if="item.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`"
-          :rules="{required: true, message: '请选择连接方式', trigger: 'change'}">
+          :rules="{ required: true, message: '请选择连接方式', trigger: 'change' }">
           <el-select v-model="item.connectType" placeholder="请选择连接方式">
-            <el-option v-for="item in dict.type.dev_connect_type" :key="item.value" :label="item.label"
+            <el-option v-for="item in connectTypeOptions" :key="item.value" :label="item.label"
               :value="Number(item.value)" />
           </el-select>
         </el-form-item>
         <el-row>
           <el-col :span="12">
             <el-form-item :label="item.type === 1 || 3 ? '连接引导图:' : '开机引导图'" :prop="`typeList.${index}.icon1`"
-              :rules="{ required: true, message: '请上传引导图片', trigger: 'change'}">
-              <Upload listType="picture-card" :url="item.icon1"
-                @upload="handleUploadIcon($event, index, 'icon1')" :disabled="disabled" />
+              :rules="{ required: true, message: '请上传引导图片', trigger: 'change' }">
+              <Upload listType="picture-card" :url="item.icon1" @upload="handleUploadIcon($event, index, 'icon1')"
+                :disabled="disabled" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="配对键引导图:" :prop="`typeList.${index}.icon2`" style="float:right"
-              :rules="{ required: true, message: '请上传配对键引导图', trigger: 'change'}">
-              <Upload listType="picture-card" :url="item.icon2"
-                @upload="handleUploadIcon($event, index, 'icon2')" :disabled="disabled" />
+              :rules="{ required: true, message: '请上传配对键引导图', trigger: 'change' }">
+              <Upload listType="picture-card" :url="item.icon2" @upload="handleUploadIcon($event, index, 'icon2')"
+                :disabled="disabled" />
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页:"
-          :prop="`typeList.${index}.guideUrl`"
-          :rules="{ required: true, message: '请输入引导页网址' , trigger: 'blur'}">
+        <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页:" :prop="`typeList.${index}.guideUrl`"
+          :rules="{ required: true, message: '请输入引导页网址', trigger: 'blur' }">
           <el-input v-model="item.guideUrl" placeholder="请输入引导页网址" />
         </el-form-item>
         <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页内容:"
           :prop="`typeList.${index}.guidePageContent`"
-          :rules="{required: true, message: '请输入引导页内容', trigger: 'blur'}">
+          :rules="{ required: true, message: '请输入引导页内容', trigger: 'blur' }">
           <Editor v-model="item.guidePageContent" :min-height="250" :readOnly="disabled" />
         </el-form-item>
         <!-- 删除按钮 -->
-        <el-link class="el-icon-close" v-if="form.typeList.length > 1" :underline="false"
-          @click="getDelete(index)" />
+        <el-link class="el-icon-close" v-if="form.typeList.length > 1" :underline="false" @click="getDelete(index)" />
       </div>
     </el-form>
     <div class="form-btn">
@@ -116,20 +109,15 @@
 </template>
 
 <script>
+import { categoryList } from "@/api/device/category";
+import { functionList } from "@/api/device/function";
 import { Add, Detail, Edit } from "@/api/device/list";
-import { category, functions } from "../mixin/index";
+import { devTypeMixin } from "@/mixin/index";
 import Upload from "@/components/Upload/index";
 import Editor from "@/components/Editor/index";
 
 export default {
-  dicts: [
-    "dev_upgrade_type",
-    "hot_yes_no",
-    "dev_list_type",
-    "dev_connect_type",
-    "dev_manu_facturer",
-  ],
-  mixins: [category, functions],
+  mixins: [devTypeMixin],
   components: {
     Upload,
     Editor
@@ -149,68 +137,76 @@ export default {
       },
       // 表单验证
       rules: {
-        clientType: [
-          {
-            required: true,
-            message: "请输入设备型号",
-            trigger: "blur",
-          },
-        ],
-        name: [
-          {
-            required: true,
-            message: "请输入设备名称",
-            trigger: "blur",
-          },
-        ],
-        firstVersion: [
-          {
-            required: true,
-            message: "请输入初始版本号",
-            trigger: "blur",
-          },
-        ],
-        upgradeType: [
-          {
-            required: true,
-            message: "请选择升级方式",
-            trigger: "change",
-          },
-        ],
-        isHot: [
-          {
-            required: true,
-            message: "是否热门",
-            trigger: "change",
-          },
-        ],
-        categoryId: [
-          {
-            required: true,
-            message: "请选择设备类型",
-            trigger: "change",
-          },
-        ],
-        img: [
-          {
-            required: true,
-            message: "请上传在线图片",
-            trigger: "change",
-          },
-        ],
-        offlineImg: [
-          {
-            required: true,
-            message: "请上传离线图片",
-            trigger: "change",
-          },
-        ],
+        clientType: [{ required: true, message: "请输入设备型号", trigger: "blur" }],
+        name: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
+        firstVersion: [{ required: true, message: "请输入初始版本号", trigger: "blur" }],
+        upgradeType: [{ required: true, message: "请选择升级方式", trigger: "change" }],
+        isHot: [{ required: true, message: "是否热门", trigger: "change" }],
+        categoryId: [{ required: true, message: "请选择设备类型", trigger: "change" }],
+        img: [{ required: true, message: "请上传在线图片", trigger: "change" }],
+        offlineImg: [{ required: true, message: "请上传离线图片", trigger: "change" }],
       },
+      // 是否热门
+      hotOptions: [{
+        value: 0,
+        label: '否'
+      }, {
+        value: 1,
+        label: '是'
+      }],
+      // 是否强制
+      upgradeTypeOptions: [{
+        value: 1,
+        label: '强制'
+      }, {
+        value: 2,
+        label: '指定'
+      }],
+      // 设备连接
+      connectTypeOptions: [{
+        value: 2,
+        label: 'UPnP'
+      }, {
+        value: 3,
+        label: 'MQTT'
+      }],
+      // 制造商
+      manuOptions: [{
+        value: 'ShanJing',
+        label: 'ShanJing'
+      }, {
+        value: 'JieLi',
+        label: 'JieLi'
+      }, {
+        value: 'LingXin',
+        label: 'LingXin'
+      }, {
+        value: 'QiXinWei',
+        label: 'QiXinWei'
+      }],
+      functionOptions: [],
+      categoryOptions: []
     };
   },
   mounted() {
-    this.disabled = this.$route.query.key === "查看" ? true : false;
-    this.getList();
+    this.disabled = this.$route.query.key === "查看" ? true : false
+    this.getList()
+    // 权限列表
+    functionList({
+      isDelete: 0
+    }).then((res) => {
+      if (res.code === 0) {
+        this.functionOptions = res.data;
+      }
+    });
+    // 设备类型
+    categoryList({
+      status: 1,
+    }).then((res) => {
+      if (res.code === 0) {
+        this.categoryOptions = res.data;
+      }
+    });
   },
   methods: {
     // 详情
@@ -222,7 +218,7 @@ export default {
           if (res.code === 0) {
             this.form = res.data;
             this.form.typeList.map((i) => {
-              this.dict.type.dev_list_type[i.type - 1].disabled = true;
+              this.typeOptions[i.type - 1].disabled = true;
             });
           }
         });
@@ -243,13 +239,13 @@ export default {
 
     // 选中一个设备类型就从数组中去掉
     getTypeChange() {
-      for (let i in this.dict.type.dev_list_type) {
-        this.dict.type.dev_list_type[i].disabled = false
+      for (let i in this.typeOptions) {
+        this.typeOptions[i].disabled = false
       }
       this.form.typeList.map(i => {
         if (i.type) {
-          let index = this.dict.type.dev_list_type.findIndex(j => j.value == i.type)
-          this.dict.type.dev_list_type[index].disabled = true
+          let index = this.typeOptions.findIndex(j => j.value == i.type)
+          this.typeOptions[index].disabled = true
         }
       })
     },
@@ -267,7 +263,7 @@ export default {
     // 删除子表单
     getDelete(index) {
       this.form.typeList.splice(index, 1);
-      this.dict.type.dev_list_type[index].disabled = false;
+      this.typeOptions[index].disabled = false;
     },
 
     // 取消

+ 23 - 10
src/views/device/list/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索表单 -->
-    <el-form inline label-width="100px" size="mini" @submit.native.prevent>
+    <el-form inline size="mini">
       <el-form-item label="设备名称:">
         <el-input v-model="form.name" placeholder="请输入设备名称" clearable />
       </el-form-item>
@@ -13,8 +13,7 @@
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <el-button type="primary" icon="el-icon-plus" plain @click="getChange()"
-          v-hasPermi="['device:list:add']">
+        <el-button type="primary" icon="el-icon-plus" plain @click="getChange()" v-hasPermi="['device:list:add']">
           新增
         </el-button>
         <el-button type="primary" icon="el-icon-top" @click="getShelves(1)" :disabled="isDisabled()"
@@ -53,8 +52,7 @@
             v-hasPermi="['device:list:up']">
             上架
           </el-button>
-          <el-button v-else type="text" @click="getShelves(2, scope.row.id)"
-            v-hasPermi="['device:list:down']">
+          <el-button v-else type="text" @click="getShelves(2, scope.row.id)" v-hasPermi="['device:list:down']">
             下架
           </el-button>
           <el-button v-if="scope.row.status === 2" type="delete" @click="getDelete(scope.row.id)"
@@ -64,7 +62,7 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
   </div>
 </template>
@@ -73,7 +71,6 @@
 import { List, Delete, upDown } from '@/api/device/list'
 import { devMixin } from '@/mixin/index'
 export default {
-  dicts: ['hot_yes_no', 'dev_upgrade_type'],
   mixins: [devMixin],
   data() {
     return {
@@ -92,7 +89,23 @@ export default {
       changeForm: {
         ids: '',
         type: null
-      }
+      },
+      // 是否热门
+      hotOptions: [{
+        value: 0,
+        label: '否'
+      }, {
+        value: 1,
+        label: '是'
+      }],
+      // 是否强制
+      upgradeTypeOptions: [{
+        value: 1,
+        label: '强制'
+      }, {
+        value: 2,
+        label: '指定'
+      }],
     }
   },
   mounted() {
@@ -186,11 +199,11 @@ export default {
 
     // 字典翻译
     hotFormatter(row) {
-      return this.selectDictLabel(this.dict.type.hot_yes_no, row.isHot)
+      return this.selectDictLabel(this.hotOptions, row.isHot)
     },
 
     upgradeTypeFormatter(row) {
-      return this.selectDictLabel(this.dict.type.dev_upgrade_type, row.upgradeType)
+      return this.selectDictLabel(this.upgradeTypeOptions, row.upgradeType)
     }
   }
 }

+ 0 - 47
src/views/device/mixin/index.js

@@ -1,47 +0,0 @@
-import {
-  categoryList
-} from "@/api/device/category";
-import {
-  functionList
-} from "@/api/device/function";
-
-const category = {
-  data() {
-    return {
-      categoryOptions: []
-    }
-  },
-  created() {
-    // 设备类型
-    categoryList({
-      status: 1,
-    }).then((res) => {
-      if (res.code === 0) {
-        this.categoryOptions = res.data;
-      }
-    });
-  }
-}
-
-const functions = {
-  data() {
-    return {
-      functionOptions: []
-    }
-  },
-  created() {
-    // 权限列表
-    functionList({
-      isDelete: 0
-    }).then((res) => {
-      if (res.code === 0) {
-        this.functionOptions = res.data;
-      }
-    });
-  }
-}
-
-export {
-  category,
-  functions
-}

+ 24 - 15
src/views/device/version/detail.vue

@@ -3,14 +3,12 @@
     <el-form :model="form" :rules="rules" ref="form" label-width="100px">
       <el-form-item prop="deviceTypeId" label="设备型号:">
         <el-select v-model="form.deviceTypeId" placeholder="请选择设备型号" filterable>
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="type" label="设备模式:">
         <el-select v-model="form.type" placeholder="请选择设备模式">
-          <el-option v-for="item in dict.type.dev_list_type" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="version" label="版本号:">
@@ -34,25 +32,22 @@
       </el-form-item>
       <el-form-item prop="isEnforcement" label="设备升级:">
         <el-select v-model="form.deviceIsEnforcement" placeholder="是否强制设备升级">
-          <el-option v-for="item in dict.type.dev_yes_no" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="isEnforcement" label="APP升级:">
         <el-select v-model="form.isEnforcement" placeholder="是否强制APP升级">
-          <el-option v-for="item in dict.type.dev_yes_no" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="isPush" label="同步推送:">
         <el-select v-model="form.isPush" placeholder="是否同步推送">
-          <el-option v-for="item in dict.type.dev_yes_no" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="userType" label="升级对象:">
         <el-select v-model="form.userType" placeholder="请选择升级对象">
-          <el-option v-for="item in dict.type.push_user_type" :key="item.value" :label="item.label"
+          <el-option v-for="item in pushOptions" :key="item.value" :label="item.label"
             :value="Number(item.value)" />
         </el-select>
       </el-form-item>
@@ -70,10 +65,9 @@
 <script>
 import { getDetailInfo, updateEdit, getVersionAdd } from "@/api/device/version";
 import Upload from "@/components/Upload/index";
-import { devMixin } from '@/mixin/index'
+import { devMixin, devTypeMixin } from '@/mixin/index'
 export default {
-  dicts: ["dev_list_type", "dev_yes_no", "push_user_type"],
-  mixins: [devMixin],
+  mixins: [devMixin, devTypeMixin],
   components: {
     Upload,
   },
@@ -153,6 +147,22 @@ export default {
           },
         ],
       },
+      // 设备是否
+      typeOptions: [{
+        value: 1,
+        label: '是'
+      }, {
+        value: 2,
+        label: '否'
+      }],
+      // 升级对象
+      pushOptions: [{
+        value: 1,
+        label: '全部'
+      }, {
+        value: 3,
+        label: '指定'
+      }]
     };
   },
   mounted() {
@@ -166,7 +176,6 @@ export default {
         }
       });
     }
-    console.log(this.devOptions);
   },
   methods: {
     // 上传文件

+ 6 - 7
src/views/device/version/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form :model="form" inline label-width="100px" size="mini">
+    <el-form :model="form" inline size="mini">
       <el-form-item label="升级标题:">
         <el-input v-model="form.title" placeholder="请输入升级标题" clearable />
       </el-form-item>
@@ -21,8 +21,8 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
       <el-table-column prop="id" label="型号ID" align="center" />
-      <el-table-column prop="title" label="升级标题" align="center" />
-      <el-table-column prop="deviceTypeName" label="设备名称" align="center" />
+      <el-table-column prop="title" label="升级标题" align="center" show-overflow-tooltip />
+      <el-table-column prop="deviceTypeName" label="设备名称" align="center" show-overflow-tooltip />
       <el-table-column prop="listType" label="设备类型" align="center" :formatter="typeFormatter" />
       <el-table-column prop="version" label="版本号" align="center" />
       <el-table-column label="下载路径" align="center" show-overflow-tooltip>
@@ -53,10 +53,9 @@
 
 <script>
 import { getPageList, getVersionDelete } from '@/api/device/version'
-import { devMixin } from '@/mixin/index'
+import { devMixin, devTypeMixin } from '@/mixin/index'
 export default {
-  dicts: ['dev_list_type'],
-  mixins: [devMixin],
+  mixins: [devMixin, devTypeMixin],
   data() {
     return {
       // 遮罩层
@@ -130,7 +129,7 @@ export default {
 
     // 字典翻译
     typeFormatter(row) {
-      return row.listType.map(i => this.selectDictLabel(this.dict.type.dev_list_type, i)).join(',')
+      return row.listType.map(i => this.selectDictLabel(this.typeOptions, i)).join(',')
     }
   }
 }

+ 12 - 15
src/views/device/yxw/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="设备号:">
         <el-input v-model="form1.dsn" placeholder="请输入设备号" clearable />
       </el-form-item>
@@ -10,23 +10,21 @@
       </el-form-item>
       <el-form-item label="设备类型:">
         <el-select v-model="form1.deviceType" placeholder="请选择设备类型" clearable>
-          <el-option v-for="item in dict.type.dev_list_type" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form1.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="创建时间:">
-        <el-date-picker v-model="createTime" type="datetimerange" start-placeholder="开始日期"
-          end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" clearable />
+        <el-date-picker v-model="createTime" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss" clearable />
       </el-form-item>
       <el-form-item label="激活时间:">
-        <el-date-picker v-model="updateTime" type="datetimerange" start-placeholder="开始日期"
-          end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" clearable />
+        <el-date-picker v-model="updateTime" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss" clearable />
       </el-form-item>
       <el-form-item>
         <el-button icon="el-icon-search" type="primary" @click="getSearch">搜索</el-button>
@@ -39,7 +37,7 @@
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
-      <el-table-column prop="id" label="设备号" align="center" show-overflow-tooltip/>
+      <el-table-column prop="id" label="设备号" align="center" show-overflow-tooltip />
       <el-table-column prop="deviceMac" label="设备标识" align="center" />
       <el-table-column prop="clientType" label="设备型号" align="center" />
       <el-table-column prop="type" label="设备类型" align="center" />
@@ -47,14 +45,12 @@
       <el-table-column prop="updateTimeStr" label="激活时间" align="center" />
       <el-table-column prop="statusStr" label="当前状态" align="center" />
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form1.pageIndex" :limit.sync="form1.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form1.pageIndex" :limit.sync="form1.pageSize"
       @pagination="getList" />
     <!-- 弹窗 -->
     <el-dialog title="新增" :visible.sync="dialogVisible" width="500px">
       <el-form :model="form2" ref="form" label-width="100px">
-        <el-form-item prop="num" label="设备数量:" :rules="[{
-          required: true, message: '请输入设备数量', trigger: 'blur'
-        }]">
+        <el-form-item prop="num" label="设备数量:" :rules="[{ required: true, message: '请输入设备数量', trigger: 'blur' }]">
           <el-input v-model="form2.num" placeholder="请输入设备数量" />
         </el-form-item>
       </el-form>
@@ -68,8 +64,9 @@
 
 <script>
 import { getYxwPage, getYxwAdd } from "@/api/device/yxw";
+import { devTypeMixin } from '@/mixin/index'
 export default {
-  dicts: ['dev_list_type'],
+  mixins: [devTypeMixin],
   data() {
     return {
       // 遮罩层

+ 8 - 16
src/views/goods/list/index.vue

@@ -1,17 +1,15 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="推荐位置:">
         <el-select v-model="form.position" placeholder="请选择推荐位置" clearable>
-          <el-option v-for="item in locationOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in locationOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in currentOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="商品名称:">
@@ -53,7 +51,7 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
   </div>
 </template>
@@ -61,9 +59,9 @@
 <script>
 import { list, remove } from '@/api/goods/list'
 import { locMixin } from './mixin'
+import { currentMixin } from '@/mixin/index'
 export default {
-  dicts: ['on_off_out'],
-  mixins: [locMixin],
+  mixins: [locMixin, currentMixin],
   data() {
     return {
       // 遮罩层
@@ -75,13 +73,7 @@ export default {
       },
       // 列表
       tableData: [],
-      total: 0,
-      // 当前状态
-      statusOptions: [
-        { value: 0, label: '进行中' },
-        { value: 1, label: '未开始' },
-        { value: 2, label: '已过期' }
-      ]
+      total: 0
     }
   },
   mounted() {
@@ -146,7 +138,7 @@ export default {
     },
 
     statusFormatter(row) {
-      return this.selectDictLabel(this.statusOptions, row.status)
+      return this.selectDictLabel(this.currentOptions, row.status)
     }
   }
 }

+ 1 - 0
src/views/music/choiceness/detail.vue

@@ -206,6 +206,7 @@ export default {
       this.disabled = Boolean(this.$route.query.disabled)
       this.getDetail()
     }
+    this.getPlatform({})
   },
   methods: {
     // 详情

+ 1 - 0
src/views/music/choiceness/index.vue

@@ -79,6 +79,7 @@ export default {
   },
   mounted() {
     this.getList()
+    this.getPlatform({})
   },
   methods: {
     // 列表

+ 157 - 0
src/views/music/monitor/index.vue

@@ -0,0 +1,157 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索 -->
+    <el-form inline size="mini">
+      <el-form-item label="音频名称:">
+        <el-input placeholder="请输入音频名称" />
+      </el-form-item>
+      <el-form-item label="音频类型:">
+        <el-select v-model="form.audioType" placeholder="请选择音频类型" clearable>
+          <el-option v-for="item in audioTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="资源平台:">
+        <el-select v-model="form.platformId" placeholder="请选择资源平台" clearable>
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column label="异常ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
+      <el-table-column label="音频名称" prop="name" align="center" show-overflow-tooltip />
+      <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
+      <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformIdFormatter" />
+      <el-table-column label="异常时间" align="center">
+        <template slot-scope="scope">
+          {{ parseTime(scope.row.abnormalTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDialog(scope.row.id)">查看</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+      @pagination="getList" />
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" title="详情" width="1000px">
+      <el-descriptions title="音频信息" :column="2">
+        <el-descriptions-item label="音频ID">{{ dialogForm.audioId }}</el-descriptions-item>
+        <el-descriptions-item label="音频名称">{{ dialogForm.name }}</el-descriptions-item>
+        <el-descriptions-item label="音频类型">{{ this.selectDictLabel(this.audioOptions, dialogForm.audioType)
+        }}</el-descriptions-item>
+        <el-descriptions-item label="资源平台">{{ this.selectDictLabel(this.platformOptions, dialogForm.platformId)
+        }}</el-descriptions-item>
+      </el-descriptions>
+      <el-descriptions title="异常信息" :column="2">
+        <el-descriptions-item label="下线次数">{{ dialogForm.officialCount }}</el-descriptions-item>
+        <el-descriptions-item label="码率">{{ dialogForm.dialogForm }}</el-descriptions-item>
+        <el-descriptions-item label="异常ID">{{ dialogForm.id }}</el-descriptions-item>
+        <el-descriptions-item label="异常时间">
+          {{ parseTime(dialogForm.abnormalTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { platformMixin, audioMixin } from '@/mixin/index'
+import { list, detail } from '@/api/music/monitor'
+export default {
+  mixins: [platformMixin, audioMixin],
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      // 列表
+      tableData: [],
+      // 总数
+      total: 0,
+      // 弹窗
+      dialogVisible: false,
+      // 详情
+      dialogForm: {}
+    }
+  },
+  watch: {
+    'form.audioType'(val) {
+      this.getPlatform(val ? { audioType: val } : {})
+    },
+    'form.platformId'(val) {
+      if (val) {
+        this.getAudioType(val)
+      } else {
+        this.audioTypeOptions = this.audioOptions
+      }
+    }
+  },
+  mounted() {
+    this.getPlatform({})
+    this.audioTypeOptions = this.audioOptions
+    this.getList()
+  },
+  methods: {
+    // 列表
+    getList() {
+      this.loading = true
+      list(this.form).then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data.records
+          this.total = res.data.total
+          this.loading = false
+        }
+      })
+    },
+
+    // 搜索
+    getSearch() {
+      this.form.pageNum = 1
+      this.getList()
+    },
+
+    // 重置
+    getRefresh() {
+      this.form = {
+        pageNum: 1,
+        pageSize: 10
+      }
+      this.getList()
+    },
+
+    // 弹窗
+    getDialog(id) {
+      this.dialogVisible = true
+      detail(id).then(res => {
+        if (res.code === 0) {
+          this.dialogForm = res.data
+        }
+      })
+    },
+
+    // 翻译
+    audioTypeFormatter(row) {
+      return this.selectDictLabel(this.audioOptions, row.audioType)
+    },
+    platformIdFormatter(row) {
+      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 5 - 8
src/views/ohplay/content/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="内容类型:">
         <el-select v-model="form.contentType" placeholder="请选择内容类型" clearable>
           <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
@@ -14,8 +14,7 @@
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.typeStatus" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value='item.value' />
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value='item.value' />
         </el-select>
       </el-form-item>
       <el-form-item label="内容或回复:">
@@ -36,8 +35,7 @@
       <el-table-column label="图片" align="center" width="170px">
         <template slot-scope="scope">
           <div class="image-box" v-if="scope.row.images">
-            <el-image class="image" v-for="item in scope.row.images.split(',').slice(0, 6)" :key="item"
-              :src="item" />
+            <el-image class="image" v-for="item in scope.row.images.split(',').slice(0, 6)" :key="item" :src="item" :preview-src-list="scope.row.images.split(',').slice(0, 6)" />
           </div>
         </template>
       </el-table-column>
@@ -62,7 +60,7 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
     <!-- 弹窗 -->
     <el-dialog :visible.sync="dialogVisible" :title="title" :before-close="cancel" width="600px">
@@ -79,8 +77,7 @@
           </el-form-item>
           <el-form-item label="权重唯一:" prop="isOnlyWeight">
             <el-select v-model="dialogForm.isOnlyWeight" placeholder="权重是否唯一">
-              <el-option v-for="item in onlyOptions" :key="item.value" :label="item.label"
-                :value="item.value" />
+              <el-option v-for="item in onlyOptions" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
           </el-form-item>
           <el-form-item label="推荐日期:" prop="dialogDate">

+ 9 - 2
src/views/ohplay/operation/index.vue

@@ -26,7 +26,7 @@
           </el-form-item>
           <el-form-item label="跳转:">
             <el-select v-model="item.skip" placeholder="请选择跳转页面">
-              <el-option v-for="item in dict.type.nav_address_type" :key="item.value" :label="item.label"
+              <el-option v-for="item in typeOptions" :key="item.value" :label="item.label"
                 :value="Number(item.value)" />
             </el-select>
           </el-form-item>
@@ -50,7 +50,6 @@ export default {
   components: {
     Upload
   },
-  dicts: ['nav_address_type'],
   data() {
     return {
       img: [{
@@ -68,6 +67,14 @@ export default {
       pic: '',
       // 列表
       list: [],
+      // 跳转类型
+      typeOptions: [{
+        value: 0,
+        label: '指定页面'
+      }, {
+        value: 1,
+        label: '指定URL'
+      }]
     }
   },
   mounted() {

+ 13 - 5
src/views/ohplay/programa/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item>
         <el-button type="primary" icon="el-icon-plus" @click="getDialog()"
           v-hasPermi="['ohplay:programa:add']">新增</el-button>
@@ -32,7 +32,7 @@
         </el-form-item>
         <el-form-item label="栏目状态:" prop="type">
           <el-select v-model="form.type" placeholder="请选择栏目状态">
-            <el-option v-for="item in dict.type.valid_yes_not" :key="item.value" :label="item.label"
+            <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
               :value="Number(item.value)" />
           </el-select>
         </el-form-item>
@@ -51,7 +51,6 @@
 <script>
 import { list, create, edit, detail } from '@/api/ohplay/programa'
 export default {
-  dicts: ['valid_yes_not'],
   data() {
     return {
       // 遮罩层
@@ -77,7 +76,15 @@ export default {
         location: [{
           required: true, message: '请输入栏目定位', trigger: 'blur'
         }]
-      }
+      },
+      // 是否有效
+      statusOptions: [{
+        value: 0,
+        label: '有效'
+      }, {
+        value: 1,
+        label: '无效'
+      }]
     }
   },
   mounted() {
@@ -142,11 +149,12 @@ export default {
 
     // 字典翻译
     typeFormatter(row) {
-      return this.selectDictLabel(this.dict.type.valid_yes_not, row.type)
+      return this.selectDictLabel(this.statusOptions, row.type)
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
+
 </style>

+ 6 - 9
src/views/ohplay/recommend/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="内容:">
         <el-input v-model="form.content" placeholder="请输入内容" clearable />
       </el-form-item>
@@ -17,13 +17,11 @@
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.recommendStatus" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value='item.value' />
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value='item.value' />
         </el-select>
       </el-form-item>
       <el-form-item label="更新时间:">
-        <el-date-picker v-model="date" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间"
-          clearable />
+        <el-date-picker v-model="date" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间" clearable />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
@@ -33,11 +31,10 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
       <el-table-column label="内容" prop="content" align="center" show-overflow-tooltip />
-      <el-table-column label="图片" align="center" width="100px">
+      <el-table-column label="图片" align="center" width="170px">
         <template slot-scope="scope">
           <div class="image-box" v-if="scope.row.images">
-            <el-image class="image" v-for="item in scope.row.images.split(',').slice(0, 6)" :key="item"
-              :src="item" />
+            <el-image class="image" v-for="item in scope.row.images.split(',').slice(0, 6)" :key="item" :src="item" :preview-src-list="scope.row.images.split(',').slice(0, 6)" />
           </div>
         </template>
       </el-table-column>
@@ -58,7 +55,7 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
 
     <!-- 弹窗 -->

+ 21 - 136
src/views/operation/channel/detail.vue

@@ -10,7 +10,7 @@
           <el-form-item label="频道属性:">
             <el-select v-model="form.channelType" placeholder="请选择频道属性" :disabled="disabled"
               @change="handleChange">
-              <el-option v-for="item in dict.type.channels_type" :key="item.value" :value="Number(item.value)"
+              <el-option v-for="item in channelTypeOptions" :key="item.value" :value="Number(item.value)"
                 :label="item.label" />
             </el-select>
           </el-form-item>
@@ -52,65 +52,19 @@
       <el-button type="primary" @click="submit">提交</el-button>
     </div>
     <!-- 弹窗 -->
-    <el-dialog :visible.sync="dialogVisible" title="新增内容" width="1000px">
-      <!-- 搜索 -->
-      <el-form inline size="mini" @submit.native.prevent>
-        <el-form-item label="音频类型:">
-          <el-select v-model="dialogForm.audioType">
-            <el-option v-for="item in channelOptions[form.channelType]" :key="item.value"
-              :value="item.value" :label="item.label" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="资源平台:">
-          <el-select v-model="dialogForm.platformId" :disabled="[16, 17].includes(form.channelType)">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="付费类型:" v-if="![2, 10, 11].includes(dialogForm.audioType)">
-          <el-select v-model="dialogForm.isFree" placeholder="请选择付费类型">
-            <el-option v-for="item in freeOptions" :key="item.value" :label="item.label"
-              :value="item.value" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="内容名称:">
-          <el-input v-model="dialogForm.keyword" placeholder="请输入内容名称" clearable />
-        </el-form-item>
-        <el-form-item>
-          <el-button icon="el-icon-search" type="primary" @click="getSearch">搜索</el-button>
-          <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        </el-form-item>
-      </el-form>
-      <!-- 列表 -->
-      <el-table :data="dialogData" ref="table" :row-key="getRowKey" @selection-change="getChange">
-        <el-table-column type="selection" align="center" :reserve-selection="true" />
-        <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
-        <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
-        <el-table-column label="音频封面" align="center" width="100px">
-          <template slot-scope="scope">
-            <el-image v-if="scope.row.audioPic" :src="scope.row.audioPic" />
-          </template>
-        </el-table-column>
-        <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
-        <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
-      </el-table>
-      <div slot="footer">
-        <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
-          :limit.sync="dialogForm.pageSize" @pagination="getList" />
-      </div>
-    </el-dialog>
+    <Dialog :visible="dialogVisible" :data="form.list" :channelType="form.channelType" @close="close" />
   </div>
 </template>
 
 <script>
+import Dialog from '@/components/Dialog/index.vue'
 import Upload from '@/components/Upload/index'
-import { list, channelDetail, edit } from '@/api/operation/channel'
-import { platformMixin, isFreeMixin, channelMixin } from '@/mixin/index'
+import { channelDetail, edit } from '@/api/operation/channel'
+import { platformMixin, isFreeMixin } from '@/mixin/index'
 export default {
-  dicts: ['channels_type'],
-  mixins: [platformMixin, isFreeMixin, channelMixin],
+  mixins: [platformMixin, isFreeMixin],
   components: {
-    Upload
+    Upload, Dialog
   },
   data() {
     return {
@@ -118,41 +72,22 @@ export default {
       loading: false,
       // 弹窗
       dialogVisible: false,
-      // 内容列表
-      dialogData: [],
       // 表单
       form: {},
       // 频道1 频道2 的频道属性不可修改
       disabled: this.$route.query.index == '0' || this.$route.query.index == '1' ? true : false,
-      // 搜索表单
-      dialogForm: {
-        pageNum: 1,
-        pageSize: 10,
-        status: 1,
-        platformId: null,
-        audioType: null
-      },
-      total: 0
-    }
-  },
-  watch: {
-    'form.channelType'(val) {
-      this.getPlatform({
-        audioType: this.channelOptions[val][0].value
-      })
-      this.dialogForm.audioType = this.channelOptions[val][0].value
-    },
-    async 'dialogForm.audioType'(val) {
-      if (this.dialogVisible) {
-        await this.getPlatform({
-          audioType: val
-        })
-        this.getRefresh()
-      }
+      channelTypeOptions: [
+        { value: 2, label: '广播' },
+        { value: 6, label: '节目' },
+        { value: 8, label: '专辑' },
+        { value: 16, label: '猫王音乐台' },
+        { value: 17, label: '猫王精选电台' }
+      ]
     }
   },
   mounted() {
     this.getDetail()
+    this.getPlatform({})
   },
   methods: {
     // 频道详情
@@ -171,25 +106,6 @@ export default {
       this.form.list = this.form.audioList = []
     },
 
-    // 内容列表
-    getList() {
-      list(this.dialogForm).then(res => {
-        if (res.code == 0) {
-          this.dialogData = res.data.records
-          this.total = res.data.total
-          this.$refs.table.clearSelection()
-          if (this.form.list.length > 0) {
-            this.form.list.map(i => {
-              let row = this.dialogData.find(j => j.audioId === i.audioId)
-              if (row) {
-                this.$refs.table.toggleRowSelection(row, true)
-              }
-            })
-          }
-        }
-      })
-    },
-
     // 上传频道封面
     getUpload(e) {
       this.form.pic = e.file
@@ -198,26 +114,16 @@ export default {
     // 打开弹窗
     getDialog() {
       this.dialogVisible = true
-      this.dialogForm.platformId = this.form.channelType === 16 ? 3 : this.form.channelType === 17 ? 2 : this.platformOptions[0].value
-      this.getList()
     },
 
-    // 搜索
-    getSearch() {
-      this.dialogForm.pageNum = 1
-      this.getList()
+    // 关闭弹窗
+    close() {
+      this.dialogVisible = false
     },
 
-    // 重置
-    getRefresh() {
-      this.dialogForm = {
-        pageNum: 1,
-        pageSize: 10,
-        status: 1,
-        audioType: this.dialogForm.audioType,
-        platformId: this.platformOptions[0].value,
-      }
-      this.getList()
+    // 删除
+    getDelete(row) {
+      this.form.list = this.form.list.filter(i => i.audioId !== row.audioId)
     },
 
     // 提交
@@ -242,27 +148,6 @@ export default {
       this.$tab.closeOpenPage('/operation/channel')
     },
 
-    // 删除
-    getDelete(row) {
-      this.form.list = this.form.list.filter(i => i.audioId !== row.audioId)
-    },
-
-    getRowKey(row) {
-      return row.audioId
-    },
-
-    // 表格多选
-    getChange(row) {
-      this.form.audioList = []
-      if (row.length > 0) {
-        row.map(i => {
-          if (this.form.list.findIndex(j => j.audioId === i.audioId) === -1) {
-            this.form.list.push(i)
-          }
-        })
-      }
-    },
-
     // 字典翻译
     platfromFormatter(row) {
       return this.selectDictLabel(this.platformTypeOptions, row.platformId)

+ 18 - 19
src/views/operation/channel/index.vue

@@ -10,8 +10,7 @@
       <el-table-column label="序号" align="center" type="index" />
       <el-table-column label="频道配置名称" prop="name" align="center" />
       <el-table-column label="部署形式" prop="type" align="center" :formatter="typeFormatter" />
-      <el-table-column label="设备" prop="deviceIds" align="center" :formatter="devFormatter"
-        show-overflow-tooltip />
+      <el-table-column label="设备" prop="deviceIds" align="center" :formatter="devFormatter" show-overflow-tooltip />
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
           <el-button type="text" @click="getDialog(scope.row, scope.$index)"
@@ -31,12 +30,12 @@
         </el-form-item>
         <el-form-item v-if="index !== 1" label="关联设备:">
           <el-select v-model="ids" multiple placeholder="请选择关联设备">
-            <el-option v-for="item in devOptions" :key="item.clientTypeId"
-              :value="item.clientTypeId.toString()" :label="item.name" />
+            <el-option v-for="item in devOptions" :key="item.clientTypeId" :value="item.clientTypeId.toString()"
+              :label="item.name" />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="title === '编辑'" label="内容列表:">
-          <el-table :data="list" v-loading="dialog_loading" lazy :default-sort="{prop: 'sort'}">
+        <el-form-item v-if="title === '编辑'" label="内容列表:" style="height: 500px; overflow-y: auto;">
+          <el-table :data="list" v-loading="dialog_loading" lazy :default-sort="{ prop: 'sort' }">
             <el-table-column label="序号" prop="sort" align="center" width="100px" />
             <el-table-column label="频道数" prop="channelId" align="center" width="100px" />
             <el-table-column label="频道名称" prop="aliasName" align="center" show-overflow-tooltip />
@@ -51,8 +50,8 @@
                 <el-button type="text" @click="edit(scope)">编辑</el-button>
                 <el-button v-if="scope.row.sort > 3" type="text" icon="el-icon-caret-top"
                   @click="getChange(scope.row.id, scope.row.sort - 1)" />
-                <el-button v-if="scope.row.sort > 2 && scope.row.sort < 12" type="text"
-                  icon="el-icon-caret-bottom" @click="getChange(scope.row.id, scope.row.sort + 1)" />
+                <el-button v-if="scope.row.sort > 2 && scope.row.sort < 12" type="text" icon="el-icon-caret-bottom"
+                  @click="getChange(scope.row.id, scope.row.sort + 1)" />
               </template>
             </el-table-column>
           </el-table>
@@ -70,7 +69,6 @@
 import { channelPage, page, create, editPage, getRemove, devList, change } from '@/api/operation/channel'
 export default {
   name: 'Channel',
-  dicts: ['deployment_form'],
   data() {
     return {
       // 遮罩层
@@ -94,7 +92,15 @@ export default {
       dialogForm: {},
       ids: [],
       // 频道规则Id
-      obj: {}
+      obj: {},
+      // 部署形式
+      typeOptions: [{
+        value: 0,
+        label: '注册用户-默认'
+      }, {
+        value: 1,
+        label: '绑定特定设备'
+      }]
     };
   },
   watch: {
@@ -245,18 +251,11 @@ export default {
 
     // 字典翻译
     typeFormatter(row) {
-      return this.selectDictLabel(this.dict.type.deployment_form, row.type)
+      return this.selectDictLabel(this.typeOptions, row.type)
     },
     devFormatter(row) {
       return row.deviceIds ? row.deviceIds.split(',').map(i => this.selectDictLabel(this.allDevOptions, i)).join(',') : ''
     }
   },
 };
-</script>
-
-<style lang="scss" scoped>
-::v-deep .el-dialog__body {
-  height: 700px;
-  overflow-y: auto;
-}
-</style>
+</script>

+ 128 - 67
src/views/operation/recommend/index.vue

@@ -8,7 +8,7 @@
     <div style="display: flex; position: relative; align-items: flex-start">
       <el-image class="bg" :src="img" />
       <div :class="['item', active === index ? 'active' : '']"
-        :style="{top: item.top + 'px', height: item.height + 'px'}" v-for="(item, index) in style[tabIndex]"
+        :style="{ top: item.top + 'px', height: item.height + 'px' }" v-for="(item, index) in style[tabIndex]"
         :key="index" @click="getActive(index)" />
 
       <div class="form">
@@ -32,8 +32,7 @@
           <el-form label-width="auto" v-for="(item, index) in timeList" :key="item.id">
             <el-form-item label-width="0">
               <span style="font-weight: bold">场景电台时间设置</span>
-              <el-link icon="el-icon-close" :underline="false" style="float:right"
-                @click="getChangeTime(item.id, 2)" />
+              <el-link icon="el-icon-close" :underline="false" style="float:right" @click="getChangeTime(item.id, 2)" />
             </el-form-item>
             <el-form-item label="时间段:">
               <el-time-picker is-range v-model="item.date" start-placeholder="开始时间" end-placeholder="结束时间"
@@ -68,13 +67,16 @@
         </el-form>
 
         <!-- 内容列表模块 -->
-        <div v-else :style="{'display': tabIndex === 1 && active === 0 ? 'inline-block' : 'block'}">
+        <div v-else :style="{ 'display': tabIndex === 1 && active === 0 ? 'inline-block' : 'block' }">
           <el-form label-width="auto" v-for="(item, index) in list" :key="item.id">
-            <el-form-item label-width="0" :label="item.sort.toString()" />
+            <el-form-item label-width="0" :label="(index + 1).toString()">
+              <el-link v-if="tabIndex === 2 && active === 1" icon="el-icon-close" :underline="false" style="float:right"
+                @click="getRemoveList(item, index)" />
+            </el-form-item>
 
             <el-form-item label="时间:" v-if="time()">
-              <el-date-picker v-model="item.date" type="datetimerange" start-placeholder="开始日期"
-                end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" />
+              <el-date-picker v-model="item.date" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
+                value-format="yyyy-MM-dd HH:mm:ss" />
             </el-form-item>
 
             <el-form-item label="标题:" v-if="title()">
@@ -83,7 +85,7 @@
 
             <el-form-item label="模式:" v-if="model()">
               <el-select v-model="item.model" placeholder="请选择模式">
-                <el-option v-for="item in dict.type.content_model" :key="item.value" :label="item.label"
+                <el-option v-for="item in contentOptions" :key="item.value" :label="item.label"
                   :value="Number(item.value)" />
               </el-select>
             </el-form-item>
@@ -110,7 +112,7 @@
 
             <el-form-item label="封面模式:" v-if="isCustom(item)">
               <el-select v-model="item.isCustom" placeholder="选择封面模式">
-                <el-option v-for="item in dict.type.is_custom" :key="item.value" :label="item.label"
+                <el-option v-for="item in coverOptions" :key="item.value" :label="item.label"
                   :value="Number(item.value)" />
               </el-select>
             </el-form-item>
@@ -119,6 +121,10 @@
               <Upload listType="picture-card" :url="item.pic" @upload="getUpload($event, index)" />
             </el-form-item>
 
+            <el-form-item label="排序:" v-if="tabIndex === 2 && active === 1">
+              <el-input-number v-model="item.sort" />
+            </el-form-item>
+
             <el-form-item label="列表:" v-if="isList()">
               <el-button type="primary" @click="getDialog(index)" v-hasPermi="['operation:recommend:add']">
                 添加内容
@@ -147,6 +153,8 @@
                 v-hasPermi="['operation:recommend:down']">下架</el-button>
             </el-form-item>
           </el-form>
+          <el-button v-if="tabIndex === 2 && active === 1" type="primary" style="margin-left: 30px" @click="getAdd"
+            v-hasPermi="['operation:recommend:add']">新增</el-button>
         </div>
       </div>
     </div>
@@ -156,14 +164,12 @@
       <el-form inline size="mini">
         <el-form-item label="音频类型:">
           <el-select v-model="form.audioType" placeholder="请选择类型" :disabled="disabled">
-            <el-option v-for="item in audioOptions" :key="item.value" :label="item.label"
-              :value="item.value" />
+            <el-option v-for="item in audioOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="资源平台:">
           <el-select v-model="form.platformId" placeholder="请选择平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :label="item.label"
-              :value="item.value" />
+            <el-option v-for="item in platformOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
         <el-form-item label="内容:">
@@ -184,13 +190,11 @@
             <el-image :src="scope.row.audioPic" />
           </template>
         </el-table-column>
-        <el-table-column label="音频类型" prop="audioType" align="center" key="audioType"
-          :formatter="audioFormatter" />
+        <el-table-column label="音频类型" prop="audioType" align="center" key="audioType" :formatter="audioFormatter" />
         <el-table-column label="音频数量" prop="programCount" align="center" key="programCount" />
         <el-table-column label="付费类型" align="center" key="isFree" :formatter="freeFormatter" width="100px" />
         <el-table-column label="当前状态" align="center" key="status" :formatter="statusFormatter" />
-        <el-table-column label="操作" align="center" key="change"
-          v-if="tabIndex === 2 && active === 1 ? false : true">
+        <el-table-column label="操作" align="center" key="change" v-if="tabIndex === 2 && active === 1 ? false : true">
           <template slot-scope="scope">
             <el-button type="text" @click="getSelect(scope.row)">
               选择
@@ -198,7 +202,7 @@
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+      <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
         @pagination="getContentList" />
     </el-dialog>
 
@@ -219,18 +223,15 @@ import {
   upOrDown,
   timeList,
   submitTime,
-  changeTime
+  changeTime,
+  expandSave,
+  removeList
 } from '@/api/operation/recommend'
 import Upload from '@/components/Upload/index'
-import { isFreeMixin, audioMixin, platformMixin, onOrOffMixin } from '@/mixin/index'
+import { isFreeMixin, audioMixin, platformMixin, onOrOffMixin, coverMixin } from '@/mixin/index'
 
 export default {
-  dicts: [
-    'platform_type',
-    'is_custom',
-    'content_model'
-  ],
-  mixins: [isFreeMixin, audioMixin, platformMixin, onOrOffMixin],
+  mixins: [isFreeMixin, audioMixin, platformMixin, onOrOffMixin, coverMixin],
   components: {
     Upload
   },
@@ -270,7 +271,8 @@ export default {
           { top: 2460, height: 295 },
           { top: 2760, height: 600 },
           { top: 3370, height: 260 },
-          { top: 3635, height: 600 }
+          { top: 3635, height: 600 },
+          { top: 4245, height: 215 }
         ],
         '2': [
           { top: 135, height: 165 },
@@ -373,17 +375,26 @@ export default {
       }, {
         value: 6,
         label: 'H5外链'
+      }],
+      contentOptions: [{
+        value: 0,
+        label: '自动推荐内容'
+      }, {
+        value: 1,
+        label: '手动推荐内容'
       }]
     }
   },
   watch: {
     async 'form.audioType'(val) {
-      await this.getPlatform({
-        audioType: val
-      })
-      this.form.platformId = this.platformOptions[0].value
-      this.getContentList()
-    },
+      if (this.tabIndex !== 1 || this.active !== 12) {
+        await this.getPlatform({
+          audioType: val
+        })
+        this.platformId = this.platformOptions[0].value
+        this.getContentList()
+      }
+    }
   },
   mounted() {
     this.getTab()
@@ -492,23 +503,46 @@ export default {
 
     // 内容列表提交
     getSubmit(item) {
-      item.startTime = item.date[0]
-      item.endTime = item.date[1]
-      delete item.date
-      submit(item).then(res => {
-        if (res.code === 0) {
-          this.$message.success('提交成功!')
-          this.getContentDetail(item.moduleId)
-        }
-      })
+      if (this.tabIndex === 2 && this.active === 1) {
+        expandSave(item).then(res => {
+          if (res.code === 0) {
+            this.$message.success('提交成功!')
+            this.getContentDetail(item.moduleId)
+          }
+        })
+      } else {
+        item.startTime = item.date[0]
+        item.endTime = item.date[1]
+        delete item.date
+        submit(item).then(res => {
+          if (res.code === 0) {
+            this.$message.success('提交成功!')
+            this.getContentDetail(item.moduleId)
+          }
+        })
+      }
     },
 
     // 弹窗
-    getDialog(index) {
+    async getDialog(index) {
       this.dialogVisible = true
       this.index = index
-      this.form.audioType = this.list[index].forwardType !== null ? this.typeOptions.find(i => i.value === this.list[index].forwardType).type : 2
-      this.disabled = this.tabIndex == 2 && this.active === 1 || this.list[index].forwardType !== null ? true : false
+      if (this.tabIndex === 1 && this.active === 12) {
+        await this.getAudioType(9)
+        this.audioOptions = this.audioTypeOptions
+        this.platformOptions = [{
+          value: 9,
+          label: '酷狗音乐'
+        }]
+        this.form.platformId = 9
+        this.form.audioType = this.audioOptions[0].value
+      } else {
+        this.form.audioType = this.list[index].forwardType ? this.typeOptions.find(i => i.value === this.list[index].forwardType).type : 2
+        // await this.getPlatform({
+        //   audioType: this.form.audioType
+        // })
+        this.disabled = this.tabIndex == 2 && this.active === 1 || this.list[index].forwardType !== null ? true : false
+      }
       this.getContentList()
     },
 
@@ -525,8 +559,7 @@ export default {
         if (res.code === 0) {
           this.tableData = res.data.records
           this.total = res.data.total
-          this.$refs.tableData.clearSelection()
-          if (this.tableData.length > 0) {
+          if (this.list[this.index].childList && this.list[this.index].childList.length > 0) {
             this.list[this.index].childList.map(i => {
               let row = res.data.records.find(j => j.audioId === i.contentId)
               if (row) {
@@ -595,12 +628,10 @@ export default {
       })
     },
 
-    // 上下架
+    // 上下架内容模块
     handleChange(item, status) {
       let tips = status === 0 ? '上架' : '下架'
       this.$confirm(`是否要${tips}?`, '提醒', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
         upOrDown(item.id, status).then(res => {
@@ -612,6 +643,24 @@ export default {
       }).catch(() => { })
     },
 
+    // 删除内容模块
+    getRemoveList(item, index) {
+      if (item.id) {
+        this.$confirm(`是否要删除${item.title}?`, '提醒', {
+          type: 'warning'
+        }).then(() => {
+          removeList(item.id, 2).then(res => {
+            if (res.code === 0) {
+              this.$message.success(`删除成功!`)
+              this.getContentDetail(item.moduleId)
+            }
+          })
+        }).catch(() => { })
+      } else {
+        this.list.splice(index, 1)
+      }
+    },
+
     // 提交场景电台时间段
     getSubmitTime(item) {
       item.startTime = item.date[0]
@@ -632,22 +681,33 @@ export default {
 
     // 新增时间段
     getAdd() {
-      this.timeList.push({})
+      if (this.tabIndex === 2 && this.active === 1) {
+        this.list.push({
+          moduleId: this.module[this.active].id,
+          childList: []
+        })
+      } else {
+        this.timeList.push({})
+      }
     },
 
-    // 上下架 / 删除 时间段
-    getChangeTime(id, status) {
-      let title = status === 0 ? '下架' : status === 1 ? '上架' : '删除'
-      this.$confirm(`是否${title}?`, '提醒', {
-        type: 'warning'
-      }).then(() => {
-        changeTime(id, status).then(res => {
-          if (res.code === 0) {
-            this.$message.success(`${title}成功!`)
-            this.getTimeList()
-          }
+    // 上下架 / 删除时间段
+    getChangeTime(id, status, index) {
+      if (id) {
+        let title = status === 0 ? '下架' : status === 1 ? '上架' : '删除'
+        this.$confirm(`是否${title}?`, '提醒', {
+          type: 'warning'
+        }).then(() => {
+          changeTime(id, status).then(res => {
+            if (res.code === 0) {
+              this.$message.success(`${title}成功!`)
+              this.getTimeList()
+            }
+          })
         })
-      })
+      } else {
+        this.timeList.splice(index, 1)
+      }
     },
 
     // 字典翻译
@@ -665,7 +725,7 @@ export default {
     // 标题模块
     content() {
       let rules = {
-        '1': [3, 4, 5, 6, 7, 8].includes(this.active),
+        '1': [3, 4, 5, 6, 7, 8, 12].includes(this.active),
         '2': [1, 3].includes(this.active),
         '3': [2, 4, 6, 7, 8, 9].includes(this.active),
         '4': [2, 4, 6, 8, 9, 10, 11].includes(this.active),
@@ -690,7 +750,7 @@ export default {
     // 时间
     time() {
       let rules = {
-        '1': this.active !== 3 && this.active !== 8,
+        '1': ![3, 8].includes(this.active),
         '2': [0, 3].includes(this.active),
         '3': this.active !== 1,
         '4': this.active !== 1 || this.active !== 5,
@@ -741,7 +801,7 @@ export default {
     // 内容
     contentName(item) {
       let rules = {
-        '1': [0, 6, 8, 10].includes(this.active),
+        '1': [0, 6, 8, 10, 12].includes(this.active),
         '3': [2, 3, 5, 6, 9].includes(this.active),
         '4': [7].includes(this.active),
         '5': [5].includes(this.active),
@@ -777,7 +837,7 @@ export default {
     // 图片
     pic(item) {
       let rules = {
-        '1': [1, 2, 6, 8, 10].includes(this.active),
+        '1': [1, 2, 6, 8, 10, 12].includes(this.active),
         '2': [0, 1].includes(this.active),
         '3': [0, 2, 3, 5, 6, 9].includes(this.active),
         '4': [0, 3, 7].includes(this.active),
@@ -798,6 +858,7 @@ export default {
 <style lang="scss" scoped>
 .bg {
   width: 365px;
+
   .el-image__error,
   .el-image__placeholder,
   .el-image__inner {

+ 51 - 9
src/views/operation/startPage/detail.vue

@@ -5,24 +5,22 @@
         <el-input v-model="form.name" placeholder="请输入启动页名称" />
       </el-form-item>
       <el-form-item label="生效期:" prop="date">
-        <el-date-picker v-model="form.date" type="datetimerange" start-placeholder="开始时间"
-          end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss" @change="getchecked" />
+        <el-date-picker v-model="form.date" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间"
+          value-format="yyyy-MM-dd HH:mm:ss" @change="getchecked" />
       </el-form-item>
       <el-form-item label="跳转方式:" prop="forwardType">
         <el-select v-model="form.forwardType" placeholder="请选择跳转方式">
-          <el-option v-for="item in dict.type.nav_address_type" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item label="持续时间:" prop="time">
         <el-select v-model="form.time" placeholder="请选择持续时间">
-          <el-option v-for="item in dict.type.time_of_duration" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
+          <el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item label="能否跳过:" prop="isStep">
         <el-select v-model="form.isStep" placeholder="请选择能否跳过" :disabled="disabled">
-          <el-option v-for="item in dict.type.yes_no_pass" :key="item.value" :label="item.label"
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
             :value="Number(item.value)" />
         </el-select>
       </el-form-item>
@@ -44,7 +42,6 @@
 import Upload from '@/components/Upload/index'
 import { submit, detail, edit, checked } from '@/api/operation/startPage'
 export default {
-  dicts: ['time_of_duration', 'nav_address_type', 'yes_no_pass'],
   components: {
     Upload
   },
@@ -76,7 +73,52 @@ export default {
         pic: [{
           required: true, message: '请上传启动页图片', trigger: 'change'
         }]
-      }
+      },
+      // 跳转类型
+      typeOptions: [{
+        value: 0,
+        label: '指定页面'
+      }, {
+        value: 1,
+        label: '指定URL'
+      }],
+      // 持续时间
+      timeOptions: [{
+        value: 3,
+        label: '3秒'
+      }, {
+        value: 4,
+        label: '4秒'
+      }, {
+        value: 5,
+        label: '5秒'
+      }, {
+        value: 6,
+        label: '6秒'
+      }, {
+        value: 7,
+        label: '7秒'
+      }, {
+        value: 8,
+        label: '8秒'
+      }, {
+        value: 9,
+        label: '9秒'
+      }, {
+        value: 10,
+        label: '10秒'
+      }, {
+        value: 0,
+        label: '手动关闭'
+      }],
+      // 是否允许
+      statusOptions: [{
+        value: 0,
+        label: '允许'
+      }, {
+        value: 1,
+        label: '不允许'
+      }]
     }
   },
   watch: {

+ 19 - 11
src/views/operation/startPage/index.vue

@@ -1,17 +1,15 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in dict.type.on_off_out" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in currentOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="跳转页面:">
         <el-select v-model="form.forwardType" placeholder="请选择跳转页面" clearable>
-          <el-option v-for="item in dict.type.nav_address_type" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -31,7 +29,7 @@
       </el-table-column>
       <el-table-column label="生效期" align="center" show-overflow-tooltip>
         <template slot-scope="scope">
-          <div>{{ scope.row.startTime}} 至 {{ scope.row.endTime }}</div>
+          <div>{{ scope.row.startTime }} 至 {{ scope.row.endTime }}</div>
         </template>
       </el-table-column>
       <el-table-column label="跳转" prop="forwardType" align="center" :formatter="forwardFomatter" />
@@ -39,19 +37,21 @@
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
           <el-button type="text" @click="getDetail(scope.row)" v-hasPermi="['operation:startPage:edit']">编辑</el-button>
-          <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['operation:startPage:delete']">删除</el-button>
+          <el-button type="delete" @click="getDelete(scope.row)"
+            v-hasPermi="['operation:startPage:delete']">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
   </div>
 </template>
 
 <script>
 import { page, remove } from '@/api/operation/startPage'
+import { currentMixin } from '@/mixin/index'
 export default {
-  dicts: ['nav_address_type', 'on_off_out'],
+  mixins: [currentMixin],
   data() {
     return {
       // 遮罩层
@@ -64,6 +64,14 @@ export default {
       // 列表
       tableData: [],
       total: 0,
+      // 跳转类型
+      typeOptions: [{
+        value: 0,
+        label: '指定页面'
+      }, {
+        value: 1,
+        label: '指定URL'
+      }]
     }
   },
   mounted() {
@@ -130,10 +138,10 @@ export default {
 
     // 字典翻译
     forwardFomatter(row) {
-      return this.selectDictLabel(this.dict.type.nav_address_type, row.forwardType)
+      return this.selectDictLabel(this.typeOptions, row.forwardType)
     },
     currentFormatter(row) {
-      return this.selectDictLabel(this.dict.type.on_off_out, row.currentStatus)
+      return this.selectDictLabel(this.currentOptions, row.currentStatus)
     }
   }
 }

+ 26 - 131
src/views/operation/tag/detail.vue

@@ -9,7 +9,8 @@
       </el-form-item>
       <el-form-item label="频道属性:" prop="channelType">
         <el-select v-model="form.channelType" placeholder="请选择频道属性" @change="handleChange">
-          <el-option v-for="item in typeOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <el-option v-for="item in channelTypeOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="频道名称:" prop="channelName">
@@ -34,8 +35,8 @@
               <el-image :src="scope.row.audioPic" />
             </template>
           </el-table-column>
-          <el-table-column label="音频类型" prop="audioType" align="center" :formatter="typeFormatter" />
-          <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+          <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
+          <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
           <el-table-column label="操作" align="center">
             <template slot-scope="scope">
               <el-button type="delete" @click="getDelete(scope.row.audioId)">删除</el-button>
@@ -50,83 +51,34 @@
     </div>
 
     <!-- 弹窗 -->
-    <el-dialog :visible.sync="dialogVisible" title="关联内容" width="1000px">
-      <el-form inline size="mini" style="width:100%">
-        <el-form-item label="资源平台:">
-          <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="音频名称:">
-          <el-input v-model="dialogForm.name" placeholder="请输入音频名称" />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
-          <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        </el-form-item>
-      </el-form>
-      <el-table :data="dialogTableData" ref="dialogTableData" :row-key="getRowKey"
-        @selection-change="getChange" v-loading="loading">
-        <el-table-column type="selection" align="center" :reserve-selection="true" />
-        <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
-        <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
-        <el-table-column label="音频封面" align="center" width="100px">
-          <template slot-scope="scope">
-            <el-image :src="scope.row.audioPic" />
-          </template>
-        </el-table-column>
-        <el-table-column label="音频类型" prop="audioType" align="center" :formatter="typeFormatter" />
-        <el-table-column label="节目数量" prop="programCount" align="center" />
-        <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
-      </el-table>
-      <div slot="footer">
-        <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
-          :limit.sync="dialogForm.pageSize" @pagination="getList" />
-      </div>
-    </el-dialog>
+    <Dialog :visible="dialogVisible" :data="form.listagCategoryAudio" :channelType="form.channelType"
+      @close="close" />
   </div>
 </template>
 
 <script>
+import Dialog from '@/components/Dialog/index.vue'
 import Upload from '@/components/Upload/index.vue'
-import { contentList, submitThree, detail } from '@/api/operation/tag'
-import { platformMixin, isFreeMixin, onOrOffMixin } from '@/mixin/index'
+import { submitThree, detail } from '@/api/operation/tag'
+import { platformMixin, isFreeMixin, audioMixin } from '@/mixin/index'
 export default {
   components: {
-    Upload
+    Upload, Dialog
   },
-  mixins: [platformMixin, isFreeMixin, onOrOffMixin],
+  mixins: [platformMixin, isFreeMixin, audioMixin],
   data() {
     return {
-      // 遮罩层
-      loading: false,
       // 表单
       form: {
         listagCategoryAudio: []
       },
-      // 频道属性
-      typeOptions: [{
-        value: 2,
-        label: '广播'
-      }, {
-        value: 6,
-        label: '节目'
-      }, {
-        value: 8,
-        label: '专辑'
-      }],
+      channelTypeOptions: [
+        { value: 2, label: '广播' },
+        { value: 6, label: '节目' },
+        { value: 8, label: '专辑' }
+      ],
       // 弹窗
       dialogVisible: false,
-      // 弹窗表单
-      dialogForm: {
-        pageNum: 1,
-        pageSize: 10
-      },
-      // 总数
-      total: 0,
-      // 弹窗列表
-      dialogTableData: [],
       // 校验
       rules: {
         name: [{
@@ -152,16 +104,6 @@ export default {
       disabled: false
     }
   },
-  watch: {
-    'form.channelType'(val) {
-      if (val) {
-        this.dialogForm.type = val
-        this.getPlatform({
-          audioType: val
-        })
-      }
-    }
-  },
   mounted() {
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id
@@ -171,6 +113,7 @@ export default {
     if (this.$route.query.pid) {
       this.form.pid = this.$route.query.pid
     }
+    this.getPlatform({})
   },
   methods: {
     // 详情
@@ -195,59 +138,11 @@ export default {
     // 弹窗
     getDialog() {
       this.dialogVisible = true
-      this.getList()
-    },
-
-    // 列表
-    getList() {
-      this.loading = true
-      contentList(this.dialogForm).then(res => {
-        if (res.code === 0) {
-          this.dialogTableData = res.data.records
-          this.total = res.data.total
-          this.loading = false
-          if (this.form.listagCategoryAudio.length > 0) {
-            this.form.listagCategoryAudio.map(i => {
-              let row = this.dialogTableData.find(j => j.audioId === i.audioId)
-              if (row) {
-                this.$refs.dialogTableData.toggleRowSelection(row, true)
-              }
-            })
-          } else {
-            this.$refs.dialogTableData.clearSelection()
-          }
-        }
-      })
     },
 
-    // 搜索
-    getSearch() {
-      this.dialogForm.pageNum = 1
-      this.getList()
-    },
-
-    // 重置
-    getRefresh() {
-      this.dialogForm.pageNum = 1
-      this.dialogForm.pageSize = 10
-      this.dialogForm.platformId = this.dialogForm.name = ''
-      this.getList()
-    },
-
-    getRowKey(row) {
-      return row.audioId
-    },
-
-    // 选择
-    getChange(row) {
-      this.form.ids = []
-      if (row.length > 0) {
-        row.map(i => {
-          if (this.form.listagCategoryAudio.findIndex(j => j.audioId === i.audioId) === -1) {
-            this.form.listagCategoryAudio.push(i)
-          }
-        })
-      }
+    // 关闭弹窗
+    close() {
+      this.dialogVisible = false
     },
 
     // 删除
@@ -286,15 +181,15 @@ export default {
     },
 
     // 字典翻译
-    freeFormatter(row) {
-      return this.selectDictLabel(this.freeOptions, row.isFree)
-    },
-    typeFormatter(row) {
-      return this.selectDictLabel(this.typeOptions, row.audioType)
+    audioTypeFormatter(row) {
+      return this.selectDictLabel(this.audioOptions, row.audioType)
     },
     statusFormatter(row) {
       return this.selectDictLabel(this.onOrOffOptions, row.status)
-    }
+    },
+    platfromFormatter(row) {
+      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+    },
   }
 }
 </script>

+ 3 - 2
src/views/operation/waken/detail.vue

@@ -71,8 +71,8 @@
       </el-form>
       <el-table :data="tableData" ref="table" :row-key="getRowKey" @selection-change="getChange">
         <el-table-column type="selection" align="center" :reserve-selection="true" />
-        <el-table-column label="音频ID" align="center" prop="audioId" />
-        <el-table-column label="音频名称" align="center" prop="audioName" />
+        <el-table-column label="音频ID" align="center" prop="audioId" show-overflow-tooltip />
+        <el-table-column label="音频名称" align="center" prop="audioName" show-overflow-tooltip />
         <el-table-column label="音频封面" align="center" width="100px">
           <template slot-scope="scope">
             <el-image :src="scope.row.audioPic" />
@@ -183,6 +183,7 @@ export default {
   },
   mounted() {
     this.getDevices()
+    this.getPlatform({})
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id
     }

+ 22 - 9
src/views/project/list/detail.vue

@@ -22,8 +22,7 @@
           </el-table-column>
           <el-table-column prop="os" label="系统类型" align="center" width="100px" />
           <el-table-column prop="updateTimeText" label="更新时间" align="center" />
-          <el-table-column prop="status" label="当前状态" align="center" :formatter="statusFormatter"
-            width="100px" />
+          <el-table-column prop="status" label="当前状态" align="center" :formatter="statusFormatter" width="100px" />
           <el-table-column label="操作" align="center">
             <template slot-scope="scope">
               <el-button v-if="scope.row.status === 0" type="text" @click="getShelves(scope.row, 1)">上架
@@ -42,7 +41,7 @@
             </template>
           </el-table-column>
         </el-table>
-        <pagination v-show="total>0" :total="total" :page.sync="versionForm.pageNum"
+        <pagination v-show="total > 0" :total="total" :page.sync="versionForm.pageNum"
           :limit.sync="versionForm.pageSize" @pagination="getList" />
       </el-form-item>
     </el-form>
@@ -59,8 +58,7 @@
         </el-form-item>
         <el-form-item v-if="title === '新增'" label="系统类型:">
           <el-select v-model="addForm.os" placeholder="请选择系统类型">
-            <el-option v-for="item in dict.type.phone_sys_type" :key="item.value" :label="item.label"
-              :value="item.value" />
+            <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
         <el-form-item v-if="title !== '更新'" label="应用Logo:">
@@ -103,7 +101,7 @@
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="historyTotal>0" :total="historyTotal" :page.sync="historyForm.pageNum"
+      <pagination v-show="historyTotal > 0" :total="historyTotal" :page.sync="historyForm.pageNum"
         :limit.sync="historyForm.pageSize" @pagination="getHistoryPage" />
     </el-dialog>
   </div>
@@ -114,7 +112,6 @@ import { add, edit, update, appEdit, updateAdd, updatePage, historyPage, shelves
 import Upload from "@/components/Upload/index";
 import Editor from "@/components/Editor";
 export default {
-  dicts: ["phone_sys_type", "app_status_type"],
   components: {
     Upload,
     Editor,
@@ -147,7 +144,23 @@ export default {
       dialogVisible: false,
       title: "",
       // 历史记录弹窗
-      dialogVisible_history: false
+      dialogVisible_history: false,
+      // 手机系统
+      typeOptions: [{
+        value: 'IOS',
+        label: 'IOS'
+      }, {
+        value: 'Android',
+        label: 'Android'
+      }],
+      // 当前状态
+      statusOptions: [{
+        value: 0,
+        lable: '未发布'
+      }, {
+        value: 1,
+        label: '已发布'
+      }]
     };
   },
   mounted() {
@@ -305,7 +318,7 @@ export default {
 
     // 字典翻译
     statusFormatter(row) {
-      return this.selectDictLabel(this.dict.type.app_status_type, row.status);
+      return this.selectDictLabel(this.statusOptions, row.status);
     },
   },
 };

+ 1 - 1
src/views/project/list/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="项目名称:">
         <el-input v-model="form.name" placeholder="请输入项目名称" />
       </el-form-item>

+ 1 - 1
src/views/push/message/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="消息类型:">
         <el-select v-model="form.messageType" placeholder="请选择消息类型" clearable>
           <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />

+ 19 - 2
src/views/service/code/index.vue

@@ -1,7 +1,16 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="auto" size="mini">
+    <el-form inline size="mini">
+      <el-form-item label="批次号:">
+        <el-input v-model="form.no" placeholder="请输入批次号" />
+      </el-form-item>
+      <el-form-item label="服务时长:">
+        <el-select v-model="form.serviceTime" placeholder="请选择服务时长">
+          <el-option v-for="item in serviceTimeOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="创建时间:">
         <el-date-picker v-model="date" type="datetimerange" start-placeholder="开始时间" end-placeholder="结束时间"
           value-format="yyyy-MM-dd HH:mm:ss" clearable />
@@ -9,13 +18,16 @@
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <el-button type="primary" plain icon="el-icon-plus" @click="dialogVisible = true" v-hasPermi="['service:code:add']">新增</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" @click="dialogVisible = true"
+          v-hasPermi="['service:code:add']">新增</el-button>
       </el-form-item>
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
       <el-table-column label="序号" type="index" align="center" />
       <el-table-column label="兑换数量" prop="num" align="center" />
+      <el-table-column label="批次号" prop="no" align="center" />
+      <el-table-column label="服务时长" prop="serviceTime" align="center" :formatter="serviceFormatter" />
       <el-table-column label="创建时间" prop="createTime" align="center" />
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
@@ -149,6 +161,11 @@ export default {
       this.download(url, {
         no: id
       }, `${id}.${type}`)
+    },
+
+    // 字典翻译
+    serviceFormatter(row) {
+      return this.selectDictLabel(this.serviceTimeOptions, row.serviceTime)
     }
   }
 }

+ 0 - 73
src/views/service/flowPackage/detail.vue

@@ -1,73 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" :rules="rules" ref="form" label-width="100px">
-      <el-form-item label="关联设备:">
-        <el-select v-model="deviceIds" multiple placeholder="请选择关联设备">
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label"
-            :value="item.value.toString()" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="流量名称:">
-        <el-input v-model="form.name" placeholder="请输入套餐名称" />
-      </el-form-item>
-      <el-form-item label="服务类型:">
-        <el-select v-model="form.businessType" placeholder="请选择服务类型" :disabled="form.id ? true : false">
-          <el-option v-for="item in businessOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="流量套餐:">
-        <el-select v-model="form.goodsId" placeholder="请选择流量套餐" :disabled="form.id ? true : false">
-          <el-option v-for="(item, index) in goodsOptions" :key="index" :label="item" :value="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="原价:" prop="price">
-        <el-input v-model="form.price" placeholder="请输入原价" />
-      </el-form-item>
-      <el-form-item label="活动价:" prop="discount">
-        <el-input v-model="form.discount" placeholder="请输入活动价" />
-      </el-form-item>
-      <el-form-item label="是否推荐:">
-        <el-select v-model="form.isRecommend">
-          <el-option v-for="item in recommendOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="排序:" v-if="form.businessType === 5">
-        <el-input-number v-model="form.sort" :min="1" />
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="cancel">取消</el-button>
-        <el-button type="primary" @click="getSubmit">提交</el-button>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import { devMixin } from '@/mixin/index'
-import { mixin, detailMixin, goodsMixin } from '../mixin/index'
-export default {
-  mixins: [devMixin, mixin, detailMixin, goodsMixin],
-  data() {
-    return {
-      // 表单
-      form: {
-        type: 12
-      },
-    }
-  },
-  methods: {
-    // 取消
-    cancel() {
-      this.$tab.closeOpenPage("/service/flowPackage");
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-form {
-  width: 500px;
-}
-</style>

+ 0 - 102
src/views/service/flowPackage/index.vue

@@ -1,102 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 搜索 -->
-    <el-form inline size="mini">
-      <el-form-item label="流量名称:">
-        <el-input v-model="form.name" placeholder="请输入套餐名称" clearable />
-      </el-form-item>
-      <el-form-item label="流量套餐:">
-        <el-select v-model="form.goodsId" placeholder="请选择流量套餐" clearable>
-          <el-option v-for="(item, index) in goodsOptions" :key="index" :label="item" :value="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="关联设备:">
-        <el-select v-model="form.deviceIds" placeholder="请选择关联设备" clearable>
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="当前状态:">
-        <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
-        <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
-          v-hasPermi="['service:flowPackage:add']">新增</el-button>
-      </el-form-item>
-    </el-form>
-    <!-- 列表 -->
-    <el-table :data="tableData" v-loading="loading" :default-sort="{prop: 'sort'}">
-      <el-table-column label="排序" align="center" prop="sort" :formatter="sortFormatter" />
-      <el-table-column label="流量名称" align="center" prop="name" show-overflow-tooltip />
-      <el-table-column label="关联设备" align="center" prop="deviceIds" :formatter="devFormatter"
-        show-overflow-tooltip />
-      <el-table-column label="原价/元" align="center" prop="price" />
-      <el-table-column label="活动价/元" align="center" prop="discount" />
-      <el-table-column label="流量套餐" align="center" prop="intro" show-overflow-tooltip />
-      <el-table-column label="当前状态" align="center" prop="status" :formatter="statusFormatter" />
-      <el-table-column label="是否推荐" align="center" prop="isRecommend" :formatter="recommendFormatter" />
-      <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center">
-        <template slot-scope="scope">
-          <span v-if="scope.row.status === 1">
-            <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['service:flowPackage:edit']">
-              编辑
-            </el-button>
-            <el-button type="text" @click="getChange(scope.row)" v-hasPermi="['service:flowPackage:down']">
-              下架
-            </el-button>
-          </span>
-          <el-button v-else type="delete" @click="getDelete(scope.row)"
-            v-hasPermi="['service:flowPackage:delete']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
-      @pagination="getList" />
-  </div>
-</template>
-
-<script>
-import { devMixin } from '@/mixin/index'
-import { mixin, indexMixin, goodsMixin } from '../mixin/index'
-export default {
-  mixins: [devMixin, mixin, goodsMixin, indexMixin],
-  data() {
-    return {
-      // 表单
-      form: {
-        pageNum: 1,
-        pageSize: 10,
-        type: 12
-      },
-    }
-  },
-  methods: {
-    // 重置
-    getRefresh() {
-      this.form = {
-        pageNum: 1,
-        pageSize: 10,
-        type: 12
-      }
-      this.getList()
-    },
-
-    // 新增 / 编辑
-    getDetail(id) {
-      this.$router.push({
-        path: `/service/flowPackage/detail`,
-        query: {
-          id: id
-        }
-      })
-    },
-    
-
-  }
-}
-</script>

+ 0 - 277
src/views/service/mixin/index.js

@@ -1,277 +0,0 @@
-const mixin = {
-  data() {
-    return {
-      // 是否推荐
-      recommendOptions: [{
-        value: 0,
-        label: '是'
-      }, {
-        value: 1,
-        label: '否'
-      }],
-      // 当前状态
-      statusOptions: [{
-        value: 1,
-        label: '上架'
-      }, {
-        value: 4,
-        label: '下架'
-      }]
-    }
-  }
-}
-
-const flowPackageMixin = {
-  data() {
-    return {
-      // 运营商
-      operatorOptions: [{
-        value: 0,
-        label: '移动'
-      }, {
-        value: 1,
-        label: '联通'
-      }, {
-        value: 2,
-        label: '双网双号'
-      }]
-    }
-  }
-}
-
-const musicPackageMixin = {
-  data() {
-    return {
-      // 资源平台
-      platformOptions: [{
-        value: 1,
-        label: 'QQ音乐'
-      }]
-    }
-  }
-}
-
-import {
-  goodsList
-} from '@/api/service/musicPackage'
-const goodsMixin = {
-  data() {
-    return {
-      // 流量套餐
-      goodsOptions: []
-    }
-  },
-  mounted() {
-    goodsList().then(res => {
-      if (res.code === 0) {
-        this.goodsOptions = res.data
-      }
-    })
-  },
-}
-
-import {
-  list,
-  remove,
-  shelve
-} from '@/api/service/musicPackage'
-const indexMixin = {
-  data() {
-    return {
-      // 遮罩层
-      loading: false,
-      // 列表
-      tableData: [],
-      total: 0
-    }
-  },
-  mounted() {
-    this.getList()
-  },
-  methods: {
-    // 列表
-    getList() {
-      this.loading = true
-      list(this.form).then(res => {
-        if (res.code === 0) {
-          this.tableData = res.data.records
-          this.total = res.data.total
-          this.loading = false
-        }
-      })
-    },
-
-    // 搜索
-    getSearch() {
-      this.form.pageNum = 1
-      this.getList()
-    },
-
-    // 删除
-    getDelete(row) {
-      this.$confirm(`是否删除${row.name}?`, '提示', {
-        'confirmButtonText': '确定',
-        'cancelButtonText': '取消',
-        type: 'warning'
-      }).then(() => {
-        remove(row.id).then(res => {
-          if (res.code === 0) {
-            this.$message.success('删除成功!')
-            this.getList()
-          }
-        })
-      }).catch(() => {})
-    },
-
-    // 下架
-    getChange(row) {
-      this.$confirm(`是否下架${row.name}?`, '提示', {
-        'confirmButtonText': '确定',
-        'cancelButtonText': '取消',
-        type: 'warning'
-      }).then(() => {
-        shelve(row.id).then(res => {
-          if (res.code === 0) {
-            this.$message.success('下架成功!')
-            this.getList()
-          }
-        })
-      }).catch(() => {})
-    },
-
-    // 当前状态
-    statusFormatter(row) {
-      return this.selectDictLabel(this.statusOptions, row.status)
-    },
-    // 是否推荐
-    recommendFormatter(row) {
-      return this.selectDictLabel(this.recommendOptions, row.isRecommend)
-    },
-    // 关联设备
-    devFormatter(row) {
-      return row.deviceIds ? row.deviceIds.split(',').map(i => this.selectDictLabel(this.devOptions, i)).join(',') : ''
-    },
-
-    // 字典翻译
-    sortFormatter(row) {
-      return row.businessType === 5 ? row.sort : '/'
-    }
-  },
-}
-
-import {
-  detail,
-  edit,
-  create
-} from '@/api/service/musicPackage'
-const detailMixin = {
-  data() {
-    let checkedPrice = (rule, value, callback) => {
-      if (Number(value) > 500) {
-        callback(new Error('原价不得超过500'))
-      } else {
-        if (this.form.discount !== undefined) {
-          this.$refs.form.validateField('discount')
-        }
-        callback()
-      }
-    }
-    let checkedDiscount = (rule, value, callback) => {
-      if (Number(value) > Number(this.form.price)) {
-        callback(new Error('活动价不得大于原价!'))
-      } else {
-        callback()
-      }
-    }
-    return {
-      // 关联设备
-      deviceIds: [],
-      // 校验
-      rules: {
-        price: [{
-          validator: checkedPrice,
-          trigger: 'blur'
-        }],
-        discount: [{
-          validator: checkedDiscount,
-          trigger: 'blur'
-        }]
-      },
-      // 服务类型
-      businessOptions: [{
-        value: 0,
-        label: '签到'
-      }, {
-        value: 1,
-        label: '收听奖励'
-      }, {
-        value: 2,
-        label: '积分抽奖'
-      }, {
-        value: 3,
-        label: '打开手机通知'
-      }, {
-        value: 4,
-        label: '积分兑换'
-      }, {
-        value: 5,
-        label: '服务中心'
-      }]
-    }
-  },
-  watch: {
-    deviceIds(val) {
-      this.form.deviceIds = val.join(',')
-    }
-  },
-  mounted() {
-    if (this.$route.query.id) {
-      this.form.id = this.$route.query.id
-      this.getList()
-    }
-  },
-  methods: {
-    // 详情
-    getList() {
-      detail(this.form.id).then(res => {
-        if (res.code === 0) {
-          this.form = res.data
-          this.deviceIds = res.data.deviceIds.split(',')
-        }
-      })
-    },
-    // 提交
-    getSubmit() {
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          if (this.form.id) {
-            edit(this.form).then(res => {
-              if (res.code === 0) {
-                this.$message.success('修改成功!')
-                this.cancel()
-              }
-            })
-          } else {
-            create(this.form).then(res => {
-              if (res.code === 0) {
-                this.$message.success('新增成功!')
-                this.cancel()
-              }
-            })
-          }
-        } else {
-          return false
-        }
-      })
-    }
-  }
-}
-
-export {
-  mixin,
-  flowPackageMixin,
-  musicPackageMixin,
-  indexMixin,
-  detailMixin,
-  goodsMixin
-}

+ 0 - 80
src/views/service/musicPackage/detail.vue

@@ -1,80 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="form" :rules="rules" ref="form" label-width="100px">
-      <el-form-item label="关联设备:">
-        <el-select v-model="deviceIds" multiple placeholder="请选择关联设备">
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label"
-            :value="item.value.toString()" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="套餐名称:">
-        <el-input v-model="form.name" placeholder="请输入套餐名称" />
-      </el-form-item>
-      <el-form-item label="服务类型:">
-        <el-select v-model="form.businessType" placeholder="请选择服务类型">
-          <el-option v-for="item in businessOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="资源平台:">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
-          <el-option v-for="item in platformOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="原价:" prop="price">
-        <el-input v-model="form.price" placeholder="请输入原价" />
-      </el-form-item>
-      <el-form-item label="活动价:" prop="discount">
-        <el-input v-model="form.discount" placeholder="请输入活动价" />
-      </el-form-item>
-      <el-form-item label="服务时长:">
-        <el-select v-model="form.indate" placeholder="请选择服务时长">
-          <el-option v-for="item in serviceTimeOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="是否推荐:">
-        <el-select v-model="form.isRecommend">
-          <el-option v-for="item in recommendOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="排序:" v-if="form.businessType === 5">
-        <el-input-number v-model="form.sort" :min="1" />
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="cancel">取消</el-button>
-        <el-button type="primary" @click="getSubmit">提交</el-button>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script>
-import { devMixin, serviceTimeMixin } from '@/mixin/index'
-import { mixin, musicPackageMixin, detailMixin } from '../mixin/index'
-export default {
-  mixins: [devMixin, serviceTimeMixin, mixin, musicPackageMixin, detailMixin],
-  data() {
-    return {
-      // 表单
-      form: {
-        type: 13
-      }
-    }
-  },
-  methods: {
-    // 取消
-    cancel() {
-      this.$tab.closeOpenPage("/service/musicPackage");
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.el-form {
-  width: 500px;
-}
-</style>

+ 0 - 114
src/views/service/musicPackage/index.vue

@@ -1,114 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 搜索 -->
-    <el-form inline size="mini">
-      <el-form-item label="套餐名称:">
-        <el-input v-model="form.name" placeholder="请输入套餐名称" clearable />
-      </el-form-item>
-      <el-form-item label="资源平台:">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台" clearable>
-          <el-option v-for="item in platformOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="关联设备:">
-        <el-select v-model="form.deviceIds" placeholder="请选择关联设备" clearable>
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="当前状态:">
-        <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
-        <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
-          v-hasPermi="['service:musicPackage:add']">新增</el-button>
-      </el-form-item>
-    </el-form>
-    <!-- 列表 -->
-    <el-table :data="tableData" v-loading="loading" :default-sort="{prop: 'sort'}">
-      <el-table-column label="排序" align="center" prop="sort" :formatter="sortFormatter" />
-      <el-table-column label="套餐名称" align="center" prop="name" show-overflow-tooltip />
-      <el-table-column label="关联设备" align="center" prop="deviceIds" :formatter="devFormatter"
-        show-overflow-tooltip />
-      <el-table-column label="原价/元" align="center" prop="price" />
-      <el-table-column label="活动价/元" align="center" prop="discount" />
-      <el-table-column label="有效期" align="center" prop="indate" :formatter="timeFormatter" />
-      <el-table-column label="资源平台" align="center" prop="platformId" :formatter="platformFormatter" />
-      <el-table-column label="当前状态" align="center" prop="status" :formatter="statusFormatter" />
-      <el-table-column label="是否推荐" align="center" prop="isRecommend" :formatter="recommendFormatter" />
-      <el-table-column label="创建时间" align="center" prop="createTime" />
-      <el-table-column label="操作" align="center">
-        <template slot-scope="scope">
-          <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['service:musicPackage:edit']">
-            编辑
-          </el-button>
-          <el-button v-if="scope.row.status === 1" type="text" @click="getChange(scope.row)"
-            v-hasPermi="['service:musicPackage:down']">下架</el-button>
-          <el-button v-else type="delete" @click="getDelete(scope.row)"
-            v-hasPermi="['service:musicPackage:delete']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
-      @pagination="getList" />
-  </div>
-</template>
-
-<script>
-import { devMixin, serviceTimeMixin } from '@/mixin/index'
-import { mixin, musicPackageMixin, indexMixin } from '../mixin/index'
-export default {
-  mixins: [devMixin, mixin, serviceTimeMixin, musicPackageMixin, indexMixin],
-  data() {
-    return {
-      // 遮罩层
-      loading: false,
-      // 表单
-      form: {
-        pageNum: 1,
-        pageSize: 10,
-        type: 13
-      },
-      // 列表
-      tableData: [],
-      total: 0
-    }
-  },
-  methods: {
-    // 重置
-    getRefresh() {
-      this.form = {
-        pageNum: 1,
-        pageSize: 10,
-        type: 13
-      }
-      this.getList()
-    },
-
-    // 新增 / 编辑
-    getDetail(id) {
-      this.$router.push({
-        path: `/service/musicPackage/detail`,
-        query: {
-          id: id
-        }
-      })
-    },
-
-    // 字典翻译
-    // 资源平台
-    platformFormatter(row) {
-      return this.selectDictLabel(this.platformOptions, row.platformId)
-    },
-    // 有效期
-    timeFormatter(row) {
-      return this.selectDictLabel(this.serviceTimeOptions, row.indate)
-    }
-  }
-}
-</script>

+ 186 - 0
src/views/service/package/detail.vue

@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+      <el-form-item label="关联设备:">
+        <el-select v-model="deviceIds" multiple placeholder="请选择关联设备">
+          <el-option v-for="item in devOptions" :key="item.value" :label="item.label"
+            :value="item.value.toString()" />
+        </el-select>
+      </el-form-item>
+      <el-form-item :label="form.type == 13 ? '套餐名称:': '流量名称:'">
+        <el-input v-model="form.name" placeholder="请输入套餐名称" />
+      </el-form-item>
+      <el-form-item label="服务类型:">
+        <el-select v-model="form.businessType" placeholder="请选择服务类型"
+          :disabled="form.id && form.type == 12 ? true : false">
+          <el-option v-for="item in serviceTypeOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="form.type == 13" label="资源平台:">
+        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+          <el-option v-for="item in platformOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-else label="流量套餐:">
+        <el-select v-model="form.goodsId" placeholder="请选择流量套餐" :disabled="form.id ? true : false">
+          <el-option v-for="(item, index) in goodsOptions" :key="index" :label="item" :value="index" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="原价:" prop="price">
+        <el-input-number v-model="form.price" :min="0" :max="500" :controls="false" :precision="2"
+          placeholder="请输入原价" />
+      </el-form-item>
+      <el-form-item label="活动价:" prop="discount">
+        <el-input-number v-model="form.discount" :min="0" :max="500" :controls="false" :precision="2"
+          placeholder="请输入活动价" />
+      </el-form-item>
+      <el-form-item label="服务时长:">
+        <el-select v-model="form.indate" placeholder="请选择服务时长">
+          <el-option v-for="item in serviceTimeOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否推荐:">
+        <el-select v-model="form.isRecommend" placeholder="请选择是否推荐">
+          <el-option v-for="item in recommendOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="排序:" v-if="form.businessType === 5">
+        <el-input-number v-model="form.sort" :min="1" />
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="cancel">取消</el-button>
+        <el-button type="primary" @click="getSubmit">提交</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { devMixin, serviceTimeMixin, serviceTypeMixin } from '@/mixin/index'
+import { detail, edit, create, goodsList } from '@/api/service/package'
+export default {
+  mixins: [devMixin, serviceTimeMixin, serviceTypeMixin],
+  data() {
+    let checkedPrice = (rule, value, callback) => {
+      if (Number(value) > 500) {
+        callback(new Error('原价不得超过500'))
+      } else {
+        if (this.form.discount !== undefined) {
+          this.$refs.form.validateField('discount')
+        }
+        callback()
+      }
+    }
+    let checkedDiscount = (rule, value, callback) => {
+      if (Number(value) > Number(this.form.price)) {
+        callback(new Error('活动价不得大于原价!'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      // 表单
+      form: {
+        type: this.$route.query.type
+      },
+      // 流量套餐
+      goodsOptions: [],
+      // 关联设备
+      deviceIds: [],
+      // 资源平台
+      platformOptions: [{
+        value: 1,
+        label: 'QQ音乐'
+      }],
+      // 是否推荐
+      recommendOptions: [{
+        value: 0,
+        label: '是'
+      }, {
+        value: 1,
+        label: '否'
+      }],
+      // 校验
+      rules: {
+        price: [{
+          validator: checkedPrice,
+          trigger: 'blur'
+        }],
+        discount: [{
+          validator: checkedDiscount,
+          trigger: 'blur'
+        }]
+      }
+    }
+  },
+  watch: {
+    deviceIds(val) {
+      this.form.deviceIds = val.join(',')
+    }
+  },
+  mounted() {
+    if (this.form.type == 12) {
+      // 流量套餐
+      goodsList().then(res => {
+        if (res.code === 0) {
+          this.goodsOptions = res.data
+        }
+      })
+    }
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id
+      this.getList()
+    }
+  },
+  methods: {
+    // 详情
+    getList() {
+      detail(this.form.id).then(res => {
+        if (res.code === 0) {
+          this.form = res.data
+          this.deviceIds = res.data.deviceIds.split(',')
+        }
+      })
+    },
+    // 提交
+    getSubmit() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          if (this.form.id) {
+            edit(this.form).then(res => {
+              if (res.code === 0) {
+                this.$message.success('修改成功!')
+                this.cancel()
+              }
+            })
+          } else {
+            create(this.form).then(res => {
+              if (res.code === 0) {
+                this.$message.success('新增成功!')
+                this.cancel()
+              }
+            })
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    // 取消
+    cancel() {
+      let url = this.form.type == 13 ? 'musicPackage' : 'flowPackage'
+      this.$tab.closeOpenPage(`/service/${url}?type=${this.form.type}`);
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-form {
+  width: 500px;
+}
+</style>

+ 224 - 0
src/views/service/package/index.vue

@@ -0,0 +1,224 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索 -->
+    <el-form inline size="mini">
+      <el-form-item :label="form.type == 13 ? '套餐名称:' : '流量名称:'">
+        <el-input v-model="form.name" placeholder="请输入套餐名称" clearable />
+      </el-form-item>
+      <el-form-item v-if="form.type == 13" label="资源平台:">
+        <el-select v-model="form.platformId" placeholder="请选择资源平台" clearable>
+          <el-option v-for="item in platformOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-else label="流量套餐:">
+        <el-select v-model="form.goodsId" placeholder="请选择流量套餐" clearable>
+          <el-option v-for="(item, index) in goodsOptions" :key="index" :label="item" :value="index" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联设备:">
+        <el-select v-model="form.deviceIds" placeholder="请选择关联设备" clearable>
+          <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="当前状态:">
+        <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
+            :value="item.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
+          v-hasPermi="['service:package:add']">新增</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading" :default-sort="{prop: 'sort'}">
+      <el-table-column label="排序" align="center" prop="sort" key="sort" :formatter="sortFormatter" />
+      <el-table-column :label="form.type == 13 ? '套餐名称' : '流量套餐'" align="center" prop="name" key="name"
+        show-overflow-tooltip />
+      <el-table-column label="关联设备" align="center" prop="deviceIds" key="deviceIds" :formatter="devFormatter"
+        show-overflow-tooltip />
+      <el-table-column label="原价/元" align="center" prop="price" key="price" />
+      <el-table-column label="活动价/元" align="center" prop="discount" key="discount" />
+      <el-table-column v-if="form.type == 12" label="流量套餐" align="center" prop="intro" key="intro"
+        show-overflow-tooltip />
+      <el-table-column v-if="form.type == 13" label="有效期" align="center" prop="indate" key="indate"
+        :formatter="timeFormatter" />
+      <el-table-column v-if="form.type == 13" label="资源平台" align="center" prop="platformId" key="platformId"
+        :formatter="platformFormatter" />
+      <el-table-column label="当前状态" align="center" prop="status" key="status" :formatter="statusFormatter" />
+      <el-table-column label="是否推荐" align="center" prop="isRecommend" key="isRecommend"
+        :formatter="recommendFormatter" />
+      <el-table-column label="创建时间" align="center" prop="createTime" key="createTime" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['service:package:edit']">
+            编辑
+          </el-button>
+          <el-button v-if="scope.row.status === 1" type="text" @click="getChange(scope.row)"
+            v-hasPermi="['service:package:down']">下架</el-button>
+          <el-button v-else type="delete" @click="getDelete(scope.row)"
+            v-hasPermi="['service:package:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total>0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+      @pagination="getList" />
+  </div>
+</template>
+
+<script>
+import { list, remove, shelve, goodsList } from '@/api/service/package'
+import { devMixin, serviceTimeMixin } from '@/mixin/index'
+export default {
+  mixins: [devMixin, serviceTimeMixin],
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10,
+        type: this.$route.query.type
+      },
+      // 列表
+      tableData: [],
+      // 总数据
+      total: 0,
+      // 是否推荐
+      recommendOptions: [{
+        value: 0,
+        label: '是'
+      }, {
+        value: 1,
+        label: '否'
+      }],
+      // 当前状态
+      statusOptions: [{
+        value: 1,
+        label: '上架'
+      }, {
+        value: 4,
+        label: '下架'
+      }],
+      // 资源平台
+      platformOptions: [{
+        value: 1,
+        label: 'QQ音乐'
+      }],
+      // 流量套餐
+      goodsOptions: []
+    }
+  },
+  mounted() {
+    this.getList()
+    if (this.form.type == 12) {
+      // 流量套餐
+      goodsList().then(res => {
+        if (res.code === 0) {
+          this.goodsOptions = res.data
+        }
+      })
+    }
+  },
+  methods: {
+    // 列表
+    getList() {
+      this.loading = true
+      list(this.form).then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data.records
+          this.total = res.data.total
+          this.loading = false
+        }
+      })
+    },
+
+    // 搜索
+    getSearch() {
+      this.form.pageNum = 1
+      this.getList()
+    },
+
+    // 重置
+    getRefresh() {
+      this.form = {
+        pageNum: 1,
+        pageSize: 10,
+        type: this.$route.query.type
+      }
+      this.getList()
+    },
+
+    // 新增 / 编辑
+    getDetail(id) {
+      this.$router.push({
+        path: `/service/package/detail`,
+        query: {
+          id: id,
+          type: this.form.type
+        }
+      })
+      this.$route.meta.activeMenu = this.form.type == 13 ? '/service/musicPackage' : '/service/flowPackage'
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        remove(row.id).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      }).catch(() => { })
+    },
+
+    // 下架
+    getChange(row) {
+      this.$confirm(`是否下架${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        shelve(row.id).then(res => {
+          if (res.code === 0) {
+            this.$message.success('下架成功!')
+            this.getList()
+          }
+        })
+      }).catch(() => { })
+    },
+
+    // 字典翻译
+    sortFormatter(row) {
+      return row.businessType === 5 ? row.sort : '/'
+    },
+    // 资源平台
+    platformFormatter(row) {
+      return this.selectDictLabel(this.platformOptions, row.platformId)
+    },
+    // 服务时间
+    timeFormatter(row) {
+      return this.selectDictLabel(this.serviceTimeOptions, row.indate)
+    },
+    // 当前状态
+    statusFormatter(row) {
+      return this.selectDictLabel(this.statusOptions, row.status)
+    },
+    // 是否推荐
+    recommendFormatter(row) {
+      return this.selectDictLabel(this.recommendOptions, row.isRecommend)
+    },
+    // 关联设备
+    devFormatter(row) {
+      return row.deviceIds ? row.deviceIds.split(',').map(i => this.selectDictLabel(this.devOptions, i)).join(',') : ''
+    },
+
+  }
+}
+</script>

+ 17 - 5
src/views/service/qqmusic/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <!-- 搜索 -->
-    <el-form inline label-width="100px" size="mini">
+    <el-form inline size="mini">
       <el-form-item label="批次:">
         <el-select v-model="form.batchId" placeholder="请选择批次" clearable>
           <el-option v-for="item in batchOptions" :key="item.value" :label="item.label" :value="item.value" />
@@ -25,11 +25,17 @@
       <el-form-item label="手机号:">
         <el-input v-model="form.phone" placeholder="请输入手机号" clearable />
       </el-form-item>
+      <el-form-item label="激活状态:">
+        <el-select v-model="form.activeStatus" placeholder="请选择激活状态" clearable>
+          <el-option v-for="item in activeOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <Upload action="/qqService/importData" title="批量推送短信" @upload="getUpload" style="margin: 0 10px"
-          v-hasPermi="['service:qqmusic:push']" />
+        <Upload action="/qqService/importData" @upload="getUpload" style="margin: 0 10px"
+          v-hasPermi="['service:qqmusic:push']">批量推送短信</Upload>
         <el-button type="danger" @click="getDialog()" v-hasPermi="['service:qqmusic:over']">批量过期</el-button>
         <el-button type="text" @click="getTemplate">模板下载</el-button>
       </el-form-item>
@@ -44,6 +50,7 @@
       <el-table-column label="Key" prop="key" align="center" show-overflow-tooltip />
       <el-table-column label="发送时间" prop="sendTime" align="center" show-overflow-tooltip />
       <el-table-column label="当前状态" prop="codeStatus" align="center" :formatter="statusFormatter" />
+      <el-table-column label="是否激活" prop="activeStatus" align="center" :formatter="activeStatusFormatter" />
       <el-table-column label="操作">
         <template slot-scope="scope">
           <el-button type="text" @click="getDialog(scope.row)">查看</el-button>
@@ -113,7 +120,6 @@
           <el-descriptions-item label="批次">{{ dialogDetail.batchNo }}</el-descriptions-item>
           <el-descriptions-item label="Key">{{ dialogDetail.key }}</el-descriptions-item>
           <el-descriptions-item label="发送时间">{{ dialogDetail.sendTime }}</el-descriptions-item>
-          <el-descriptions-item label="是否激活">{{ dialogDetail.activeStatus }}</el-descriptions-item>
           <el-descriptions-item label="激活账号">{{ dialogDetail.activeAccount }}</el-descriptions-item>
         </el-descriptions>
         <el-button type="danger" @click="getPast(dialogDetail)" v-hasPermi="['service:qqmusic:over']">
@@ -178,6 +184,10 @@ export default {
         { value: 0, label: '已发送' },
         { value: 1, label: '未发送' },
         { value: 2, label: '发送失败' }
+      ],
+      activeOptions: [
+        { value: 0, label: '未激活' },
+        { value: 1, label: '已激活' }
       ]
     }
   },
@@ -268,7 +278,6 @@ export default {
         }).then(res => {
           if (res.code === 0) {
             this.dialogDetail = res.data
-            return this.dialogDetail.activeStatus = res.data.activeStatus === 0 ? '未激活' : '已激活'
           }
         })
       } else {
@@ -344,6 +353,9 @@ export default {
     },
     phoneFormatter(row) {
       return row.phone === null ? '/' : row.phone
+    },
+    activeStatusFormatter(row) {
+      return this.selectDictLabel(this.activeOptions, row.activeStatus)
     }
   }
 }

+ 1 - 1
vue.config.js

@@ -38,7 +38,7 @@ module.exports = {
         target: `https://o3tapi.radio1964.com/admin`, // 测试
         // target: `http://192.168.0.217:2678/admin`, // 付新保本地
         // target: `http://192.168.0.185:2027`, // 陈浩
-        // target: `http://10.0.1.42:2027`,
+        // target: `http://10.0.2.36:2027`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''