Browse Source

Merge branch 'test'

# Conflicts:
#	src/views/operation/recommend/index.vue
DESKTOP-O04BTUJ\muzen 2 years ago
parent
commit
e83f2c4cc5

+ 51 - 0
src/api/music/choiceness.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(data) {
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/list`,
+    method: 'post',
+    data
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/queryPageById/${id}`,
+    method: 'get'
+  })
+}
+
+// 直播流列表
+export function liveList(audioId){
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/queryPageByAudioId/${audioId}`,
+    method: 'get'
+  })
+}
+
+// 新增 编辑
+export function submit(data){
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/addOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 上下架
+export function change(ids, status){
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/hitOrSold/${ids}/${status}`,
+    method: 'get'
+  })
+}
+
+// 删除
+export function remove(ids) {
+  return request({
+    url: `/admin/maowang/choice/tBroadcast/remove/${ids}`,
+    method: 'delete'
+  })
+}

+ 42 - 0
src/api/operation/waken.js

@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(){
+  return request({
+    url: `/admin/applets/list`,
+    method: 'get'
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/applets/queryById/${id}`,
+    method: 'get'
+  })
+}
+
+// 关联设备
+export function devices(type){
+  return request({
+    url: `/admin/applets/getIsExistclientTypeList/${type}`,
+    method: 'post'
+  })
+}
+
+// 新增 编辑
+export function submit(data) {
+  return request({
+    url: `/admin/applets/addOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除
+export function remove(ids) {
+  return request({
+    url: `/admin/applets/remove/${ids}`,
+    method: 'delete'
+  })
+}

+ 1 - 0
src/components/Upload/index.vue

@@ -174,6 +174,7 @@ export default {
     onDelete() {
       this.form.file = ''
       this.percentage = 0
+      this.$emit('upload', this.form)
     },
 
     // 如果上传失败 重新上传

+ 12 - 2
src/mixin/index.js

@@ -364,7 +364,12 @@ const addressMixin = {
     getAddress() {
       options(2).then(res => {
         if (res.code === 0) {
-          this.addressOptions = res.data
+          res.data.map(i => {
+            this.addressOptions.push({
+              value: i.id,
+              label: i.name
+            })
+          })
         }
       })
     }
@@ -385,7 +390,12 @@ const contentMixin = {
     getContent() {
       options(1).then(res => {
         if (res.code === 0) {
-          this.contentOptions = res.data
+          res.data.map(i => {
+            this.contentOptions.push({
+              value: i.id,
+              label: i.name
+            })
+          })
         }
       })
     }

+ 34 - 0
src/router/index.js

@@ -371,6 +371,23 @@ export const dynamicRoutes = [{
       }
     }]
   },
+  // 猫王精选电台
+  {
+    path: '/music',
+    component: Layout,
+    hidden: true,
+    permissions: ['music:choiceness:list'],
+    name: 'choiceness',
+    children: [{
+      path: 'choiceness/detail',
+      component: () => import('@/views/music/choiceness/detail'),
+      name: 'choicenessDetail',
+      meta: {
+        title: '猫王精选详情',
+        activeMenu: '/music/choiceness'
+      }
+    }]
+  },
   // 项目管理
   // 项目列表
   {
@@ -439,6 +456,23 @@ export const dynamicRoutes = [{
       }
     }]
   },
+  // 唤醒音
+  {
+    path: '/operation',
+    component: Layout,
+    hidden: true,
+    permissions: ['operation:waken:list'],
+    name: 'waken',
+    children: [{
+      path: 'waken/detail',
+      component: () => import('@/views/operation/waken/detail'),
+      name: 'wakenDetail',
+      meta: {
+        title: '唤醒音详情',
+        activeMenu: '/operation/waken'
+      }
+    }]
+  },
   // 商品管理
   // 商品推荐
   {

+ 19 - 27
src/views/device/version/detail.vue

@@ -3,17 +3,14 @@
     <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="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 dict.type.dev_list_type" :key="item.value" :label="item.label"
+            :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="version" label="版本号:">
@@ -35,34 +32,28 @@
       <el-form-item prop="content" label="升级描述:">
         <el-input v-model="form.content" type="textarea" rows="4" placeholder="请输入升级描述" />
       </el-form-item>
-      <el-form-item prop="isEnforcement" label="强制升级:">
-        <el-select v-model="form.isEnforcement" placeholder="是否强制升级">
-          <el-option
-            v-for="item in dict.type.dev_yes_no"
-            :key="item.value"
-            :label="item.label"
-            :value="Number(item.value)"
-          />
+      <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-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-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 dict.type.dev_yes_no" :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"
-            :value="Number(item.value)"
-          />
+          <el-option v-for="item in dict.type.push_user_type" :key="item.value" :label="item.label"
+            :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item :prop="user" v-if="form.userType === 3" label="指定用户:">
@@ -175,6 +166,7 @@ export default {
         }
       });
     }
+    console.log(this.devOptions);
   },
   methods: {
     // 上传文件

+ 3 - 1
src/views/device/version/index.vue

@@ -31,7 +31,8 @@
         </template>
       </el-table-column>
       <el-table-column prop="userTypeValue" label="升级对象" align="center" />
-      <el-table-column prop="enforcementValue" label="是否强制升级" align="center" />
+      <el-table-column prop="enforcementValue" label="APP强制升级" align="center" />
+      <el-table-column prop="deviceIsEnforcement" label="设备强制升级" align="center" />
       <el-table-column prop="updateTimeStr" label="更新时间" align="center" />
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
@@ -84,6 +85,7 @@ export default {
           res.data.records.forEach(i => {
             this.tableData.push({
               ...i,
+              deviceIsEnforcement: i.deviceIsEnforcement ? i.deviceIsEnforcement : '否',
               enforcementValue: i.enforcementValue ? i.enforcementValue : '否'
             })
           })

+ 2 - 2
src/views/music/blog/detail.vue

@@ -316,7 +316,7 @@ export default {
       } else {
         this.ids.map(i => {
           this.form.adminPodCastProgramDetailResp.map((j, index) => {
-            if(j.id === i) {
+            if (j.id === i) {
               this.form.adminPodCastProgramDetailResp.splice(index, 1)
               this.$message.success('解除成功!')
             }
@@ -334,11 +334,11 @@ export default {
           this.form.adminPodCastProgramDetailResp.map(i => {
             this.form.podcastProgramIds.push(i.id)
           })
-          delete this.form.adminPodCastProgramDetailResp
           submit(this.form).then(res => {
             if (res.code === 0) {
               this.$message.success(`${title}`)
               if (this.form.id) {
+                delete this.form.adminPodCastProgramDetailResp
                 this.getDetail()
               } else {
                 this.cancel()

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

@@ -0,0 +1,386 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" :rules="rules" label-width="100px" style="width: 500px"
+      :disabled="disabled">
+      <el-form-item label="电台名称:" prop="name">
+        <el-input v-model="form.name" placeholder="请输入电台名称" maxlength="100" show-word-limit />
+      </el-form-item>
+      <el-form-item label="电台简介:" prop="description">
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10}"
+          placeholder="请输入电台简介" maxlength="300" show-word-limit />
+      </el-form-item>
+      <el-form-item label="电台封面:" prop="thumb">
+        <Upload listType="picture-card" :url="form.thumb" @upload="upload" :disabled="disabled" />
+      </el-form-item>
+      <el-form-item label="直播流:" style="width:1200px" prop="liveBrocastList">
+        <el-button type="primary" icon="el-icon-plus" @click="getDialog">添加关联</el-button>
+        <el-table :data="form.liveBrocastList">
+          <el-table-column type="index" label="序号" align="center" />
+          <el-table-column label="电台名称" prop="subbroadcastName" align="center" show-overflow-tooltip />
+          <el-table-column label="节目名称" align="center">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.name" />
+            </template>
+          </el-table-column>
+          <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
+          <el-table-column label="开始时间" align="center">
+            <template slot-scope="scope">
+              <el-time-picker v-model="scope.row.startTime" start-placeholder="开始时间" end-placeholder="结束时间"
+                :readonly="readonly(scope.row)" value-format="HH:mm:ss" format="HH:mm:ss" />
+            </template>
+          </el-table-column>
+          <el-table-column label="结束时间" align="center">
+            <template slot-scope="scope">
+              <el-time-picker v-model="scope.row.endTime" start-placeholder="开始时间" end-placeholder="结束时间"
+                :readonly="readonly(scope.row)" value-format="HH:mm:ss" format="HH:mm:ss" />
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" width="100px">
+            <template slot-scope="scope">
+              <el-button type="delete" @click="getDelete(scope.row, scope.$index)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <div class="form-btn">
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="getSubmit" v-if="!disabled">确定</el-button>
+    </div>
+
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" width="1000px" :before-close="beforeClose">
+      <!-- 搜索 -->
+      <el-form inline size="mini">
+        <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-select v-model="dialogForm.addressClassifyId" placeholder="请选择地域分类">
+            <el-option v-for="item in addressOptions" :key="item.value" :value="item.value"
+              :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="内容分类:">
+          <el-select v-model="dialogForm.contentClassifyId" placeholder="请选择内容分类">
+            <el-option v-for="item in contentOptions" :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 label="电台ID:">
+          <el-input v-model="dialogForm.id" placeholder="请输入电台ID" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
+          <el-button icon="el-icon-refrash" @click="getRefrash">重置</el-button>
+        </el-form-item>
+      </el-form>
+      <!-- 列表 -->
+      <el-table :data="tableData" ref="table" v-loading="loading">
+        <el-table-column key="detail" align="center" width="50px" v-if="dialogForm.platformId === 1">
+          <template slot-scope="scope">
+            <el-button type="text"
+              :icon="scope.$index === index ? 'el-icon-arrow-down' : 'el-icon-arrow-right'"
+              @click="handleExpand(scope.row, scope.$index)" />
+          </template>
+        </el-table-column>
+        <el-table-column label="电台ID" prop="id" key="id" align="center" />
+        <el-table-column label="电台名称" prop="name" key="name" align="center" />
+        <el-table-column label="电台封面" key="thumb" align="center" width="100px">
+          <template slot-scope="scope">
+            <el-image v-if="scope.row.thumb" :src="scope.row.thumb" />
+          </template>
+        </el-table-column>
+        <el-table-column label="地域分类" key="address" align="center" :formatter="addressFormatter" />
+        <el-table-column label="内容分类" key="content" align="center" :formatter="contentFormatter" />
+        <el-table-column label="操作" key="checked" align="center" v-if="dialogForm.platformId === 4">
+          <template slot-scope="scope">
+            <el-button type="text" @click="getChecked(scope.row)" :disabled="checked(scope.row)">选择
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column type="expand" key="expand" width="1">
+          <template slot-scope="scope">
+            <el-form v-if="scope.row.children.length > 0" class="table-form" inline label-width="140px">
+              <div class="table-item" v-for="item in scope.row.children" :key="item.id">
+                <el-form-item label="节目名称:" style="width: calc(100% - 565px)">
+                  {{ item.title }}
+                  <!-- <el-tooltip class="item" effect="dark" :content="item.title" placement="top">
+                    <div></div>
+                  </el-tooltip> -->
+                </el-form-item>
+                <el-form-item label="时间段:" style="width: 435px">
+                  {{ item.start_time }} - {{ item.end_time }}
+                </el-form-item>
+                <el-form-item style="width: 100px">
+                  <el-button type="text" @click="getChecked(scope.row, item)" :disabled="checked(item)">
+                    选择
+                  </el-button>
+                </el-form-item>
+              </div>
+            </el-form>
+            <el-empty v-else :image-size="100" description="暂无更多直播流"></el-empty>
+          </template>
+        </el-table-column>
+      </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>
+  </div>
+</template>
+
+<script>
+import { list, detail, liveList, submit } from '@/api/music/choiceness'
+import Upload from '@/components/Upload/index.vue'
+import { addressMixin, contentMixin, platformMixin } from '@/mixin/index'
+export default {
+  mixins: [addressMixin, contentMixin, platformMixin],
+  components: {
+    Upload
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        liveBrocastList: []
+      },
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗表单
+      dialogForm: {
+        pageNum: 1,
+        pageSize: 10,
+        platformId: 1
+      },
+      total: 0,
+      // 列表
+      tableData: [],
+      // 资源平台
+      platformOptions: [{
+        value: 1,
+        label: '蜻蜓'
+      }, {
+        value: 4,
+        label: '海外电台'
+      }],
+      // 只读
+      disabled: false,
+      // 阻止重复点击
+      index: null,
+      // 校验
+      rules: {
+        name: [{
+          required: true, message: '请输入电台名称', trigger: 'blur'
+        }],
+        description: [{
+          required: true, message: '请输入电台简介', trigger: 'blur'
+        }],
+        thumb: [{
+          required: true, message: '请上传电台封面', trigger: 'change'
+        }],
+        liveBrocastList: [{
+          required: true, message: '请配置电台直播流', trigger: 'change'
+        }]
+      }
+    }
+  },
+  watch: {
+    'dialogForm.platformId'(val) {
+      this.dialogForm.platformId = val
+      this.getList()
+    }
+  },
+  mounted() {
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id
+      this.disabled = Boolean(this.$route.query.disabled)
+      this.getDetail()
+    }
+  },
+  methods: {
+    // 详情
+    getDetail() {
+      detail(this.form.id).then(res => {
+        if (res.code === 0) {
+          this.form = res.data
+        }
+      })
+    },
+
+    // 上传
+    upload(e) {
+      this.form.thumb = e.file
+    },
+
+    // 删除
+    getDelete(row, index) {
+      this.$confirm(`是否删除${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        this.form.liveBrocastList.splice(index, 1)
+      })
+    },
+
+    // 弹窗 
+    getDialog() {
+      this.dialogVisible = true
+      this.getList()
+    },
+
+    // 关闭弹窗
+    beforeClose() {
+      this.dialogVisible = false
+      this.index = null
+    },
+
+    // 列表
+    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
+        }
+      })
+    },
+
+    // 搜索
+    getSearch() {
+      this.dialogForm.pageNum = 1
+      this.getList()
+    },
+
+    // 重置
+    getRefrash() {
+      this.dialogForm = {
+        pageNum: 1,
+        pageSize: 10,
+        platformId: this.dialogForm.platformId
+      }
+      this.getList()
+    },
+
+    // 直播流
+    handleExpand(row, index) {
+      if (this.index !== index) {
+        this.loading = true
+        liveList(row.id).then(res => {
+          if (res.code === 0) {
+            this.tableData[index].children = res.data
+            this.tableData.map(i => {
+              if (i.id !== row.id) {
+                this.$refs.table.toggleRowExpansion(i, false)
+              }
+            })
+            this.$refs.table.toggleRowExpansion(row, true)
+            this.index = index
+            this.loading = false
+          }
+        })
+      } else {
+        this.$refs.table.toggleRowExpansion(row, false)
+        this.index = null
+      }
+    },
+
+    // 选择
+    getChecked(row, item) {
+      this.form.liveBrocastList.push({
+        name: row.platformId === 1 ? item.title : '',
+        startTime: row.platformId === 1 ? item.start_time + ':00' : '',
+        endTime: row.platformId === 1 ? item.end_time + ':00' : '',
+        subbroadcastId: row.id,
+        platformId: row.platformId,
+        subbroadcastName: row.name
+      })
+    },
+
+    // 取消
+    cancel() {
+      this.$tab.closeOpenPage('/music/choiceness')
+    },
+
+    // 提交
+    getSubmit() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          submit(this.form).then(res => {
+            if (res.code === 0) {
+              this.$message.success('提交成功!')
+              this.form.id ? this.getDetail() : this.cancel()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    // 字典翻译
+    addressFormatter(row) {
+      return row.platformId === 1 ? this.selectDictLabel(this.addressOptions, row.addressClassifyId) : '/'
+    },
+    contentFormatter(row) {
+      return row.platformId === 1 ? this.selectDictLabel(this.contentOptions, row.contentClassifyId) : '/'
+    },
+    platformFormatter(row) {
+      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+    },
+
+    // 是否只读
+    readonly(row) {
+      return row.platformId === 1 ? true : false
+    },
+
+    // 是否已选
+    checked(row) {
+      return this.dialogForm.platformId === 1 ? this.form.liveBrocastList.findIndex(i => i.name === row.title) === -1 ? false : true : this.form.liveBrocastList.findIndex(i => i.subbroadcastId === row.id) === -1 ? false : true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .table-form {
+  .table-item:nth-child(even) {
+    background-color: #f2f6fc;
+  }
+
+  .table-item {
+    padding: 10px 10px 10px 30px;
+  }
+
+  .table-item:last-child {
+    border: none;
+  }
+
+  .el-form-item {
+    margin-bottom: 0;
+
+    .el-form-item__content {
+      width: calc(100% - 140px);
+
+      div {
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+      }
+    }
+  }
+}
+
+.el-date-editor {
+  width: 150px;
+}
+</style>

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

@@ -0,0 +1,163 @@
+<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.status" placeholder="请选择当前状态">
+          <el-option v-for="item in onOrOffOptions" :key="item.value" :label="item.label" :value="item.value"
+            clearable />
+        </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-refrash" @click="getRefrash">重置</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
+          v-hasPermi="['music:choiceness:add']">新增</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column type="index" label="序号" align="center" />
+      <el-table-column label="电台ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="电台名称" prop="name" align="center" />
+      <el-table-column label="电台封面" align="center" width="100px">
+        <template slot-scope="scope">
+          <el-image v-if="scope.row.thumb" :src="scope.row.thumb" />
+        </template>
+      </el-table-column>
+      <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
+      <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+      <el-table-column label="更新时间" align="center">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDetail(scope.row.id, true)">查看</el-button>
+          <el-button v-if="scope.row.status === 1" type="text" @click="getChange(scope.row, 2)"
+            v-hasPermi="['music:choiceness:down']">下架</el-button>
+          <span v-else>
+            <el-button type="text" style="margin-left: 10px" @click="getDetail(scope.row.id)"
+              v-hasPermi="['music:choiceness:edit']">编辑</el-button>
+            <el-button type="text" @click="getChange(scope.row, 1)" v-hasPermi="['music:choiceness:up']">
+              上架
+            </el-button>
+            <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:choiceness:delete']">
+              删除
+            </el-button>
+          </span>
+        </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, change, remove } from '@/api/music/choiceness'
+import { onOrOffMixin, platformMixin } from '@/mixin/index'
+export default {
+  mixins: [onOrOffMixin, platformMixin],
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      total: 0,
+      // 列表
+      tableData: []
+    }
+  },
+  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()
+    },
+
+    // 重置
+    getRefrash() {
+      this.form = {
+        pageNum: 1,
+        pageSize: 10
+      }
+      this.getList()
+    },
+
+    // 详情
+    getDetail(id, boolean) {
+      this.$router.push({
+        path: `/music/choiceness/detail`,
+        query: {
+          id: id,
+          disabled: boolean
+        }
+      })
+    },
+
+    // 上下架
+    getChange(row, status) {
+      let title = status === 1 ? '上架' : '下架'
+      this.$confirm(`是否${title}${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        change(row.id, status).then(res => {
+          if (res.code === 0) {
+            this.$message.success(`${title}成功!`)
+            this.getList()
+          }
+        })
+      })
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        remove(row.id).then(res => {
+          if (res.code === 0) {
+            this.$message.success(`删除成功!`)
+            this.getList()
+          }
+        })
+      })
+    },
+
+    // 字典翻译
+    platformFormatter(row) {
+      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+    },
+    statusFormatter(row) {
+      return this.selectDictLabel(this.onOrOffOptions, row.status)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 26 - 13
src/views/music/platform/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDialog()" v-hasPermi="['music:platform:add']">新增</el-button>
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDialog()"
+      v-hasPermi="['music:platform:add']">新增</el-button>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
       <el-table-column type="index" label="序号" align="center" />
@@ -9,8 +10,10 @@
       <el-table-column label="对接方式" prop="joinType" align="center" :formatter="joinTypeFormatter" />
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
-          <el-button type="text" @click="getDialog(scope.row.id)" v-hasPermi="['music:platform:edit']">编辑</el-button>
-          <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:platform:delete']">删除</el-button>
+          <el-button type="text" @click="getDialog(scope.row.id)" v-hasPermi="['music:platform:edit']">编辑
+          </el-button>
+          <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:platform:delete']">删除
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -30,9 +33,9 @@
           </el-select>
         </el-form-item>
         <el-form-item label="对接方式:" prop="joinType">
-          <el-select v-model="dialogForm.joinType" placeholder="请选择资源对接方式">
+          <el-select v-model="dialogForm.joinType" multiple placeholder="请选择资源对接方式">
             <el-option v-for="item in joinTypeOptions" :key="item.value" :value="item.value.toString()"
-              :label="item.label" />
+              :label="item.label" :disabled="item.disabled" />
           </el-select>
         </el-form-item>
         <el-form-item style="text-align: right;">
@@ -68,7 +71,8 @@ export default {
       // 提交表单
       dialogForm: {
         name: '',
-        audioType: []
+        audioType: [],
+        joinType: []
       },
       // 校验
       rules: {
@@ -91,9 +95,20 @@ export default {
       }, {
         value: 2,
         label: '本地管理'
+      }, {
+        value: 3,
+        label: '小程序'
       }]
     }
   },
+  watch: {
+    'dialogForm.joinType'(val) {
+      if (val) {
+        this.joinTypeOptions[1].disabled = val.findIndex(i => i === '1') !== -1 ? true : false
+        this.joinTypeOptions[0].disabled = val.findIndex(i => i === '2') !== -1 ? true : false
+      }
+    }
+  },
   mounted() {
     this.getList()
   },
@@ -112,18 +127,15 @@ export default {
     // 弹窗
     getDialog(id) {
       this.dialogVisible = true
+      this.title = id ? '编辑' : '新增'
       if (id) {
-        this.title = '编辑'
         detail(id).then(res => {
           if (res.code === 0) {
             this.dialogForm = res.data
-            if (this.dialogForm.audioType) {
-              this.dialogForm.audioType = res.data.audioType.split(',')
-            }
+            this.dialogForm.audioType = res.data.audioType.split(',')
+            this.dialogForm.joinType = res.data.joinType.split(',')
           }
         })
-      } else {
-        this.title = '新增'
       }
     },
 
@@ -139,6 +151,7 @@ export default {
       this.$refs.dialogForm.validate((valid) => {
         if (valid) {
           this.dialogForm.audioType = this.dialogForm.audioType.join(',')
+          this.dialogForm.joinType = this.dialogForm.joinType.join(',')
           submit(this.dialogForm).then(res => {
             if (res.code === 0) {
               this.$message.success(`${this.title}成功!`)
@@ -173,7 +186,7 @@ export default {
       return row.audioType ? row.audioType.split(',').map(i => this.selectDictLabel(this.audioOptions, i)).join(',') : '/'
     },
     joinTypeFormatter(row) {
-      return this.selectDictLabel(this.joinTypeOptions, row.joinType)
+      return row.joinType ? row.joinType.split(',').map(i => this.selectDictLabel(this.joinTypeOptions, i)).join(',') : '/'
     }
   }
 };

+ 4 - 4
src/views/music/radio/detail.vue

@@ -12,14 +12,14 @@
       </el-form-item>
       <el-form-item v-if="form.platformId !== 4" label="地域分类:" prop="addressClassifyId">
         <el-select v-model="form.addressClassifyId" placeholder="请选择地域分类">
-          <el-option v-for="item in addressOptions" :key="item.id" :value="item.id.toString()"
-            :label="item.name" />
+          <el-option v-for="item in addressOptions" :key="item.value" :value="item.value.toString()"
+            :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="内容分类:" prop="contentClassifyId">
         <el-select v-model="form.contentClassifyId" placeholder="请选择内容分类">
-          <el-option v-for="item in contentOptions" :key="item.id" :value="item.id.toString()"
-            :label="item.name" />
+          <el-option v-for="item in contentOptions" :key="item.value" :value="item.value.toString()"
+            :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="电台简介:" prop="description">

+ 4 - 4
src/views/music/radio/index.vue

@@ -13,12 +13,12 @@
       </el-form-item>
       <el-form-item label="地域分类:">
         <el-select v-model="form.addressClassifyId" placeholder="请选择地域分类" clearable>
-          <el-option v-for="item in addressOptions" :key="item.id" :value="item.id" :label="item.name" />
+          <el-option v-for="item in addressOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="内容分类:">
         <el-select v-model="form.contentClassifyId" placeholder="请选择内容分类" clearable>
-          <el-option v-for="item in contentOptions" :key="item.id" :value="item.id" :label="item.name" />
+          <el-option v-for="item in contentOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
@@ -192,11 +192,11 @@ export default {
     },
 
     addressFormatter(row) {
-      return row.addressClassifyId ? this.addressOptions.find(i => i.id === row.addressClassifyId).name : '/'
+      return this.selectDictLabel(this.addressOptions, row.addressClassifyId)
     },
 
     contentFormatter(row) {
-      return row.contentClassifyId ? this.contentOptions.find(i => i.id === row.contentClassifyId).name : '/'
+      return this.selectDictLabel(this.contentOptions, row.contentClassifyId)
     }
   },
 }

+ 2 - 2
src/views/operation/channel/detail.vue

@@ -57,7 +57,7 @@
       <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[this.form.channelType]" :key="item.value"
+            <el-option v-for="item in channelOptions[form.channelType]" :key="item.value"
               :value="item.value" :label="item.label" />
           </el-select>
         </el-form-item>
@@ -198,7 +198,7 @@ export default {
     // 打开弹窗
     getDialog() {
       this.dialogVisible = true
-      this.dialogForm.platformId = this.dialogForm.platformId = this.form.channelType === 16 ? 3 : this.form.channelType === 17 ? 2 : this.platformOptions[0].value
+      this.dialogForm.platformId = this.form.channelType === 16 ? 3 : this.form.channelType === 17 ? 2 : this.platformOptions[0].value
       this.getList()
     },
 

+ 7 - 4
src/views/operation/channel/index.vue

@@ -38,6 +38,7 @@
         <el-form-item v-if="title === '编辑'" label="内容列表:">
           <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 />
             <el-table-column label="频道封面" align="center" width="100px">
               <template slot-scope="scope">
@@ -165,10 +166,12 @@ export default {
       this.index = index + 1
       this.obj = row
       // 新增 / 编辑时的设备
-      let type = row ? 1 : 0
-      devList(type).then(res => {
+      devList(0).then(res => {
         if (res.code === 0) {
           this.devOptions = res.data
+          if (this.title === '编辑') {
+            this.devOptions.unshift.apply(this.devOptions, row.deviceList)
+          }
         }
       })
 
@@ -252,8 +255,8 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.el-form {
-  height: 605px;
+::v-deep .el-dialog__body {
+  height: 700px;
   overflow-y: auto;
 }
 </style>

+ 15 - 15
src/views/operation/recommend/index.vue

@@ -175,23 +175,24 @@
       </el-form>
       <el-table :data="tableData" ref="tableData" :row-key="rowKey" @selection-change="handleSelectionChange"
         v-loading="loading">
-        <el-table-column type="selection" align="center" reserve-selection
+        <el-table-column type="selection" align="center" reserve-selection key="selection"
           v-if="tabIndex === 2 && active === 1" />
-        <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">
+        <el-table-column label="音频ID" prop="audioId" align="center" key="audioId" show-overflow-tooltip />
+        <el-table-column label="音频名称" prop="audioName" align="center" key="audioName" show-overflow-tooltip />
+        <el-table-column label="音频封面" align="center" key="audioPic" 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="audioFormatter" />
-        <el-table-column label="音频数量" prop="programCount" align="center" />
-        <el-table-column label="付费类型" align="center" :formatter="freeFormatter" width="100px" />
-        <el-table-column label="当前状态" align="center" :formatter="listStatusFormatter" />
-        <el-table-column label="操作" align="center">
+        <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">
           <template slot-scope="scope">
-            <el-button v-if="tabIndex === 2 && active === 1 ? false : true" type="text"
-              @click="getSelect(scope.row)" :disabled="scope.row.status === 2">
+            <el-button type="text" @click="getSelect(scope.row)">
               选择
             </el-button>
           </template>
@@ -524,6 +525,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) {
             this.list[this.index].childList.map(i => {
               let row = res.data.records.find(j => j.audioId === i.contentId)
@@ -565,7 +567,8 @@ export default {
               platformId: i.platformId,
               contentType: i.audioType,
               pic: i.audioPic,
-              description: i.description
+              description: i.description,
+              status: i.status
             })
           }
         })
@@ -657,9 +660,6 @@ export default {
     statusFormatter(row) {
       return row.status === 0 ? '上架' : '下架'
     },
-    listStatusFormatter(row) {
-      return row.status ? this.selectDictLabel(this.onOrOffOptions, row.status) : '上架'
-    },
 
     // v-if判断
     // 标题模块

+ 12 - 5
src/views/operation/tag/detail.vue

@@ -66,8 +66,8 @@
           <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 :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 />
@@ -80,8 +80,10 @@
         <el-table-column label="节目数量" prop="programCount" align="center" />
         <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
       </el-table>
-      <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
-        :limit.sync="dialogForm.pageSize" @pagination="getList" />
+      <div slot="footer">
+        <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
+          :limit.sync="dialogForm.pageSize" @pagination="getList" />
+      </div>
     </el-dialog>
   </div>
 </template>
@@ -211,7 +213,7 @@ export default {
                 this.$refs.dialogTableData.toggleRowSelection(row, true)
               }
             })
-          }else{
+          } else {
             this.$refs.dialogTableData.clearSelection()
           }
         }
@@ -301,4 +303,9 @@ export default {
 .el-form {
   width: 500px;
 }
+
+::v-deep .el-dialog__body {
+  height: 610px;
+  overflow-y: scroll;
+}
 </style>

+ 333 - 0
src/views/operation/waken/detail.vue

@@ -0,0 +1,333 @@
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" :rules="rules" label-width="110px">
+      <el-form-item label="唤醒音名称:" prop="name">
+        <el-input v-model="form.name" placeholder="请输入唤醒音名称" />
+      </el-form-item>
+      <el-form-item label="频道属性:" prop="attributeType">
+        <el-select v-model="form.attributeType" placeholder="请选择频道属性">
+          <el-option v-for="item in channelOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联设备:" prop="deviceIds">
+        <el-select v-model="form.deviceIds" multiple placeholder="请选择关联设备">
+          <el-option v-for="item in deviceOptions" :key="item.clientTypeId"
+            :value="item.clientTypeId.toString()" :label="item.name" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="唤醒音封面:" prop="pic">
+        <Upload listType="picture-card" :url="form.pic" @upload="upload" />
+      </el-form-item>
+      <el-form-item label="唤醒音内容:" style="width: 1000px">
+        <el-button type="primary" icon="el-icon-plus" :disabled="!form.attributeType" @click="getDialog">
+          关联内容
+        </el-button>
+        <el-table :data="form.audioDefaultResp">
+          <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" />
+            </template>
+          </el-table-column>
+          <el-table-column label="付费类型" align="center" prop="isFree" :formatter="freeFormatter" />
+          <el-table-column label="资源平台" align="center" prop="platformId" :formatter="platfromFormatter" />
+          <el-table-column label="操作" align="center">
+            <template slot-scope="scope">
+              <el-button type="delete" @click="getDelete(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <div style="margin-left: 110px">
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="getSubmit">确定</el-button>
+    </div>
+
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" title="关联内容" width="1100px">
+      <el-form inline size="mini" style="width:100%">
+        <el-form-item label="音频类型:">
+          <el-select v-if="form.attributeType" v-model="dialogForm.audioType" placeholder="请选择音频类型">
+            <el-option v-for="item in channelOptions.find(i => i.value === form.attributeType).children"
+              :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <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.keyword" placeholder="请输入内容名称" />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
+          <el-button icon="el-icon-refrash" @click="getRefrash">重置</el-button>
+        </el-form-item>
+      </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="音频封面" align="center" width="100px">
+          <template slot-scope="scope">
+            <el-image :src="scope.row.audioPic" />
+          </template>
+        </el-table-column>
+        <el-table-column label="付费类型" align="center" prop="isFree" :formatter="freeFormatter" />
+        <el-table-column label="资源平台" align="center" prop="platformId" :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>
+  </div>
+</template>
+
+<script>
+import Upload from '@/components/Upload/index.vue'
+import { list } from '@/api/operation/channel'
+import { detail, devices, submit } from '@/api/operation/waken'
+import { platformMixin, isFreeMixin } from '@/mixin/index'
+export default {
+  mixins: [platformMixin, isFreeMixin],
+  components: {
+    Upload
+  },
+  data() {
+    return {
+      // 表单
+      form: {
+        deviceIds: [],
+        pic: '',
+        audioDefaultResp: []
+      },
+      // 列表
+      tableData: [],
+      // 频道属性
+      channelOptions: [{
+        value: 1,
+        label: '广播',
+        children: [{
+          value: 2,
+          label: '广播电台'
+        }]
+      }, {
+        value: 3,
+        label: '节目',
+        children: [{
+          value: 6,
+          label: '节目'
+        }, {
+          value: 11,
+          label: '歌曲'
+        }]
+      }],
+      // 关联设备
+      deviceOptions: [],
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗表单
+      dialogForm: {
+        pageNum: 1,
+        pageSize: 10,
+        platformId: null,
+        audioType: null,
+        status: 1
+      },
+      // 总数
+      total: 0,
+      // 弹窗列表
+      tableData: [],
+      // 校验
+      rules: {
+        name: [{
+          required: true, message: '请输入唤醒音名称', trigger: 'blur'
+        }],
+        attributeType: [{
+          required: true, message: '请选择频道属性', trigger: 'change'
+        }],
+        deviceIds: [{
+          required: true, message: '请选择关联设备', trigger: 'change'
+        }],
+        pic: [{
+          required: true, message: '请上传封面', trigger: 'change'
+        }]
+      }
+    }
+  },
+  watch: {
+    'form.attributeType'(val) {
+      if (val) {
+        this.dialogForm.audioType = this.channelOptions.find(i => i.value === val).children[0].value
+        this.getPlatform({
+          audioType: this.dialogForm.audioType,
+          joinType: 3
+        })
+      }
+    },
+    async 'dialogForm.audioType'(val) {
+      if (this.dialogVisible) {
+        await this.getPlatform({
+          audioType: val,
+          joinType: 3
+        })
+        this.getRefrash()
+      }
+    }
+  },
+  mounted() {
+    this.getDevices()
+    if (this.$route.query.id) {
+      this.form.id = this.$route.query.id
+    }
+  },
+  methods: {
+    // 关联设备
+    getDevices() {
+      devices(2).then(res => {
+        if (res.code === 0) {
+          this.deviceOptions = res.data
+          if (this.form.id) {
+            this.getDetail()
+          }
+        }
+      })
+    },
+
+    // 详情
+    getDetail() {
+      detail(this.form.id).then(res => {
+        if (res.code === 0) {
+          this.form = res.data
+          this.form.deviceIds = res.data.deviceIds.split(',')
+          this.deviceOptions.unshift.apply(this.deviceOptions, res.data.deviceList)
+        }
+      })
+    },
+
+    // 上传
+    upload(e) {
+      this.form.pic = e.file
+    },
+
+    // 删除
+    getDelete(row) {
+      this.form.audioDefaultResp = this.form.audioDefaultResp.filter(i => i.audioId !== row.audioId)
+    },
+
+    // 弹窗
+    getDialog() {
+      this.dialogForm.platformId = this.platformOptions[0].value
+      this.dialogVisible = true
+      this.getList()
+    },
+
+    // 音频列表
+    getList() {
+      list(this.dialogForm).then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data.records
+          this.total = res.data.total
+          this.$refs.table.clearSelection()
+          if (this.form.audioDefaultResp.length > 0) {
+            this.form.audioDefaultResp.map(i => {
+              let row = this.tableData.find(j => j.audioId === i.audioId)
+              if (row) {
+                this.$refs.table.toggleRowSelection(row, true)
+              }
+            })
+          }
+        }
+      })
+    },
+
+    // 搜索
+    getSearch() {
+      this.dialogForm.pageNum = 1
+      this.getList()
+    },
+
+    // 重置
+    getRefrash() {
+      this.dialogForm = {
+        pageNum: 1,
+        pageSize: 10,
+        platformId: this.platformOptions[0].value,
+        audioType: this.dialogForm.audioType,
+        status: 1
+      }
+      this.getList()
+    },
+
+    getRowKey(row) {
+      return row.audioId
+    },
+
+    // 表格多选
+    getChange(row) {
+      this.form.audioList = []
+      if (row.length > 0) {
+        row.map(i => {
+          if (this.form.audioDefaultResp.findIndex(j => j.audioId === i.audioId) === -1) {
+            this.form.audioDefaultResp.push(i)
+          }
+        })
+      }
+    },
+
+    // 取消
+    cancel() {
+      this.$tab.closeOpenPage('/operation/waken')
+    },
+
+    // 提交
+    getSubmit() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          this.form.deviceIds = this.form.deviceIds.join(',')
+          this.form.audioList = []
+          this.form.audioDefaultResp.map(i => {
+            this.form.audioList.push({
+              audioId: i.audioId,
+              audioType: i.audioType
+            })
+          })
+          submit(this.form).then(res => {
+            if (res.code === 0) {
+              this.$message.success('提交成功!')
+              this.form.id ? this.getDevices() : this.cancel()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    // 字典翻译
+    platfromFormatter(row) {
+      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+    },
+    freeFormatter(row) {
+      return this.selectDictLabel(this.freeOptions, row.isFree)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-form {
+  width: 500px;
+}
+
+::v-deep .el-dialog__body {
+  height: 690px;
+  overflow-y: scroll;
+}
+</style>

+ 103 - 0
src/views/operation/waken/index.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="app-container">
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDetail()"
+      v-hasPermi="['operation:waken:add']">新增换醒音</el-button>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column type="index" label="序号" align="center" />
+      <el-table-column label="唤醒音名称" align="center" prop="name" show-overflow-tooltip />
+      <el-table-column label="唤醒音封面" align="center" width="100px">
+        <template slot-scope="scope">
+          <el-image :src="scope.row.pic" />
+        </template>
+      </el-table-column>
+      <el-table-column label="关联设备" align="center" :formatter="devFormatter" show-overflow-tooltip />
+      <el-table-column label="关联内容数" align="center" prop="num" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['operation:waken:edit']">
+            编辑
+          </el-button>
+          <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['operation:waken:delete']">
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import { list, devices, remove } from '@/api/operation/waken'
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 列表
+      tableData: [],
+      // 设备列表
+      deviceOptions: []
+    }
+  },
+  mounted() {
+    this.getList()
+    this.getDevices()
+  },
+  methods: {
+    // 列表
+    getList() {
+      this.loading = true
+      list().then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data
+          this.loading = false
+        }
+      })
+    },
+
+    // 设备列表
+    getDevices() {
+      this.$nextTick(() => {
+        devices(1).then(res => {
+          if (res.code === 0) {
+            this.deviceOptions = res.data
+          }
+        })
+      })
+    },
+
+    // 详情
+    getDetail(id) {
+      this.$router.push({
+        path: `/operation/waken/detail`,
+        query: {
+          id: id
+        }
+      })
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.name}?`, `提示`, {
+        type: 'warning'
+      }).then(() => {
+        remove(row.id).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      })
+    },
+
+    // 字典翻译
+    devFormatter(row) {
+      return this.deviceOptions.length > 0 ? row.deviceIds.split(',').map(i => this.deviceOptions.find(j => j.clientTypeId == i).name).join(',') : ''
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>

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

@@ -33,6 +33,9 @@
             :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>

+ 5 - 2
src/views/service/flowPackage/index.vue

@@ -29,7 +29,8 @@
       </el-form-item>
     </el-form>
     <!-- 列表 -->
-    <el-table :data="tableData" v-loading="loading">
+    <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 />
@@ -93,7 +94,9 @@ export default {
           id: id
         }
       })
-    }
+    },
+    
+
   }
 }
 </script>

+ 9 - 2
src/views/service/mixin/index.js

@@ -51,7 +51,9 @@ const musicPackageMixin = {
   }
 }
 
-import { goodsList } from '@/api/service/musicPackage'
+import {
+  goodsList
+} from '@/api/service/musicPackage'
 const goodsMixin = {
   data() {
     return {
@@ -149,6 +151,11 @@ const indexMixin = {
     devFormatter(row) {
       return row.deviceIds ? row.deviceIds.split(',').map(i => this.selectDictLabel(this.devOptions, i)).join(',') : ''
     },
+
+    // 字典翻译
+    sortFormatter(row) {
+      return row.businessType === 5 ? row.sort : '/'
+    }
   },
 }
 
@@ -191,7 +198,7 @@ const detailMixin = {
         }]
       },
       // 服务类型
-      businessOptions:[{
+      businessOptions: [{
         value: 0,
         label: '签到'
       }, {

+ 5 - 1
src/views/service/musicPackage/detail.vue

@@ -12,7 +12,8 @@
       </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-option v-for="item in businessOptions" :key="item.value" :value="item.value"
+            :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="资源平台:">
@@ -39,6 +40,9 @@
             :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>

+ 2 - 1
src/views/service/musicPackage/index.vue

@@ -30,7 +30,8 @@
       </el-form-item>
     </el-form>
     <!-- 列表 -->
-    <el-table :data="tableData" v-loading="loading">
+    <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 />