Kaynağa Gözat

Merge branch 'develop/3.1.2' into test

# Conflicts:
#	src/views/device/list/detail.vue
#	src/views/operation/agreement/index.vue
DESKTOP-SVI9JE1\muzen 1 yıl önce
ebeveyn
işleme
92cb4ad027
45 değiştirilmiş dosya ile 1250 ekleme ve 877 silme
  1. 1 0
      package.json
  2. 0 55
      src/api/content/banner.js
  3. 35 0
      src/api/content/video.js
  4. 4 4
      src/api/device/category.js
  5. 3 3
      src/api/device/function.js
  6. 6 6
      src/api/device/list.js
  7. 1 1
      src/common/main.scss
  8. 79 236
      src/components/Editor/index.vue
  9. 3 31
      src/mixin/index.js
  10. 33 16
      src/router/index.js
  11. 18 5
      src/store/modules/editor.js
  12. 85 0
      src/views/content/video/detail.vue
  13. 132 0
      src/views/content/video/index.vue
  14. 1 1
      src/views/device/article/detail.vue
  15. 201 0
      src/views/device/category/detail.vue
  16. 70 145
      src/views/device/category/index.vue
  17. 180 0
      src/views/device/class/index.vue
  18. 5 5
      src/views/device/function/index.vue
  19. 56 19
      src/views/device/list/detail.vue
  20. 8 8
      src/views/device/list/index.vue
  21. 20 15
      src/views/device/version/detail.vue
  22. 3 3
      src/views/device/version/index.vue
  23. 5 5
      src/views/device/yxw/index.vue
  24. 9 14
      src/views/music/album/detail.vue
  25. 1 1
      src/views/music/album/index.vue
  26. 3 3
      src/views/music/anchor/detail.vue
  27. 1 1
      src/views/music/anchor/index.vue
  28. 24 30
      src/views/music/blog/detail.vue
  29. 9 10
      src/views/music/blog/index.vue
  30. 53 135
      src/views/music/choiceness/detail.vue
  31. 3 5
      src/views/music/choiceness/index.vue
  32. 4 2
      src/views/music/classify/index.vue
  33. 6 10
      src/views/music/list/detail.vue
  34. 4 1
      src/views/music/list/index.vue
  35. 48 18
      src/views/music/menu/detail.vue
  36. 19 7
      src/views/music/menu/index.vue
  37. 16 21
      src/views/music/program/detail.vue
  38. 17 11
      src/views/music/program/index.vue
  39. 1 1
      src/views/music/radio/detail.vue
  40. 2 2
      src/views/music/singer/detail.vue
  41. 6 0
      src/views/operation/agreement/detail.vue
  42. 6 0
      src/views/operation/agreement/index.vue
  43. 1 1
      src/views/operation/feedbacklist/detail.vue
  44. 1 0
      src/views/operation/recommend/detail.vue
  45. 67 46
      src/views/order/list/index.vue

+ 1 - 0
package.json

@@ -57,6 +57,7 @@
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
     "vue-meta": "2.4.0",
+    "vue-qr": "^4.0.9",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "3.4.9",
     "vuedraggable": "^2.24.3",

+ 0 - 55
src/api/content/banner.js

@@ -1,55 +0,0 @@
-import request from '@/utils/request'
-
-// 分页
-export function page(query){
-  return request({
-    url: `/appBanner/page`,
-    method: 'get',
-    params: query
-  })
-}
-
-// 新增
-export function submit(data){
-  return request({
-    url: `/appBanner/save`,
-    method: 'post',
-    data
-  })
-}
-
-// 修改上下架状态
-export function changeStatus(data){
-  return request({
-    url: `/appBanner/updateStatus`,
-    method: 'post',
-    data
-  })
-}
-
-// 删除
-export function remove(data){
-  return request({
-    url: `/appBanner/remove`,
-    method: 'post',
-    data
-  })
-}
-
-// 详情
-export function detail(query){
-  return request({
-    url: `/appBanner/get`,
-    method: 'get',
-    params: query
-  })
-}
-
-// 编辑
-export function edit(data){
-  return request({
-    url: `/appBanner/update`,
-    method: 'post',
-    data
-  })
-}

+ 35 - 0
src/api/content/video.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(data) {
+  return request({
+    url: `/admin/operate/page`,
+    method: 'post',
+    data
+  })
+}
+
+// 新增 编辑
+export function submit(data) {
+  return request({
+    url: `/admin/operate/saveOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/operate/getBullframeById/${id}`,
+    method: 'get'
+  })
+}
+
+// 上下架 删除
+export function change(id, status) {
+  return request({
+    url: `/admin/operate/hitOrSold/${id}/${status}`,
+    method: 'get'
+  })
+}

+ 4 - 4
src/api/device/category.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 
 // 查询分类列表
-export function categoryList(query) {
+export function list(query) {
   return request({
     url: `/device/manage/category/list`,
     method: 'get',
@@ -10,7 +10,7 @@ export function categoryList(query) {
 }
 
 // 添加设备类型
-export function categoryAdd(data) {
+export function create(data) {
   return request({
     url: `/device/manage/category/add`,
     method: 'post',
@@ -19,7 +19,7 @@ export function categoryAdd(data) {
 }
 
 // 编辑设备类型
-export function categoryEdit(data) {
+export function edit(data) {
   return request({
     url: `/device/manage/category/edit`,
     method: 'post',
@@ -28,7 +28,7 @@ export function categoryEdit(data) {
 }
 
 // 删除
-export function categoryDelete(id) {
+export function remove(id) {
   return request({
     url: `/device/manage/category/${id}`,
     method: 'delete'

+ 3 - 3
src/api/device/function.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 
 // 查询权限列表
-export function functionList(query) {
+export function list(query) {
   return request({
     url: `/device/manage/function/list`,
     method: 'get',
@@ -10,7 +10,7 @@ export function functionList(query) {
 }
 
 // 新增权限
-export function functionAdd(data) {
+export function create(data) {
   return request({
     url: `/device/manage/function/add`,
     method: 'post',
@@ -19,7 +19,7 @@ export function functionAdd(data) {
 }
 
 // 编辑权限
-export function functionEdit(data) {
+export function edit(data) {
   return request({
     url: `/device/manage/function/edit`,
     method: 'post',

+ 6 - 6
src/api/device/list.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 
 // 分页列表
-export function List(query) {
+export function list(query) {
   return request({
     url: `/device/manage/list/page`,
     method: 'get',
@@ -10,7 +10,7 @@ export function List(query) {
 }
 
 // 设备详情
-export function Detail(query) {
+export function detail(query) {
   return request({
     url: `/device/manage/view`,
     method: 'get',
@@ -19,7 +19,7 @@ export function Detail(query) {
 }
 
 // 删除设备
-export function Delete(id) {
+export function remove(id) {
   return request({
     url: `/device/manage/${id}`,
     method: 'delete'
@@ -27,7 +27,7 @@ export function Delete(id) {
 }
 
 // 添加设备
-export function Add(data) {
+export function create(data) {
   return request({
     url: `/device/manage/add`,
     method: 'post',
@@ -36,7 +36,7 @@ export function Add(data) {
 }
 
 // 编辑设备
-export function Edit(data) {
+export function edit(data) {
   return request({
     url: `/device/manage/edit`,
     method: 'post',
@@ -45,7 +45,7 @@ export function Edit(data) {
 }
 
 // 上下架
-export function upDown(data){
+export function change(data){
   return request({
     url: `/device/manage/batchChangerStatus`,
     method: 'post',

+ 1 - 1
src/common/main.scss

@@ -84,5 +84,5 @@ input::-webkit-inner-spin-button {
 }
 
 .el-tooltip__popper {
-  width: 500px;
+  max-width: 500px;
 }

+ 79 - 236
src/components/Editor/index.vue

@@ -2,77 +2,26 @@
   <div ref="body">
     <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess"
       :on-error="handleUploadError" :data="data" name="file" :show-file-list="false" :headers="headers"
-      style="display: none" ref="upload" v-if="isShow()">
+      style="display: none" ref="upload" v-if="type == 'url'">
     </el-upload>
-    <el-upload :action="audioUrl" :before-upload="handleBeforeAudio" :on-success="handleAudioSuccess"
-      :on-error="handleAudioError" :data="audioData" :show-file-list="false" :headers="headers" style="display: none"
-      ref="audio" v-if="isShow()" v-loading.fullscreen.lock="fullScreenLoading">
-    </el-upload>
-    <div class="editor" ref="editor" :style="styles"></div>
-
-    <!-- 弹窗 -->
-    <el-dialog :visible.sync="dialogVisible" title="选择音频" width="1000px">
-      <el-form inline size="mini">
-        <el-form-item label="音频类型:">
-          <el-select v-model="dialogForm.audioType" placeholder="请选择音频类型">
-            <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="dialogForm.platformId" placeholder="请选择资源平台" clearable>
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
-          </el-select>
+    <div class="editor" ref="editor" :style="styles" />
+
+    <!-- 视频弹出框 -->
+    <el-popover popper-class="ql-popover" width="398" ref="popover">
+      <el-form>
+        <el-form-item label="视频链接">
+          <el-input v-model="videoUrl" placeholder="请输入视频链接">
+            <template slot="append">
+              <Upload @upload="upload" />
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="付费状态:">
-          <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-button type="primary" icon="el-icon-upload2"
-            @click="$refs.audio.$children[0].$refs.input.click();">上传音频</el-button>
+        <el-form-item style="margin-top: 15px;">
+          <el-button @click="closeVideo">取消</el-button>
+          <el-button type="primary" @click="handleUploadSuccess()" :disabled="videoUrl == ''">确定</el-button>
         </el-form-item>
       </el-form>
-      <el-table :data="tableData" v-loading="loading">
-        <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="音频作者" align="center" show-overflow-tooltip>
-          <template slot-scope="scope">
-            <span>
-              {{ scope.row.singerName ? scope.row.singerName : '-' }}
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip>
-          <template slot-scope="scope">
-            <span>
-              {{ scope.row.songName ? scope.row.songName : '-' }}
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
-        <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
-        <el-table-column label="操作" align="center">
-          <template slot-scope="scope">
-            <el-button type="text" @click="handleChecked(scope.row)">选择</el-button>
-          </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>
+    </el-popover>
   </div>
 </template>
 
@@ -81,14 +30,13 @@ import Quill from "quill";
 import "quill/dist/quill.core.css";
 import "quill/dist/quill.snow.css";
 import "quill/dist/quill.bubble.css";
+import Upload from '../Upload/index.vue';
 import { getToken } from "@/utils/auth";
-import Audio from "@/store/modules/editor";
-Quill.register(Audio, true);
+import { View } from "@/store/modules/editor";
+Quill.register(View, true);
 
-import { list } from '@/api/operation/channel'
-import { platformMixin, isFreeMixin, channelMixin } from '@/mixin/index'
 export default {
-  mixins: [platformMixin, isFreeMixin, channelMixin],
+  components: { Upload },
   name: "Editor",
   props: {
     /* 编辑器的内容 */
@@ -111,11 +59,6 @@ export default {
       type: Boolean,
       default: false,
     },
-    // 上传文件大小限制(MB)
-    fileSize: {
-      type: Number,
-      default: 5,
-    },
     /* 类型(base64格式、url格式) */
     type: {
       type: String,
@@ -128,7 +71,6 @@ export default {
       fullScreenLoading: false,
       loading: false,
       uploadUrl: process.env.VUE_APP_BASE_API + "/system/file/picture/upload", // 上传的图片服务器地址
-      audioUrl: process.env.VUE_APP_BASE_API + "/system/file/mp3/upload", // 上传的音频服务器地址
       headers: {
         Authorization: "Bearer " + getToken()
       },
@@ -147,47 +89,27 @@ export default {
               ["bold", "italic", "underline", "strike"],       // 加粗 斜体 下划线 删除线
               ["blockquote", "code-block"],                    // 引用  代码块
               [{ list: "ordered" }, { list: "bullet" }],       // 有序、无序列表
-              // [{ indent: "-1" }, { indent: "+1" }],            // 缩进
+              // [{ indent: "-1" }, { indent: "+1" }],         // 缩进
               [{ size: ["small", false, "large", "huge"] }],   // 字体大小
               [{ header: [1, 2, 3, 4, 5, 6, false] }],         // 标题
               [{ color: [] }, { background: [] }],             // 字体颜色、字体背景颜色
               [{ align: [] }],                                 // 对齐方式
               ["clean"],                                       // 清除文本格式
-              ["link", "image", "video", "audio"]              // 链接、图片、视频
+              ["link", "image", "view"], // "audio"            // 链接、图片、视频
             ]
           }
         },
-        initAudioButton: function () {
-          const AudioButton = document.querySelector('.ql-audio')
-          AudioButton.classList.add('el-icon-headset')
-          AudioButton.style.cssText = "font-size: 16px; font-weight: bold"
+        // 自定义按钮
+        customButton: function (className, icon) {
+          const btn = document.querySelector(className)
+          btn.classList.add(icon)
+          btn.style.cssText = 'font-size: 16px; font-weight: bold'
         },
         placeholder: "请输入内容",
         readOnly: this.readOnly,
       },
-
-      // 弹窗
-      dialogVisible: false,
-      dialogForm: {
-        pageNum: 1,
-        pageSize: 10,
-        status: 1,
-        audioType: 2
-      },
-      // 列表
-      tableData: [],
-      total: 0,
-      // 音频类型
-      audioTypeOptions: [{
-        value: 2,
-        label: '广播电台'
-      }, {
-        value: 6,
-        label: '节目'
-      }, {
-        value: 11,
-        label: '歌曲'
-      }]
+      // 视频表单
+      videoUrl: ''
     };
   },
   computed: {
@@ -213,14 +135,6 @@ export default {
         }
       },
       immediate: true,
-    },
-    'dialogForm.audioType'(val) {
-      if (val) {
-        this.getPlatform({
-          audioType: val
-        })
-        this.getList()
-      }
     }
   },
   mounted() {
@@ -233,9 +147,10 @@ export default {
     init() {
       const editor = this.$refs.editor;
       this.Quill = new Quill(editor, this.options);
-      this.editorImage()
-      this.editorAudio()
-      this.options.initAudioButton()
+      // 自定义按钮
+      this.customEditor('image')
+      this.customEditor('view')
+      this.options.customButton('.ql-view', 'el-icon-video-camera')
       this.Quill.pasteHTML(this.currentValue);
       this.Quill.on("text-change", (delta, oldDelta, source) => {
         const html = this.$refs.editor.children[0].innerHTML;
@@ -255,147 +170,63 @@ export default {
         this.$emit("on-editor-change", eventName, ...args);
       });
     },
-    editorImage() {
-      // 如果设置了上传地址则自定义图片上传事件
-      if (this.type == 'url') {
-        let toolbar = this.Quill.getModule("toolbar");
-        toolbar.addHandler("image", (value) => {
-          this.uploadType = "image";
-          if (value) {
-            this.$refs.upload.$children[0].$refs.input.click();
-          } else {
-            this.quill.format("image", false);
-          }
-        });
-      }
-    },
-    handleBeforeUpload(file) {
-      this.data.multipartFile = file
-    },
-    handleUploadSuccess(res, file) {
-      // 获取富文本组件实例
-      let quill = this.Quill;
-      // 如果上传成功
-      if (res.code == 0) {
-        // 获取光标所在位置
-        let length = quill.getSelection().index;
-        // 插入图片  res.url为服务器返回的图片地址
-        quill.insertEmbed(length, "image", res.data);
-        // 调整光标到最后
-        quill.setSelection(length + 1);
-      } else {
-        this.$message.error("图片插入失败");
-      }
-    },
-    handleUploadError() {
-      this.$message.error("图片插入失败");
-    },
-    isShow() {
-      if (!this.readOnly) {
-        return this.type == 'url'
-      }
-    },
 
-    // 音频
-    editorAudio() {
+    // 自定义按钮
+    customEditor(key) {
       let toolbar = this.Quill.getModule("toolbar");
-      toolbar.addHandler("audio", (value) => {
+      toolbar.addHandler(key, (value) => {
         if (value) {
-          this.dialogVisible = true
-          this.getPlatform({
-            audioType: 2
-          })
-          this.getList()
+          if (key === 'image') { this.$refs.upload.$children[0].$refs.input.click() }
+          if (key === 'view') { this.$refs.popover.showPopper = true }
         } else {
-          this.quill.format("audio", false);
+          this.quill.format(key, false);
         }
       });
     },
 
-    handleBeforeAudio(file) {
-      this.fullScreenLoading = true
-      this.audioData.multipartFile = file
-    },
-
-    handleAudioSuccess(res) {
-      this.fullScreenLoading = false
-      let quill = this.Quill
-      if (res.code == 0) {
-        let length = quill.getSelection().index;
-        quill.insertEmbed(
-          length + 1,
-          'audio',
-          { src: res.data.url, name: res.data.realName },
-          "api"
-        );
-        quill.insertText(length + 2, "");
-        quill.setSelection(length + 2);
-      } else {
-        this.$message.error(res.message)
-      }
-    },
-
-    handleAudioError() {
-      this.fullScreenLoading = false
-      this.$message.error('插入失败')
+    // 上传视频
+    upload(e) {
+      this.videoUrl = e.file
     },
 
-    // 列表
-    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
-        }
-      })
+    // 上传图片之前
+    handleBeforeUpload(file) {
+      this.data.multipartFile = file
     },
 
-    // 搜索
-    getSearch() {
-      this.dialogForm.pageNum = 1
-      this.getList()
+    // 图片上传失败
+    handleUploadError() {
+      this.$message.error("图片插入失败");
     },
 
-    // 重置
-    getRefresh() {
-      this.dialogForm = {
-        pageNum: 1,
-        pageSize: 10,
-        status: 1,
-        audioType: 2
+    // 成功添加
+    handleUploadSuccess(res) {
+      // 获取富文本组件实例
+      let quill = this.Quill;
+      // 如果上传成功
+      if (quill.getSelection()) {
+        let length = quill.getSelection().index
+        let key = res ? "image" : "view"
+        let form = res ? res.data : this.videoUrl
+        quill.insertEmbed(length, key, form)
+        quill.setSelection(length + 1)
+        this.closeVideo()
+      } else {
+        this.$message.error("请先聚焦于富文本输入框,再插入视频")
       }
-      this.getList()
     },
 
-    // 选择音频
-    handleChecked(row) {
-      let quill = this.Quill
-      let length = quill.getSelection().index;
-      quill.insertEmbed(
-        length + 1,
-        'audio',
-        { src: '', name: row.audioName, poster: row.audioPic, id: row.audioId },
-        "api"
-      );
-      quill.insertText(length + 2, "");
-      quill.setSelection(length + 2);
-      this.$message.success('选择成功!')
+    // 关闭视频弹框
+    closeVideo() {
+      this.$refs.popover.showPopper = false
+      this.videoUrl = ''
     },
 
-    // 字典翻译
-    freeFormatter(row) {
-      return this.selectDictLabel(this.freeOptions, row.isFree)
-    },
-    platfromFormatter(row) {
-      return this.selectDictLabel(this.platformOptions, row.platformId)
-    },
   },
 };
 </script>
 
-<style>
+<style lang="scss">
 .editor,
 .ql-toolbar {
   white-space: pre-wrap !important;
@@ -489,4 +320,16 @@ export default {
 .ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
   content: '等宽字体';
 }
+
+.ql-popover {
+  top: 66px;
+  left: 300px;
+
+  .el-input-group__append,
+  .el-input-group__prepend {
+    color: #FFFFFF;
+    background-color: #1890ff;
+    border-color: #1890ff;
+  }
+}
 </style>

+ 3 - 31
src/mixin/index.js

@@ -37,10 +37,10 @@ const devMixin = {
 }
 
 // 设备模式
-const devTypeMixin = {
+const devModeMixin = {
   data() {
     return {
-      typeOptions: [{
+      modeOptions: [{
         value: 1,
         label: '蓝牙'
       }, {
@@ -435,33 +435,6 @@ const contentMixin = {
   }
 }
 
-// 奖励类型
-const rewardMixin = {
-  data() {
-    return {
-      rewardOptions: [{
-        //   value: 0,
-        //   label: '音乐套餐'
-        // }, {
-        //   value: 1,
-        //   label: '流量套餐'
-        // }, {
-        //   value: 2,
-        //   label: '亲子礼包'
-        // }, {
-        //   value: 3,
-        //   label: '音响实物'
-        // }, {
-        //   value: 4,
-        //   label: '积分'
-        // },{
-        //   value: 5,
-        //   label: '谢谢惠顾'
-      }]
-    }
-  }
-}
-
 // 分类
 const classifyMixin = {
   data() {
@@ -576,7 +549,7 @@ const systemMixin = {
 
 export {
   devMixin,
-  devTypeMixin,
+  devModeMixin,
   serviceTimeMixin,
   serviceTypeMixin,
   isFreeMixin,
@@ -591,7 +564,6 @@ export {
   albumTypeMixin,
   addressMixin,
   contentMixin,
-  rewardMixin,
   classifyMixin,
   currentMixin,
   coverMixin,

+ 33 - 16
src/router/index.js

@@ -166,22 +166,23 @@ export const dynamicRoutes = [{
   }]
 },
 // 内容管理
-// 文章管理
-// {
-//   path: '/content',
-//   component: Layout,
-//   hidden: true,
-//   permissions: ['content:article:list'],
-//   children: [{
-//     path: 'articleList/detail',
-//     component: () => import('@/views/content/article/detail'),
-//     name: 'articleListDetail',
-//     meta: {
-//       title: '文章详情',
-//       activeMenu: '/content/articleList'
-//     }
-//   }]
-// },
+// 视频管理
+{
+  path: '/content',
+  component: Layout,
+  hidden: true,
+  permissions: ['content:video:list'],
+  name: 'videoList',
+  children: [{
+    path: 'video/detail',
+    component: () => import('@/views/content/video/detail'),
+    name: 'videoDetail',
+    meta: {
+      title: '视频详情',
+      activeMenu: '/content/video'
+    }
+  }]
+},
 // 设备管理
 // 设备列表
 {
@@ -200,6 +201,22 @@ export const dynamicRoutes = [{
     }
   }]
 },
+{
+  path: '/device',
+  component: Layout,
+  hidden: true,
+  permissions: ['device:category:list'],
+  name: 'category',
+  children: [{
+    path: 'category/detail',
+    component: () => import('@/views/device/category/detail'),
+    name: 'categoryDetail',
+    meta: {
+      title: '大类详情',
+      activeMenu: '/device/category'
+    }
+  }]
+},
 // 设备升级
 {
   path: '/device',

+ 18 - 5
src/store/modules/editor.js

@@ -2,9 +2,8 @@ import Quill from 'quill';
 
 const BlockEmbed = Quill.import('blots/block/embed')
 
-class Audio extends BlockEmbed {
+export class Audio extends BlockEmbed {
   static create(value) {
-    // console.log(value, 'value')
     const node = super.create(value);
     node.setAttribute('src', value.src);
     node.setAttribute('controls', true);
@@ -15,7 +14,6 @@ class Audio extends BlockEmbed {
   }
   // 添加value获取当前的audio元素。拿到audio元素的属性。
   static value(domNode) {
-    // console.log(domNode, 'domNode');
     const value = {
       src: '',
       name: '',
@@ -31,9 +29,24 @@ class Audio extends BlockEmbed {
     return value;
   }
 }
-
 Audio.blotName = 'audio'
 Audio.className = 'ql-audio'
 Audio.tagName = 'audio'
 
-export default Audio
+// 视频按钮
+export class View extends BlockEmbed {
+  static create(value) {
+    const node = super.create(value)
+    node.setAttribute('controls', true);
+    node.setAttribute('src', value);
+    node.setAttribute('style', 'width: 100%; display: block')
+    return node;
+  }
+  static value(domNode) {
+    const value = domNode.getAttribute('src')
+    return value
+  }
+}
+View.blotName = 'view'
+View.className = 'ql-view'
+View.tagName = 'video'

+ 85 - 0
src/views/content/video/detail.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class='app-container'>
+    <el-form :model="form" ref="form" :rules="rules" label-width="auto" :disabled="disabled">
+      <el-form-item label="视频宣传名称:" prop="name">
+        <el-input v-model="form.name" placeholder="请输入视频宣传名称" />
+      </el-form-item>
+      <el-form-item label="设备型号:">
+        <el-input v-model="form.clientType" placeholder="请输入设备型号" />
+      </el-form-item>
+      <el-form-item label="视频宣传内容:" prop="content">
+        <Editor v-model="form.content" :min-height="250" :readOnly="disabled" />
+      </el-form-item>
+    </el-form>
+    <div style="margin-left: 120px;">
+      <el-button @click="close">取消</el-button>
+      <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { submit, detail } from '@/api/content/video'
+export default {
+  data() {
+    return {
+      form: {
+        id: this.$route.query.id
+      },
+      // 只读
+      disabled: Boolean(this.$route.query.boolean),
+      // 校验
+      rules: {
+        name: [{
+          required: true, message: '请输入视频宣传名称', trigger: 'blur'
+        }],
+        content: [{
+          required: true, message: '请输入视频宣传内容', trigger: 'blur'
+        }]
+      }
+    }
+  },
+  mounted() {
+    if (this.form.id) {
+      this.getDetail()
+    }
+  },
+  methods: {
+    // 详情
+    getDetail() {
+      detail(this.form.id).then(res => {
+        if (res.code === 0) {
+          this.form = res.data
+        }
+      })
+    },
+
+    // 确定
+    getSubmit() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          submit(this.form).then(res => {
+            if (res.code === 0) {
+              this.$message.success('提交成功!')
+              this.close()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    // 取消
+    close() {
+      this.$tab.closeOpenPage("/content/video");
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-form-item {
+  width: 500px;
+}
+</style>

+ 132 - 0
src/views/content/video/index.vue

@@ -0,0 +1,132 @@
+<template>
+  <div class='app-container'>
+    <!-- 搜索 -->
+    <el-form inline size="mini">
+      <el-form-item label="创建时间:">
+        <el-date-picker v-model="form.listDate" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss" />
+      </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" icon="el-icon-plus" plain @click="getDetail()">新增</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>
+      <el-table-column label="视频宣传名称" prop="name" align="center"></el-table-column>
+      <el-table-column label="更新时间" prop="updateTime" align="center"></el-table-column>
+      <el-table-column label="创建时间" prop="createTime" align="center"></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 type="text" @click="getDetail(scope.row.id)">编辑</el-button>
+          <el-button type="text" v-clipboard:copy="getUrl(scope.row)" v-clipboard:success="copySuccess">复制链接</el-button>
+          <el-button type="text" @click="getCode">下载二维码</el-button>
+          <el-button type="delete" @click="getDelete(scope.row)">删除</el-button>
+          <vue-qr :text="getUrl(scope.row)" ref="qrcode" style="display: none;" />
+        </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 VueQr from 'vue-qr'
+import { list, change } from '@/api/content/video'
+export default {
+  components: {
+    VueQr
+  },
+  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()
+    },
+
+    // 重置
+    getRefresh() {
+      this.form = {
+        pageNum: 1,
+        pageSize: 10
+      }
+      this.getList()
+    },
+
+    // 新增 查看 编辑
+    getDetail(id, boolean) {
+      this.$router.push({
+        path: `/content/video/detail`,
+        query: {
+          id: id,
+          boolean: boolean
+        }
+      })
+    },
+
+    // H5路径
+    getUrl(e) {
+      return `${e.copyUrl}pages/devices/detail?clientType=${e.clientType}&id=${e.id}`
+    },
+
+    // 复制成功
+    copySuccess() {
+      this.$message.success('复制成功!')
+    },
+
+    // 下载二维码
+    getCode() {
+      const url = this.$refs.qrcode.$el.src
+      this.$download.saveAs(url, '二维码.png')
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        change(row.id, 2).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      })
+    }
+  }
+}
+</script>

+ 1 - 1
src/views/device/article/detail.vue

@@ -132,6 +132,6 @@ export default {
 
 <style lang="scss" scoped>
 .el-form {
-  width: 550px;
+  width: 500px;
 }
 </style>

+ 201 - 0
src/views/device/category/detail.vue

@@ -0,0 +1,201 @@
+<template>
+  <div class='app-container'>
+    <el-form :model="form" ref="form" :rules="rules" label-width="auto">
+      <el-form-item label="大类名称:">
+        <el-input placeholder="请输入大类名称" />
+      </el-form-item>
+      <el-form-item label="设备分类:">
+        <el-select placeholder="请选择设备分类">
+          <el-option v-for="item in classOptions" :key="item.id" :value="item.id" :label="item.name" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="设备类型:">
+        <el-select placeholder="请选择设备类型">
+          <el-option v-for="item in typeOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否热门:">
+        <el-select placeholder="请选择是否热门">
+          <el-option v-for="item in hotOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="关联设备:">
+        <el-select placeholder="请选择要关联的设备">
+          <el-option />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="可见用户:">
+        <el-select placeholder="请选择可见用户">
+          <el-option v-for="item in pushOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="指定用户:">
+        <el-input placeholder="请输入指定用户" />
+      </el-form-item>
+      <el-row :gutter="10">
+        <el-col :span="12">
+          <el-form-item label="在线图片:">
+            <Upload listType="picture-card" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="离线图片:">
+            <Upload listType="picture-card" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-button type="primary" icon="el-icon-plus" @click="getAdd">新增</el-button>
+      <div class="children">
+        <el-form-item label="设备模式:">
+          <el-select placeholder="请选择设备模式">
+            <el-option v-for="item in modeOptions" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="功能权限:">
+          <el-select placeholder="请选择功能权限">
+            <el-option v-for="item in functionOptions" :key="item.id" :value="item.id" :label="item.name" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="连接方式:">
+          <el-select placeholder="请选择连接方式">
+            <el-option v-for="item in connectOptions" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="连接引导图:">
+              <Upload listType="picture-card" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="配对引导图:">
+              <Upload listType="picture-card" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="引导页:">
+          <Editor :min-height="250" />
+        </el-form-item>
+      </div>
+    </el-form>
+    <div>
+      <el-button>取消</el-button>
+      <el-button type="primary">确定</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { list as classList } from "@/api/device/class";
+import { list as functionList } from "@/api/device/function";
+import { devModeMixin } from '@/mixin/index'
+export default {
+  mixins: [devModeMixin],
+  data() {
+    return {
+      form: {
+        id: this.$route.query.id
+      },
+      // 校验
+      rules: {},
+      // 设备分类
+      classOptions: [],
+      // 设备类型
+      typeOptions: [{
+        value: 0,
+        label: '音响'
+      }, {
+        value: 1,
+        label: '耳机'
+      }, {
+        value: 2,
+        label: '穿戴'
+      }],
+      // 是否热门
+      hotOptions: [{
+        value: 0,
+        label: '否'
+      }, {
+        value: 1,
+        label: '是'
+      }],
+      // 可见用户
+      pushOptions: [{
+        value: 1,
+        label: '全部'
+      }, {
+        value: 3,
+        label: '指定'
+      }],
+      // 功能权限
+      functionOptions: [],
+      // 设备连接
+      connectOptions: [{
+        value: 2,
+        label: 'UPnP'
+      }, {
+        value: 3,
+        label: 'MQTT'
+      }],
+    }
+  },
+  mounted() {
+    this.getClassList()
+    this.getFunctionList()
+    if (this.form.id) {
+      this.getDetail()
+    }
+  },
+  methods: {
+    // 详情
+    getDetail() {
+      detail(this.form.id).then(res => {
+        if (res.code === 0) {
+          // this.form.typeList.map((i) => {
+          //     this.modeOptions[i.type - 1].disabled = true;
+          //   });
+        }
+      })
+    },
+    // 设备分类
+    getClassList() {
+      classList({
+        status: 1,
+      }).then((res) => {
+        if (res.code === 0) {
+          this.classOptions = res.data
+        }
+      })
+    },
+
+    // 功能权限
+    getFunctionList() {
+      functionList({
+        isDelete: 0
+      }).then((res) => {
+        if (res.code === 0) {
+          this.functionOptions = res.data
+        }
+      })
+    },
+
+    // 新增子表单
+    getAdd() {
+
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-form {
+  width: 550px;
+}
+
+.children {
+  position: relative;
+  border: 1px solid #e8e8e8;
+  padding: 25px 25px 0 0;
+  margin-bottom: 20px;
+}
+</style>

+ 70 - 145
src/views/device/category/index.vue

@@ -1,179 +1,104 @@
 <template>
-  <div class="app-container">
+  <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 placeholder="请输入大类名称" />
+      </el-form-item>
+      <el-form-item label="设备分类:">
+        <el-select placeholder="请选择设备分类">
+          <el-option />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="当前状态:">
+        <el-select placeholder="请选择当前状态">
+          <el-option />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否热门:">
+        <el-select placeholder="请选择是否热门">
+          <el-option />
+        </el-select>
+      </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="el-icon-plus" plain @click="getChange()"
-          v-hasPermi="['device:category:add']">新增</el-button>
+        <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="getCreate">新增</el-button>
+        <el-button type="primary">批量上架</el-button>
+        <el-button type="primary">批量下架</el-button>
       </el-form-item>
     </el-form>
-
-    <!-- 表格 -->
-    <el-table :data="tableData" v-loading="loading">
-      <el-table-column label="分类ID" prop="id" align="center" />
-      <el-table-column label="分类名称" prop="name" align="center" />
-      <el-table-column label="状态" align="center">
-        <template slot-scope="scope">
-          <el-tag :type="scope.row.status === 1 ? '' : 'danger'">{{ selectDictLabel(statusOptions, scope.row.status) }}</el-tag>
-        </template>
-      </el-table-column>
+    <!-- 列表 -->
+    <el-table>
+      <el-table-column type="selection"></el-table-column>
+      <el-table-column label="大类Id" align="center"></el-table-column>
+      <el-table-column label="大类名称" align="center"></el-table-column>
+      <el-table-column label="设备图片" align="center"></el-table-column>
+      <el-table-column label="设备分类" align="center"></el-table-column>
+      <el-table-column label="设备类型" align="center"></el-table-column>
+      <el-table-column label="是否热门" align="center"></el-table-column>
+      <el-table-column label="关联设备" align="center"></el-table-column>
+      <el-table-column label="当前状态" align="center"></el-table-column>
+      <el-table-column label="更新时间" align="center"></el-table-column>
+      <el-table-column label="创建时间" align="center"></el-table-column>
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
-          <el-button type="text" @click="getChange(scope.row)" v-hasPermi="['device:category:edit']">
-            编辑
-          </el-button>
-          <el-button type="delete" @click="getDelete(scope.row.id)" v-hasPermi="['device:category:delete']">
-            删除
-          </el-button>
+          <el-button type="text">查看</el-button>
+          <el-button type="text">上架</el-button>
+          <el-button type="text">下架</el-button>
+          <el-button type="text" @click="getEdit(scope.row)">编辑</el-button>
+          <el-button type="delete">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
-
-    <!-- 新增弹窗 -->
-    <el-dialog :title="title" :visible.sync="dialogVisible" width="500px" :before-close="getCancel">
-      <el-form :model="form" :rules="rules" ref="form" label-width="100px">
-        <el-form-item label="分类名称:" prop="name">
-          <el-input v-model="form.name" placeholder="请输入分类名称" />
-        </el-form-item>
-        <el-form-item label="启用状态:" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio :label="1">正常</el-radio>
-            <el-radio :label="2">停用</el-radio>
-          </el-radio-group>
-        </el-form-item>
-      </el-form>
-      <div slot="footer">
-        <el-button size="mini" @click="getCancel">取消</el-button>
-        <el-button type="primary" size="mini" @click="getCreate">确定</el-button>
-      </div>
-    </el-dialog>
   </div>
 </template>
 
 <script>
-import {
-  categoryList,
-  categoryAdd,
-  categoryEdit,
-  categoryDelete,
-} from "@/api/device/category";
 export default {
   data() {
     return {
-      // 遮罩层
-      loading: true,
-      // 表格数据
-      tableData: [],
-      // 弹窗
-      dialogVisible: false,
-      title: "",
-      // 提交表单
-      form: {
-        name: '',
-        status: 1
-      },
-      // 表单验证
-      rules: {
-        name: [
-          {
-            required: true,
-            message: "请输入分类名称",
-            trigger: "blur",
-          },
-        ],
-        status: [
-          {
-            required: true,
-            message: "请选择状态",
-            trigger: "change",
-          },
-        ],
-      },
-      // 设备状态
-      statusOptions: [{
-        value: 1,
-        label: '正常'
-      }, {
-        value: 2,
-        label: '停用'
-      }]
-    };
+
+    }
   },
   mounted() {
-    this.getList();
+
   },
   methods: {
-    // 分类列表
+    // 列表
     getList() {
-      this.loading = true;
-      categoryList().then((res) => {
-        if (res.code === 0) {
-          this.tableData = res.data;
-          this.loading = false;
-        }
-      });
+
     },
 
-    // 新增 / 编辑按钮
-    getChange(row) {
-      this.dialogVisible = true;
-      this.form = row ? row : {
-        name: '',
-        status: 1
-      };
-      this.title = row ? "编辑" : "新增";
+    // 搜索
+    getSearch() {
+
     },
 
-    // 取消
-    getCancel() {
-      this.$refs.form.clearValidate();
-      this.dialogVisible = false;
+    // 重置
+    getRefresh() {
+
     },
 
-    // 确定
+    // 新增
     getCreate() {
-      this.$refs.form.validate((valid) => {
-        if (valid) {
-          if (this.form.id) {
-            // 编辑
-            categoryEdit(this.form).then((res) => {
-              if (res.code === 0) {
-                this.$message.success("修改成功!");
-                this.dialogVisible = false;
-                this.getList();
-              }
-            });
-          } else {
-            // 新增
-            categoryAdd(this.form).then((res) => {
-              if (res.code === 0) {
-                this.$message.success("创建成功!");
-                this.dialogVisible = false;
-                this.getList();
-              }
-            });
-          }
-        } else {
-          return false;
-        }
-      });
+      this.getRouter()
     },
 
-    // 删除
-    getDelete(id) {
-      this.$confirm("确定要删除?", {
-        type: "warning",
+    // 编辑
+    getEdit(e) {
+      this.getRouter({
+        id: e.id
       })
-        .then(() => {
-          categoryDelete(id).then((res) => {
-            if (res.code === 0) {
-              this.getList();
-              this.$message.success("删除成功!");
-            }
-          });
-        })
-        .catch(() => { });
     },
-  },
-};
+
+    // 路由
+    getRouter(query) {
+      this.$router.push({
+        path: '/device/category/detail',
+        query: query
+      })
+    }
+  }
+}
 </script>

+ 180 - 0
src/views/device/class/index.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索 -->
+    <el-form inline label-width="100px" size="mini" @submit.native.prevent>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-plus" plain @click="getChange()"
+          v-hasPermi="['device:category:add']">新增</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 表格 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column label="分类ID" prop="id" align="center" />
+      <el-table-column label="分类名称" prop="name" align="center" />
+      <el-table-column label="状态" align="center">
+        <template slot-scope="scope">
+          <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">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getChange(scope.row)" v-hasPermi="['device:category:edit']">
+            编辑
+          </el-button>
+          <el-button type="delete" @click="getDelete(scope.row.id)" v-hasPermi="['device:category:delete']">
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 新增弹窗 -->
+    <el-dialog :title="title" :visible.sync="dialogVisible" width="500px" :before-close="getCancel">
+      <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+        <el-form-item label="分类名称:" prop="name">
+          <el-input v-model="form.name" placeholder="请输入分类名称" />
+        </el-form-item>
+        <el-form-item label="启用状态:" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio :label="1">正常</el-radio>
+            <el-radio :label="2">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button size="mini" @click="getCancel">取消</el-button>
+        <el-button type="primary" size="mini" @click="getCreate">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  list,
+  create,
+  edit,
+  remove,
+} from "@/api/device/class";
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 表格数据
+      tableData: [],
+      // 弹窗
+      dialogVisible: false,
+      title: "",
+      // 提交表单
+      form: {
+        name: '',
+        status: 1
+      },
+      // 表单验证
+      rules: {
+        name: [
+          {
+            required: true,
+            message: "请输入分类名称",
+            trigger: "blur",
+          },
+        ],
+        status: [
+          {
+            required: true,
+            message: "请选择状态",
+            trigger: "change",
+          },
+        ],
+      },
+      // 设备状态
+      statusOptions: [{
+        value: 1,
+        label: '正常'
+      }, {
+        value: 2,
+        label: '停用'
+      }]
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    // 分类列表
+    getList() {
+      this.loading = true;
+      list().then((res) => {
+        if (res.code === 0) {
+          this.tableData = res.data;
+          this.loading = false;
+        }
+      });
+    },
+
+    // 新增 / 编辑按钮
+    getChange(row) {
+      this.dialogVisible = true;
+      this.form = row ? row : {
+        name: '',
+        status: 1
+      };
+      this.title = row ? "编辑" : "新增";
+    },
+
+    // 取消
+    getCancel() {
+      this.$refs.form.clearValidate();
+      this.dialogVisible = false;
+    },
+
+    // 确定
+    getCreate() {
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          if (this.form.id) {
+            // 编辑
+            edit(this.form).then((res) => {
+              if (res.code === 0) {
+                this.$message.success("修改成功!");
+                this.dialogVisible = false;
+                this.getList();
+              }
+            });
+          } else {
+            // 新增
+            create(this.form).then((res) => {
+              if (res.code === 0) {
+                this.$message.success("创建成功!");
+                this.dialogVisible = false;
+                this.getList();
+              }
+            });
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+
+    // 删除
+    getDelete(id) {
+      this.$confirm("确定要删除?", {
+        type: "warning",
+      })
+        .then(() => {
+          remove(id).then((res) => {
+            if (res.code === 0) {
+              this.getList();
+              this.$message.success("删除成功!");
+            }
+          });
+        })
+        .catch(() => { });
+    },
+  },
+};
+</script>

+ 5 - 5
src/views/device/function/index.vue

@@ -53,7 +53,7 @@
 </template>
 
 <script>
-import { functionList, functionAdd, functionEdit } from "@/api/device/function";
+import { list, create, edit } from "@/api/device/function";
 export default {
   dicts: ["sys_normal_disable"],
   data() {
@@ -96,7 +96,7 @@ export default {
     // 权限列表
     getList() {
       this.loading = true;
-      functionList({ isDelete: 0 }).then((res) => {
+      list({ isDelete: 0 }).then((res) => {
         if (res.code === 0) {
           this.tableData = res.data;
           this.loading = false;
@@ -129,7 +129,7 @@ export default {
         if (valid) {
           if (this.form.id) {
             // 编辑
-            functionEdit(this.form).then((res) => {
+            edit(this.form).then((res) => {
               if (res.code === 0) {
                 this.$message.success("修改成功!");
                 this.dialogVisible = false;
@@ -138,7 +138,7 @@ export default {
             });
           } else {
             // 新增
-            functionAdd(this.form).then((res) => {
+            create(this.form).then((res) => {
               if (res.code === 0) {
                 this.$message.success("创建成功!");
                 this.dialogVisible = false;
@@ -156,7 +156,7 @@ export default {
     getDelete(row) {
       this.form = row;
       this.form.isDelete = 1;
-      functionEdit(this.form).then((res) => {
+      edit(this.form).then((res) => {
         if (res.code === 0) {
           this.$message.success("已删除!");
           this.getList();

+ 56 - 19
src/views/device/list/detail.vue

@@ -7,8 +7,12 @@
       <el-form-item label="设备名称:" prop="name">
         <el-input v-model="form.name" placeholder="请输入设备名称" />
       </el-form-item>
-      <el-form-item label="蓝牙名称:" prop="bluetoothName">
-        <el-input v-model="form.bluetoothName" placeholder="请输入蓝牙名称" />
+      <el-form-item label="蓝牙名称:" prop="bluetoothNames">
+        <el-tag v-for="(item, index) in form.bluetoothNames" :key="item" closable :disable-transition="false"
+          @close="handleClose(index)" style="margin-right: 10px;">{{ item }}</el-tag>
+        <el-input v-if="inputVisible" v-model="bluetoothName" ref="saveTagInput" @input="handleInput"
+          @keyup.enter.native="handleInputConfirm" @blur="handleInputConfirm" style="width: 100px" />
+        <el-button v-else @click="showInput" size="mini">+ 新增</el-button>
       </el-form-item>
       <el-form-item label="制造商:" prop="manufacturer">
         <el-select v-model="form.manufacturer" placeholder="请选择设备制造商" clearable>
@@ -50,8 +54,8 @@
       <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-select v-model="item.type" placeholder="请选择设备模式" @change="getTypeChange(item)">
-            <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)"
+          <el-select v-model="item.type" placeholder="请选择设备模式" @change="getTypeChange">
+            <el-option v-for="item in modeOptions" :key="item.value" :label="item.label" :value="Number(item.value)"
               :disabled="item.disabled" />
           </el-select>
         </el-form-item>
@@ -100,14 +104,14 @@
 </template>
 
 <script>
-import { categoryList } from "@/api/device/category";
-import { functionList } from "@/api/device/function";
-import { Add, Detail, Edit } from "@/api/device/list";
-import { devTypeMixin } from "@/mixin/index";
+import { list as classList } from "@/api/device/class";
+import { list as functionList } from "@/api/device/function";
+import { create, detail, edit } from "@/api/device/list";
+import { devModeMixin } from "@/mixin/index";
 import Editor from "@/components/Editor/index";
 
 export default {
-  mixins: [devTypeMixin],
+  mixins: [devModeMixin],
   components: {
     Editor
   },
@@ -123,12 +127,17 @@ export default {
             functionList: [],
           },
         ],
+        bluetoothNames: []
       },
+      // 显示蓝牙输入框
+      inputVisible: false,
+      // 蓝牙名称
+      bluetoothName: '',
       // 表单验证
       rules: {
         clientType: [{ required: true, message: "请输入设备型号", trigger: "blur" }],
         name: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
-        bluetoothName: [{ required: true, message: '请输入蓝牙名称', trigger: 'blur' }],
+        bluetoothNames: [{ type: 'array', required: true, message: '请输入蓝牙名称', trigger: 'blur' }],
         isHot: [{ required: true, message: "是否热门", trigger: "change" }],
         categoryId: [{ required: true, message: "请选择设备分类", trigger: "change" }],
         deviceType: [{ required: true, message: "请选择设备类型", trigger: 'change' }],
@@ -191,7 +200,7 @@ export default {
       }
     });
     // 设备类型
-    categoryList({
+    classList({
       status: 1,
     }).then((res) => {
       if (res.code === 0) {
@@ -203,19 +212,47 @@ export default {
     // 详情
     getList() {
       if (this.$route.query.id) {
-        Detail({
+        detail({
           id: this.$route.query.id,
         }).then((res) => {
           if (res.code === 0) {
             this.form = res.data;
             this.form.typeList.map((i) => {
-              this.typeOptions[i.type - 1].disabled = true;
+              this.modeOptions[i.type - 1].disabled = true;
             });
           }
         });
       }
     },
 
+    // 删除蓝牙名称
+    handleClose(index) {
+      this.form.bluetoothNames.splice(index, 1)
+    },
+
+    // 显示输入框
+    showInput() {
+      this.inputVisible = true
+      this.$nextTick(() => {
+        this.$refs.saveTagInput.$refs.input.focus()
+      })
+    },
+
+    // 禁止输入逗号
+    handleInput(e) {
+      this.bluetoothName = e.replace(/[,,]/g, "")
+    },
+
+    // 保存蓝牙名称
+    handleInputConfirm() {
+      let inputValue = this.bluetoothName
+      if (inputValue) {
+        this.form.bluetoothNames.push(inputValue)
+      }
+      this.inputVisible = false
+      this.bluetoothName = ''
+    },
+
     // 上传设备图片
     handleUploadImg(e, key) {
       key === "online"
@@ -229,7 +266,7 @@ export default {
     },
 
     // 选中一个设备类型就从数组中去掉
-    getTypeChange(item) {
+    getTypeChange() {
       for (let i in this.typeOptions) {
         this.typeOptions[i].disabled = false
       }
@@ -238,8 +275,8 @@ export default {
       this.$set(item, 'guidePageContent', '')
       this.form.typeList.map(i => {
         if (i.type) {
-          let index = this.typeOptions.findIndex(j => j.value == i.type)
-          this.typeOptions[index].disabled = true
+          let index = this.modeOptions.findIndex(j => j.value == i.type)
+          this.modeOptions[index].disabled = true
         }
       })
     },
@@ -257,7 +294,7 @@ export default {
     // 删除子表单
     getDelete(index) {
       this.form.typeList.splice(index, 1);
-      this.typeOptions[index].disabled = false;
+      this.modeOptions[index].disabled = false;
     },
 
     // 取消
@@ -271,7 +308,7 @@ export default {
         if (valid) {
           if (this.$route.query.id) {
             // 编辑
-            Edit(this.form).then((res) => {
+            edit(this.form).then((res) => {
               if (res.code === 0) {
                 this.$message.success("修改成功!");
                 this.getCancel();
@@ -279,7 +316,7 @@ export default {
             });
           } else {
             // 新建
-            Add(this.form).then((res) => {
+            create(this.form).then((res) => {
               if (res.code === 0) {
                 this.$message.success("提交成功!");
                 this.getCancel();

+ 8 - 8
src/views/device/list/index.vue

@@ -84,9 +84,9 @@
 </template>
 
 <script>
-import { List, Delete, upDown } from '@/api/device/list'
+import { list, remove, change } from '@/api/device/list'
 import { devMixin, onOrOffMixin } from '@/mixin/index'
-import { categoryList } from "@/api/device/category";
+import { list as classList } from "@/api/device/class";
 export default {
   mixins: [devMixin, onOrOffMixin],
   data() {
@@ -131,13 +131,13 @@ export default {
   },
   mounted() {
     this.getList()
-    this.getCategory()
+    this.getClass()
   },
   methods: {
     // 列表
     getList() {
       this.loading = true
-      List(this.form).then(res => {
+      list(this.form).then(res => {
         this.tableData = res.data.records
         this.total = res.data.total
         this.loading = false
@@ -167,8 +167,8 @@ export default {
     },
 
     // 设备分类
-    getCategory() {
-      categoryList().then(res => {
+    getClass() {
+      classList().then(res => {
         this.categoryOptions = res.data
       })
     },
@@ -180,7 +180,7 @@ export default {
       }
       let title = key === 1 ? '上架' : '下架'
       this.changeForm.type = key
-      upDown(this.changeForm).then(res => {
+      change(this.changeForm).then(res => {
         if (res.code === 0) {
           this.$message.success(`${title}成功!`)
           this.getList()
@@ -217,7 +217,7 @@ export default {
       this.$confirm('确定要删除?', {
         type: 'warning'
       }).then(() => {
-        Delete(id).then(res => {
+        remove(id).then(res => {
           if (res.code === 0) {
             this.getList()
             this.$message.success('删除成功!')

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

@@ -8,24 +8,24 @@
       </el-form-item>
       <el-form-item prop="type" label="设备模式:">
         <el-select v-model="form.type" placeholder="请选择设备模式">
-          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
+          <el-option v-for="item in modeOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
       <el-form-item prop="version" label="版本号:">
         <el-input v-model="form.version" placeholder="请输入版本号" />
       </el-form-item>
-      <el-form-item label="上传类型:">
-        <el-select v-model="listType" placeholder="请选择上传类型" @change="handleChange">
+      <el-form-item prop="fileType" label="上传类型:">
+        <el-select v-model="form.fileType" placeholder="请选择上传类型">
           <el-option v-for="item in updateOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item prop="url" label="下载路径:">
-        <el-row type="flex" justify="space-between">
-          <el-col :span="16">
+        <el-row>
+          <el-col :span="18">
             <el-input v-model="form.url" placeholder="请输入 或 上传下载路径" clearable />
           </el-col>
           <el-col :span="6">
-            <Upload :listType="listType" :accept="accept" @upload="getUpload" style="float:right" />
+            <Upload :listType="listType" :accept="accept" @upload="getUpload" />
           </el-col>
         </el-row>
       </el-form-item>
@@ -68,15 +68,16 @@
 
 <script>
 import { getDetailInfo, updateEdit, getVersionAdd } from "@/api/device/version";
-import { devMixin, devTypeMixin } from '@/mixin/index'
+import { devMixin, devModeMixin } from '@/mixin/index'
 export default {
-  mixins: [devMixin, devTypeMixin],
+  mixins: [devMixin, devModeMixin],
   data() {
     return {
       // 遮罩层
       loading: false,
       form: {
         id: this.$route.query.id,
+        fileType: 1,
         url: "",
       },
       // 指定用户表单中间参数
@@ -92,6 +93,9 @@ export default {
         version: [{
           required: true, message: "请输入版本号", trigger: "blur"
         }],
+        fileType: [{
+          required: true, message: '请选择上传类型', trigger: 'change'
+        }],
         url: [{
           required: true, message: "请输入 或 上传下载路径", trigger: "change"
         }],
@@ -129,10 +133,10 @@ export default {
       }],
       // 上传类型
       updateOptions: [{
-        value: 'text',
+        value: 1,
         label: '文件'
       }, {
-        value: 'zip',
+        value: 2,
         label: '文件夹'
       }],
       listType: 'text',
@@ -140,6 +144,12 @@ export default {
       accept: '.bin'
     };
   },
+  watch: {
+    'form.fileType'(val) {
+      this.listType = val === 1 ? 'text' : 'zip'
+      this.accept = val === 1 ? '.bin' : '.zip'
+    }
+  },
   mounted() {
     if (this.form.id) {
       getDetailInfo({
@@ -158,11 +168,6 @@ export default {
       this.form.url = e.file;
     },
 
-    // 上传类型
-    handleChange(e) {
-      this.accept = e === 'text' ? '.bin' : '.zip'
-    },
-
     // 提交
     getSubmit() {
       this.$refs.form.validate((valid) => {

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

@@ -53,9 +53,9 @@
 
 <script>
 import { getPageList, getVersionDelete } from '@/api/device/version'
-import { devMixin, devTypeMixin } from '@/mixin/index'
+import { devMixin, devModeMixin } from '@/mixin/index'
 export default {
-  mixins: [devMixin, devTypeMixin],
+  mixins: [devMixin, devModeMixin],
   data() {
     return {
       // 遮罩层
@@ -129,7 +129,7 @@ export default {
 
     // 字典翻译
     typeFormatter(row) {
-      return row.listType.map(i => this.selectDictLabel(this.typeOptions, i)).join(',')
+      return row.listType.map(i => this.selectDictLabel(this.modeOptions, i)).join(',')
     }
   }
 }

+ 5 - 5
src/views/device/yxw/index.vue

@@ -11,9 +11,9 @@
       <el-form-item label="设备标识:">
         <el-input v-model="form.deviceMac" placeholder="请输入设备标识" clearable />
       </el-form-item>
-      <el-form-item label="设备类型:">
+      <el-form-item label="设备模式:">
         <el-select v-model="form.deviceType" placeholder="请选择设备类型" clearable>
-          <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" />
+          <el-option v-for="item in modeOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
@@ -43,7 +43,7 @@
       <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" />
+      <el-table-column prop="type" label="设备模式" align="center" />
       <el-table-column prop="createTimeStr" label="创建时间" align="center" />
       <el-table-column prop="updateTimeStr" label="激活时间" align="center" />
       <el-table-column prop="statusStr" label="当前状态" align="center" />
@@ -67,9 +67,9 @@
 
 <script>
 import { getYxwPage, getYxwAdd } from "@/api/device/yxw";
-import { devTypeMixin } from '@/mixin/index'
+import { devModeMixin } from '@/mixin/index'
 export default {
-  mixins: [devTypeMixin],
+  mixins: [devModeMixin],
   data() {
     return {
       // 遮罩层

+ 9 - 14
src/views/music/album/detail.vue

@@ -2,10 +2,10 @@
   <div class="app-container">
     <el-form class="form" :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
       <el-form-item label="专辑名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入专辑名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入专辑名称" />
       </el-form-item>
       <el-form-item label="专辑介绍" prop="description">
-        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="100"
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="300"
           show-word-limit placeholder="请输入专辑介绍" />
       </el-form-item>
       <el-form-item label="专辑类型:" prop="albumType">
@@ -111,24 +111,19 @@ export default {
     var checkPrice = (rule, value, callback) => {
       if (!value) {
         callback(new Error('请输入原价'))
-      } else if (value.toString().length > 10) {
-        callback(new Error('字符长度不超过10个'))
-      } else if (this.form.discount && value < this.form.discount) {
-        callback(new Error('原价必须大于折扣价'))
       } else {
+        if (this.form.discount && value <= this.form.discount) {
+          callback(new Error('原价必须大于折扣价'))
+        }
         callback()
       }
     }
     // 判断折扣价是否小于原价
     var checkDiscount = (rule, value, callback) => {
-      if (value) {
-        if (value.toString().length > 10) {
-          callback(new Error('字符长度不超过10个'))
-        } else if (this.form.price && value > this.form.price) {
-          callback(new Error('折扣价必须小于原价'))
-        } else {
-          callback()
-        }
+      if (this.form.price && value >= this.form.price) {
+        callback(new Error('折扣价必须小于原价'))
+      } else {
+        callback()
       }
     }
     return {

+ 1 - 1
src/views/music/album/index.vue

@@ -45,7 +45,7 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading" @selection-change="handleSelect">
       <el-table-column type="selection" align="center" />
-      <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="专辑Id" prop="id" align="center" show-overflow-tooltip />
       <el-table-column label="专辑名称" prop="name" align="center" show-overflow-tooltip />
       <el-table-column label="专辑封面" align="center" width="100px">
         <template slot-scope="scope">

+ 3 - 3
src/views/music/anchor/detail.vue

@@ -5,13 +5,13 @@
         <el-input v-model="form.nickname" placeholder="请输入主播名称" />
       </el-form-item>
       <el-form-item label="主播简介:" prop="description">
-        <el-input v-model="form.description" type="textarea" rows="5" maxlength="100" show-word-limit
+        <el-input v-model="form.description" type="textarea" rows="5" maxlength="300" show-word-limit
           placeholder="请输入主播简介" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
         <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label"
+            :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="主播头像:" prop="avatar">

+ 1 - 1
src/views/music/anchor/index.vue

@@ -26,7 +26,7 @@
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
-      <el-table-column label="ID" prop="id" align="center" />
+      <el-table-column label="主播Id" prop="id" align="center" />
       <el-table-column label="主播名称" prop="nickname" align="center" />
       <el-table-column label="主播头像" align="center" width="100px">
         <template slot-scope="scope">

+ 24 - 30
src/views/music/blog/detail.vue

@@ -2,13 +2,12 @@
   <div class="app-container">
     <el-form class="form" :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
       <el-form-item label="播客名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入播客名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入播客名称" />
       </el-form-item>
       <el-form-item label="主播名称:" prop="podcasterIds">
-        <el-select v-model="form.podcasterIds" multiple filterable remote reserve-keyword
-          placeholder="请输入主播名称" :remote-method="getSelect" no-data-text="请新增主播">
-          <el-option v-for="item in anchorOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+        <el-select v-model="form.podcasterIds" multiple filterable remote reserve-keyword placeholder="请输入主播名称"
+          :remote-method="getSelect" no-data-text="请新增主播">
+          <el-option v-for="item in anchorOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="播客分类:" prop="categoryIds">
@@ -18,27 +17,25 @@
         </el-select>
       </el-form-item>
       <el-form-item label="播客介绍:" prop="description">
-        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10}"
-          maxlength="300" show-word-limit placeholder=" 请输入播客介绍" />
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="300"
+          show-word-limit placeholder=" 请输入播客介绍" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
         <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label"
+            :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="付费类型:" prop="charging">
         <el-select v-model="form.charging" placeholder="请选择付费类型">
-          <el-option v-for="item in payTypeOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in payTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item v-if="form.charging !== 1" label="原价:" prop="price">
         <el-input-number v-model="form.price" placeholder="请输入原价" :min="1" :precision="2" :controls="false" />
       </el-form-item>
       <el-form-item v-if="form.charging !== 1" label="折扣价:" prop="discountedPrice">
-        <el-input-number v-model="form.discountedPrice" placeholder="请输入折扣价" :min="1" :precision="2"
-          :controls="false" />
+        <el-input-number v-model="form.discountedPrice" placeholder="请输入折扣价" :min="1" :precision="2" :controls="false" />
       </el-form-item>
       <el-form-item label="播客封面" prop="thumb">
         <Upload listType="picture-card" :url="form.thumb" @upload="upload" :disabled="disabled" />
@@ -73,14 +70,13 @@
         </el-form-item>
         <el-form-item label="付费类型:">
           <el-select v-model="dialogForm.isFree" placeholder="请选择付费类型" clearable>
-            <el-option v-for="item in freeOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
+            <el-option v-for="item in freeOptions" :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.filter(i => !i.joinType.includes('1'))" :key="item.value" :value="item.value"
-              :label="item.label" />
+            <el-option v-for="item in platformOptions.filter(i => !i.joinType.includes('1'))" :key="item.value"
+              :value="item.value" :label="item.label" />
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -103,8 +99,8 @@
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
-        :limit.sync="dialogForm.pageSize" @pagination="getList" />
+      <pagination v-show="total > 0" :total="total" :page.sync="dialogForm.pageNum" :limit.sync="dialogForm.pageSize"
+        @pagination="getList" />
     </el-dialog>
   </div>
 </template>
@@ -120,20 +116,19 @@ export default {
     var checkPrice = (rule, value, callback) => {
       if (!value) {
         callback(new Error('请输入原价'))
-      } else if (value.toString().length > 10) {
-        callback(new Error('字符长度不超过10个'))
-      } else if (this.form.discountedPrice) {
-        value > this.form.discountedPrice ? callback() : callback(new Error('原价必须大于折扣价'))
+      } else {
+        if (this.form.discountedPrice && value <= this.form.discountedPrice) {
+          callback(new Error('原价必须大于折扣价'))
+        }
+        callback()
       }
     }
     // 判断折扣价是否小于原价
     var checkDiscount = (rule, value, callback) => {
-      if (value) {
-        if (value.toString().length > 10) {
-          callback(new Error('字符长度不超过10个'))
-        } else if (this.form.price) {
-          value < this.form.price ? callback() : callback(new Error('折扣价必须小于原价'))
-        }
+      if (this.form.price && value >= this.form.price) {
+        callback(new Error('折扣价必须小于原价'))
+      } else {
+        callback()
       }
     }
     return {
@@ -374,7 +369,6 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-
 .form {
   .el-form-item {
     width: 500px;

+ 9 - 10
src/views/music/blog/index.vue

@@ -2,6 +2,9 @@
   <div class="app-container">
     <!-- 搜索 -->
     <el-form inline size="mini">
+      <el-form-item label="播客Id:">
+        <el-input v-model="form.id" placeholder="请输入播客Id" clearable />
+      </el-form-item>
       <el-form-item label="播客名称:">
         <el-input v-model="form.podcastName" placeholder="请输入播客名称" clearable />
       </el-form-item>
@@ -10,20 +13,17 @@
       </el-form-item>
       <el-form-item label="付费类型:">
         <el-select v-model="form.payType" placeholder="请选择付费类型" clearable>
-          <el-option v-for="item in payTypeOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in payTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in onOrOffOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in onOrOffOptions" :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-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -40,7 +40,7 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading" @selection-change="handleSelect">
       <el-table-column type="selection" align="center" />
-      <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="播客Id" prop="id" align="center" show-overflow-tooltip />
       <el-table-column label="播客名称" prop="name" align="center" show-overflow-tooltip />
       <el-table-column label="播客封面" align="center" width="100px">
         <template slot-scope="scope">
@@ -77,7 +77,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>
@@ -207,5 +207,4 @@ export default {
 }
 </script>
 
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>

+ 53 - 135
src/views/music/choiceness/detail.vue

@@ -1,42 +1,46 @@
 <template>
   <div class="app-container">
-    <el-form :model="form" ref="form" :rules="rules" label-width="100px" style="width: 500px"
-      :disabled="disabled">
+    <el-form class="form" :model="form" ref="form" :rules="rules" label-width="auto" :disabled="disabled">
       <el-form-item label="电台名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入电台名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入电台名称" />
       </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-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-form-item label="直播流:" prop="liveBrocastList" style="width: 100%;">
+        <el-button type="primary" icon="el-icon-plus" @click="getPush">添加</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">
+          <el-table-column label="节目名称" align="center" show-overflow-tooltip>
             <template slot-scope="scope">
-              <el-input v-model="scope.row.name" />
+              <span v-if="disabled">{{ scope.row.name }}</span>
+              <el-input v-else v-model="scope.row.name" />
             </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">
-              <el-time-picker v-model="scope.row.startTime" start-placeholder="开始时间" end-placeholder="结束时间"
+              <span v-if="disabled">{{ scope.row.startTime }}</span>
+              <el-time-picker v-else 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="结束时间"
+              <span v-if="disabled">{{ scope.row.endTime }}</span>
+              <el-time-picker v-else 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="text" @click="getDialog(scope.$index)">关联</el-button>
               <el-button type="delete" @click="getDelete(scope.row, scope.$index)">删除</el-button>
             </template>
           </el-table-column>
@@ -54,20 +58,17 @@
       <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-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-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-option v-for="item in contentOptions" :key="item.value" :value="item.value" :label="item.label" />
           </el-select>
         </el-form-item>
         <el-form-item label="电台名称:">
@@ -83,15 +84,8 @@
       </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="电台ID" prop="id" key="id" align="center" show-overflow-tooltip />
+        <el-table-column label="电台名称" prop="name" key="name" align="center" show-overflow-tooltip />
         <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" />
@@ -99,49 +93,28 @@
         </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="status" align="center" :formatter="statusFormatter" />
         <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 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" />
+        <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 { addressMixin, contentMixin, platformMixin } from '@/mixin/index'
+import { list, detail, submit } from '@/api/music/choiceness'
+import { addressMixin, contentMixin, onOrOffMixin } from '@/mixin/index'
 export default {
-  mixins: [addressMixin, contentMixin, platformMixin],
+  mixins: [addressMixin, contentMixin, onOrOffMixin],
   data() {
     return {
       // 遮罩层
@@ -156,23 +129,20 @@ export default {
       dialogForm: {
         pageNum: 1,
         pageSize: 10,
-        platformId: 1
+        platformId: 4
       },
       total: 0,
       // 列表
       tableData: [],
+      // 只读
+      disabled: false,
+      // 关联索引
+      index: null,
       // 资源平台
       platformOptions: [{
-        value: 1,
-        label: '蜻蜓'
-      }, {
         value: 4,
         label: '海外电台'
       }],
-      // 只读
-      disabled: false,
-      // 阻止重复点击
-      index: null,
       // 校验
       rules: {
         name: [{
@@ -190,19 +160,12 @@ export default {
       }
     }
   },
-  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()
     }
-    this.getPlatform({})
   },
   methods: {
     // 详情
@@ -228,16 +191,21 @@ export default {
       })
     },
 
+    // 新增直播流
+    getPush() {
+      this.form.liveBrocastList.push({})
+    },
+
     // 弹窗 
-    getDialog() {
+    getDialog(index) {
       this.dialogVisible = true
+      this.index = index
       this.getList()
     },
 
     // 关闭弹窗
     beforeClose() {
       this.dialogVisible = false
-      this.index = null
     },
 
     // 列表
@@ -268,39 +236,13 @@ export default {
       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
-      })
+    getChecked(row) {
+      let e = this.form.liveBrocastList[this.index]
+      this.$set(e, 'subbroadcastId', row.id)
+      this.$set(e, 'subbroadcastName', row.name)
+      this.$set(e, 'platformId', row.platformId)
+      this.$set(e, 'status', row.status)
     },
 
     // 取消
@@ -332,7 +274,11 @@ export default {
       return row.platformId === 1 ? this.selectDictLabel(this.contentOptions, row.contentClassifyId) : '/'
     },
     platformFormatter(row) {
-      return this.selectDictLabel(this.platformTypeOptions, row.platformId)
+      return this.selectDictLabel(this.platformOptions, row.platformId)
+    },
+    // 当前状态
+    statusFormatter(row) {
+      return this.selectDictLabel(this.onOrOffOptions, row.status)
     },
 
     // 是否只读
@@ -349,35 +295,7 @@ export default {
 </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;
+.form .el-form-item {
+  width: 500px;
 }
 </style>

+ 3 - 5
src/views/music/choiceness/index.vue

@@ -7,8 +7,7 @@
       </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-option v-for="item in onOrOffOptions" :key="item.value" :label="item.label" :value="item.value" clearable />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -53,7 +52,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>
@@ -160,5 +159,4 @@ export default {
 }
 </script>
 
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>

+ 4 - 2
src/views/music/classify/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:classify:add']">新增</el-button>
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDialog('新增')"
+      v-hasPermi="['music:classify:add']">新增</el-button>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
       <el-table-column type="index" label="序号" align="center" />
@@ -12,7 +13,8 @@
       </el-table-column>
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
-          <el-button type="text" @click="getDialog('编辑', scope.row.id)" v-hasPermi="['music:classify:edit']">编辑</el-button>
+          <el-button type="text" @click="getDialog('编辑', scope.row.id)"
+            v-hasPermi="['music:classify:edit']">编辑</el-button>
           <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:classify:delete']">删除</el-button>
         </template>
       </el-table-column>

+ 6 - 10
src/views/music/list/detail.vue

@@ -7,25 +7,22 @@
       <el-form-item label="歌手名称:" prop="singerId">
         <el-select v-model="form.singerId" multiple filterable remote reserve-keyword placeholder="请输入歌手名称"
           :remote-method="getSelect" no-data-text="请新增歌手">
-          <el-option v-for="item in singerOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in singerOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="歌曲语言:" prop="lanuage">
         <el-select v-model="form.lanuage" placeholder="请选择歌曲语言">
-          <el-option v-for="item in languageOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in languageOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
         <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label"
+            :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="音频封面:" prop="thumbUrl">
-        <Upload listType="picture-card" :url="form.thumbUrl" @upload="upload($event, 'thumbUrl')"
-          :disabled="disabled" />
+        <Upload listType="picture-card" :url="form.thumbUrl" @upload="upload($event, 'thumbUrl')" :disabled="disabled" />
       </el-form-item>
       <el-form-item label="音频文件:" prop="realName">
         <el-input v-model="form.realName" readonly>
@@ -146,10 +143,9 @@ export default {
       this.$refs.form.validate((valid) => {
         if (valid) {
           this.form.singerId = this.form.singerId.join(',')
-          let title = this.form.id ? '编辑成功!' : '新增成功!'
           submit(this.form).then(res => {
             if (res.code === 0) {
-              this.$message.success(`${title}`)
+              this.$message.success('提交成功!')
               this.cancel()
             }
           })

+ 4 - 1
src/views/music/list/index.vue

@@ -2,6 +2,9 @@
   <div class="app-container">
     <!-- 搜索 -->
     <el-form inline size="mini">
+      <el-form-item label="歌曲Id:">
+        <el-input v-model="form.id" placeholder="请输入歌曲Id" clearable />
+      </el-form-item>
       <el-form-item label="歌曲名称:">
         <el-input v-model="form.name" placeholder="请输入歌曲名称" clearable />
       </el-form-item>
@@ -33,7 +36,7 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading" @selection-change="handleSelect">
       <el-table-column type="selection" align="center" />
-      <el-table-column label="ID" prop="id" align="center" />
+      <el-table-column label="歌曲Id" prop="id" align="center" />
       <el-table-column label="歌曲名称" prop="name" align="center" show-overflow-tooltip />
       <el-table-column label="歌手名称" align="center" show-overflow-tooltip>
         <template slot-scope="scope">

+ 48 - 18
src/views/music/menu/detail.vue

@@ -2,10 +2,10 @@
   <div class="app-container">
     <el-form class="form" :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
       <el-form-item label="歌单名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入歌单名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入歌单名称" />
       </el-form-item>
       <el-form-item label="歌单介绍:" prop="description">
-        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="100"
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="300"
           show-word-limit placeholder="请输入歌单介绍" />
       </el-form-item>
       <el-form-item label="创建者:" prop="avatarNickName">
@@ -17,6 +17,18 @@
             :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
+      <el-form-item label="付费类型:" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择付费类型">
+          <el-option v-for="item in payTypeOptions.slice(0, 2)" :key="item.value" :value="item.value"
+            :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="form.payType === 2" label="原价:" prop="price">
+        <el-input-number v-model="form.price" placeholder="请输入原价" :min="1" :precision="2" :controls="false" />
+      </el-form-item>
+      <el-form-item v-if="form.payType === 2" label="折扣价" prop="discount">
+        <el-input-number v-model="form.discount" placeholder="请输入折扣价" :min="0" :precision="2" :controls="false" />
+      </el-form-item>
       <el-form-item label="歌单封面:" prop="coverUrl">
         <Upload listType="picture-card" :url="form.coverUrl" @upload="upload($event, 'coverUrl')" :disabled="disabled" />
       </el-form-item>
@@ -26,7 +38,7 @@
       </el-form-item>
       <el-form-item label="歌曲列表:" style="width: 100%;">
         <el-button type="primary" icon="el-icon-plus" @click="getDialog">添加歌曲</el-button>
-        <el-table class="table" :data="form.programList" height="329px" v-loading="form_loading">
+        <el-table class="table" :data="form.programList">
           <el-table-column label="ID" prop="id" align="center" />
           <el-table-column label="歌曲名称" prop="name" align="center" show-overflow-tooltip />
           <el-table-column label="歌手名称" prop="singerName" align="center" show-overflow-tooltip />
@@ -67,7 +79,7 @@
         </el-form-item>
       </el-form>
       <el-table :data="tableData" v-loading="loading">
-        <el-table-column label="ID" prop="id" align="center" />
+        <el-table-column label="歌曲Id" prop="id" align="center" show-overflow-tooltip />
         <el-table-column label="歌曲名称" prop="name" align="center" show-overflow-tooltip />
         <el-table-column label="歌手名称" prop="singerName" align="center" show-overflow-tooltip />
         <el-table-column label="播放时长" prop="playTime" align="center" />
@@ -88,17 +100,35 @@
 <script>
 import { submit, detail } from '@/api/music/menu'
 import { list } from '@/api/music/list'
-import { platformMixin, onOrOffMixin } from '@/mixin/index'
+import { platformMixin, onOrOffMixin, payTypeMixin } from '@/mixin/index'
 import Audio from '@/components/Audio/index.vue'
 export default {
-  mixins: [platformMixin, onOrOffMixin],
+  mixins: [platformMixin, onOrOffMixin, payTypeMixin],
   components: {
     Audio
   },
   data() {
+    // 判断原价是否大于折扣价
+    var checkPrice = (rule, value, callback) => {
+      if (!value) {
+        callback(new Error('请输入原价'))
+      } else {
+        if (this.form.discount && value <= this.form.discount) {
+          callback(new Error('原价必须大于折扣价'))
+        }
+        callback()
+      }
+    }
+    // 判断折扣价是否小于原价
+    var checkDiscount = (rule, value, callback) => {
+      if (this.form.price && value >= this.form.price) {
+        callback(new Error('折扣价必须小于原价'))
+      } else {
+        callback()
+      }
+    }
     return {
       // 遮罩层
-      form_loading: false,
       loading: false,
       // 表单
       form: {
@@ -120,6 +150,15 @@ export default {
         platformId: [{
           required: true, message: '请选择资源平台', trigger: 'change'
         }],
+        payType: [{
+          required: true, message: '请选择付费类型', trigger: 'change'
+        }],
+        price: [{
+          required: true, validator: checkPrice, trigger: 'blur'
+        }],
+        discount: [{
+          validator: checkDiscount, trigger: 'blur'
+        }],
         coverUrl: [{
           required: true, message: '请上传歌单封面', trigger: 'change'
         }],
@@ -160,12 +199,10 @@ export default {
   methods: {
     // 详情
     getDetail() {
-      this.form_loading = true
       detail(this.form.id).then(res => {
         if (res.code === 0) {
           this.form = res.data
           this.form.programList = res.data.programList === null ? [] : res.data.programList
-          this.form_loading = false
         }
       })
     },
@@ -237,16 +274,10 @@ export default {
             arr.push(i.id)
           })
           this.form.programList = arr
-          this.form_loading = true
-          let title = this.form.id ? '编辑成功!' : '新增成功!'
           submit(this.form).then(res => {
             if (res.code === 0) {
-              this.$message.success(`${title}`)
-              if (this.form.id) {
-                this.getDetail()
-              } else {
-                this.cancel()
-              }
+              this.$message.success(`提交成功!`)
+              this.cancel()
             }
           })
         } else {
@@ -276,7 +307,6 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-
 .form {
   .el-form-item {
     width: 500px;

+ 19 - 7
src/views/music/menu/index.vue

@@ -2,18 +2,25 @@
   <div class="app-container">
     <!-- 搜索 -->
     <el-form inline size="mini">
+      <el-form-item label="歌单Id:">
+        <el-input v-model="form.id" placeholder="请输入歌单Id" clearable />
+      </el-form-item>
       <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" :value="item.value"
-            :label="item.label" />
+          <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="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in onOrOffOptions" :key="item.value" :value="item.value"
+          <el-option v-for="item in onOrOffOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="付费类型:">
+        <el-select v-model="form.payType" placeholder="请选择付费类型" clearable>
+          <el-option v-for="item in payTypeOptions.slice(0, 2)" :key="item.value" :value="item.value"
             :label="item.label" />
         </el-select>
       </el-form-item>
@@ -31,7 +38,7 @@
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading" @selection-change="handleSelect">
       <el-table-column type="selection" align="center" />
-      <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="歌单Id" prop="id" align="center" show-overflow-tooltip />
       <el-table-column label="歌单名称" prop="name" align="center" show-overflow-tooltip />
       <el-table-column label="歌单封面" align="center" width="100px">
         <template slot-scope="scope">
@@ -44,6 +51,7 @@
           <el-image v-if="scope.row.avatarNickHead" :src="scope.row.avatarNickHead" />
         </template>
       </el-table-column>
+      <el-table-column label="付费类型" prop="payType" align="center" :formatter="freeFormatter" />
       <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
       <el-table-column label="歌曲数量" prop="programCount" align="center" />
       <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
@@ -63,16 +71,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 { list, change, remove } from '@/api/music/menu'
-import { platformMixin, onOrOffMixin } from '@/mixin/index'
+import { platformMixin, onOrOffMixin, payTypeMixin } from '@/mixin/index'
 export default {
-  mixins: [platformMixin, onOrOffMixin],
+  mixins: [platformMixin, onOrOffMixin, payTypeMixin],
   data() {
     return {
       // 遮罩层
@@ -183,6 +191,10 @@ export default {
 
     statusFormatter(row) {
       return this.selectDictLabel(this.onOrOffOptions, row.status)
+    },
+
+    freeFormatter(row) {
+      return this.selectDictLabel(this.payTypeOptions, row.payType)
     }
   },
 };

+ 16 - 21
src/views/music/program/detail.vue

@@ -2,16 +2,16 @@
   <div class="app-container">
     <el-form :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
       <el-form-item label="节目名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入节目名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入节目名称" />
       </el-form-item>
       <el-form-item label="节目介绍:">
-        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10}"
-          maxlength="100" show-word-limit placeholder="请输入节目介绍" />
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="300"
+          show-word-limit placeholder="请输入节目介绍" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
         <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label"
+            :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="付费类型:" prop="isFree">
@@ -23,12 +23,10 @@
         <el-input-number v-model="form.price" placeholder="请输入原价" :min="1" :precision="2" :controls="false" />
       </el-form-item>
       <el-form-item v-if="form.isFree === 0" label="折扣价:" prop="discountedPrice">
-        <el-input-number v-model="form.discountedPrice" placeholder="请输入折扣价" :min="1" :precision="2"
-          :controls="false" />
+        <el-input-number v-model="form.discountedPrice" placeholder="请输入折扣价" :min="0" :precision="2" :controls="false" />
       </el-form-item>
       <el-form-item label="节目封面:" prop="cover">
-        <Upload listType="picture-card" :url="form.cover" @upload="upload($event, 'cover')"
-          :disabled="disabled" />
+        <Upload listType="picture-card" :url="form.cover" @upload="upload($event, 'cover')" :disabled="disabled" />
       </el-form-item>
       <el-form-item label="音频文件:" prop="realName">
         <el-input v-model="form.realName" readonly>
@@ -52,26 +50,23 @@ import { platformMixin, isFreeMixin } from '@/mixin/index'
 export default {
   mixins: [platformMixin, isFreeMixin],
   data() {
-    // 小数点后两位 正则
-    var str = /^\d+.?\d{0,2}$/
     // 判断原价是否大于折扣价
     var checkPrice = (rule, value, callback) => {
       if (!value) {
         callback(new Error('请输入原价'))
-      } else if (value.toString().length > 10) {
-        callback(new Error('字符长度不超过10个'))
-      } else if (this.form.discountedPrice) {
-        value > this.form.discountedPrice ? callback() : callback(new Error('原价必须大于折扣价'))
+      } else {
+        if (this.form.discountedPrice && value <= this.form.discountedPrice) {
+          callback(new Error('原价必须大于折扣价'))
+        }
+        callback()
       }
     }
     // 判断折扣价是否小于原价
     var checkDiscount = (rule, value, callback) => {
-      if (value) {
-        if (value.toString().length > 10) {
-          callback(new Error('字符长度不超过10个'))
-        } else if (this.form.price) {
-          value < this.form.price ? callback() : callback(new Error('折扣价必须小于原价'))
-        }
+      if (this.form.price && value >= this.form.price) {
+        callback(new Error('折扣价必须小于原价'))
+      } else {
+        callback()
       }
     }
     return {

+ 17 - 11
src/views/music/program/index.vue

@@ -2,13 +2,15 @@
   <div class="app-container">
     <!-- 搜索 -->
     <el-form inline size="mini">
+      <el-form-item label="节目Id:">
+        <el-input v-model="form.id" placeholder="请输入节目Id" clearable />
+      </el-form-item>
       <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" :value="item.value"
-            :label="item.label" />
+          <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="付费类型:">
@@ -18,22 +20,24 @@
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in onOrOffOptions" :key="item.value" :label="item.label"
-            :value="item.value" />
+          <el-option v-for="item in onOrOffOptions" :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="['music:program:add']">新增</el-button>
-        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 1)" v-hasPermi="['music:program:up']">批量上架</el-button>
-        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 2)" v-hasPermi="['music:program:down']">批量下架</el-button>
+        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
+          v-hasPermi="['music:program:add']">新增</el-button>
+        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 1)"
+          v-hasPermi="['music:program:up']">批量上架</el-button>
+        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 2)"
+          v-hasPermi="['music:program:down']">批量下架</el-button>
       </el-form-item>
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading" @selection-change="handleSelect">
       <el-table-column type="selection" align="center" />
-      <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
+      <el-table-column label="节目Id" prop="id" align="center" show-overflow-tooltip />
       <el-table-column label="节目名称" prop="name" align="center" show-overflow-tooltip />
       <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" width="100px" />
       <el-table-column label="原价 / 元" prop="price" align="center" />
@@ -50,16 +54,18 @@
         <template slot-scope="scope">
           <el-button type="text" @click="getDetail(scope.row.id, true)">查看</el-button>
           <span v-if="scope.row.status === 2">
-            <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['music:program:edit']" style="margin-left: 10px">编辑</el-button>
+            <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['music:program:edit']"
+              style="margin-left: 10px">编辑</el-button>
             <el-button type="text" @click="getChange(scope.row, 1)" v-hasPermi="['music:program:up']">上架</el-button>
             <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:program:delete']">删除</el-button>
           </span>
-          <el-button type="text" v-else @click="getChange(scope.row, 2)" v-hasPermi="['music:program:down']">下架</el-button>
+          <el-button type="text" v-else @click="getChange(scope.row, 2)"
+            v-hasPermi="['music:program:down']">下架</el-button>
           <Audio :src="scope.row.fullUrl" style="margin-left: 10px" />
         </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>

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

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="form" ref="form" :rules="rules" label-width="110px" :disabled="disabled">
       <el-form-item label="电台名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入电台名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入电台名称" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
         <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">

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

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
       <el-form-item label="歌手名称:" prop="name">
-        <el-input v-model="form.name" placeholder="请输入歌手名称" show-word-limit />
+        <el-input v-model="form.name" placeholder="请输入歌手名称" />
       </el-form-item>
       <el-form-item label="歌手性别:" prop="sex">
         <el-select v-model="form.sex" placeholder="请选择歌手性别">
@@ -22,7 +22,7 @@
         </el-select>
       </el-form-item>
       <el-form-item label="歌手简介:" prop="description">
-        <el-input v-model="form.description" type="textarea" rows="5" placeholder="请输入歌手简介" maxlength="100"
+        <el-input v-model="form.description" type="textarea" rows="5" placeholder="请输入歌手简介" maxlength="300"
           show-word-limit />
       </el-form-item>
       <el-form-item label="歌手头像:" prop="coverUrl">

+ 6 - 0
src/views/operation/agreement/detail.vue

@@ -53,6 +53,12 @@ export default {
       }, {
         value: 6,
         label: '关于我们'
+      }, {
+        value: 7,
+        label: '第三方信息共享清单'
+      },{
+        value: 8,
+        label: '已收集个人信息清单'
       }],
       // 校验
       rules: {

+ 6 - 0
src/views/operation/agreement/index.vue

@@ -61,6 +61,12 @@ export default {
       }, {
         value: 6,
         label: '关于我们'
+      }, {
+        value: 7,
+        label: '第三方信息共享清单'
+      },{
+        value: 8,
+        label: '已收集个人信息清单'
       }]
     }
   },

+ 1 - 1
src/views/operation/feedbacklist/detail.vue

@@ -20,7 +20,7 @@
       </el-form-item>
       <el-form-item v-if="reply" label="回复:" prop="reply" style="width: 500px;">
         <el-input v-model="form.reply" type="textarea" :readonly="disabled" :autosize="{ minRows: 5, maxRows: 20 }"
-          placeholder="请输入回复" />
+          placeholder="请输入回复" show-word-limit maxlength="300" />
       </el-form-item>
     </el-form>
     <div class="form-btn">

+ 1 - 0
src/views/operation/recommend/detail.vue

@@ -616,5 +616,6 @@ export default {
   text-align: right;
   padding: 0 20px;
   background: #FFF;
+  z-index: 99;
 }
 </style>

+ 67 - 46
src/views/order/list/index.vue

@@ -37,13 +37,13 @@
         </el-select>
       </el-form-item>
       <!-- 会员订单 -->
-      <el-form-item v-if="form.searchType === '4'" label="资源平台:">
+      <el-form-item v-if="form.searchType === '1' || form.searchType === '4'" label="资源平台:">
         <el-select v-model="form.platformId" placeholder="请选择资源平台">
-          <el-option v-for="item in platformIdOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <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="form.status" placeholder="请选择订单状态">
+        <el-select v-model="form.status" placeholder="请选择支付状态">
           <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
@@ -52,6 +52,12 @@
           <el-option v-for="item in payOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
+      <!-- 商品订单 -->
+      <el-form-item v-if="form.searchType === '1'" label="订单内容类型:">
+        <el-select v-model="form.goodsType" placeholder="请选择订单内容类型">
+          <el-option v-for="item in goodsTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="下单时间:">
         <el-date-picker v-model="form.listDate" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
           format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" :picker-options="pickerOptions" />
@@ -66,47 +72,59 @@
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
-      <el-table-column label="订单编号" prop="orderCode" key="orderCode" align="center" />
-      <el-table-column v-if="form.searchType === '2'" label="第三方订单编号" key="thirdOrderId" align="center">
-        <template slot-scope="scope">
-          <span>{{ scope.row.thirdOrderId | empty(scope.row.thirdOrderId) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="商品ID" prop="goodsid" key="goodsid" align="center" />
+      <el-table-column label="订单编号" prop="orderCode" key="orderCode" align="center" show-overflow-tooltip />
+      <!-- 流量订单 -->
+      <span v-if="form.searchType === '2'">
+        <el-table-column label="第三方订单编号" key="thirdOrderId" align="center" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ scope.row.thirdOrderId | empty(scope.row.thirdOrderId) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="SIM卡号" prop="simCode" key="simCode" align="center" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ scope.row.simCode | empty(scope.row.simCode) }}</span>
+          </template>
+        </el-table-column>
+      </span>
+      <el-table-column label="商品ID" prop="goodsid" key="goodsid" align="center" show-overflow-tooltip />
       <el-table-column label="商品名称" prop="goodsName" key="goodsName" align="center" show-overflow-tooltip />
       <el-table-column label="订单金额 / 元" prop="amount" key="amount" align="center" :formatter="amountFormatter" />
-      <el-table-column v-if="form.searchType === '2'" label="SIM卡号" prop="simCode" key="simCode" align="center">
-        <template slot-scope="scope">
-          <span>{{ scope.row.simCode | empty(scope.row.simCode) }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column v-if="form.searchType === '1'" label="购买类型" prop="charging" key="charging" align="center"
-        :formatter="chargingFormatter" />
+      <!-- 商品订单 -->
+      <span v-if="form.searchType === '1'">
+        <el-table-column label="购买类型" prop="charging" key="charging" align="center" :formatter="chargingFormatter" />
+        <el-table-column label="订单内容类型" prop="goodsType" key="goodsType" align="center" :formatter="goodsTypeFormatter" />
+      </span>
+      <!-- 充值订单 -->
       <el-table-column v-if="form.searchType === '3'" label="订单来源" prop="platform" key="platform" align="center"
         :formatter="platformFormatter" />
-      <el-table-column v-if="form.searchType === '4'" label="栏目" prop="groupId" key="groupId" align="center"
-        :formatter="groupFormatter" />
-      <el-table-column v-if="form.searchType === '4'" label="服务时长" prop="expirationTime" key="expirationTime"
-        align="center" :formatter="timeFormatter" />
-      <el-table-column v-if="form.searchType === '4'" label="资源平台" prop="platformId" key="platformId" align="center"
-        :formatter="platformIdFormatter" />
-      <el-table-column label="下单时间" prop="createTime" key="createTime" align="center" />
+      <!-- 会员订单 -->
+      <span v-if="form.searchType === '4'">
+        <el-table-column label="栏目" prop="groupId" key="groupId" align="center" :formatter="groupFormatter" />
+        <el-table-column label="服务时长" prop="expirationTime" key="expirationTime" align="center"
+          :formatter="timeFormatter" />
+      </span>
+      <!-- 商品订单 或 会员订单 -->
+      <el-table-column v-if="['1', '4'].includes(form.searchType)" label="资源平台" prop="platformId" key="platformId"
+        align="center" :formatter="platformIdFormatter" />
+      <el-table-column label="下单时间" prop="createTime" key="createTime" align="center" show-overflow-tooltip />
       <el-table-column label="支付方式" prop="payType" key="payType" align="center" :formatter="payTypeFormatter" />
       <el-table-column label="支付状态" prop="status" key="status" align="center" :formatter="statusFormatter" />
-      <el-table-column label="支付时间" prop="goodsUpdateTime" key="goodsUpdateTime" align="center" />
-      <el-table-column label="用户账号" prop="userName" key="userName" align="center" />
-      <el-table-column label="支付流水号" key="payId" align="center">
+      <el-table-column label="支付时间" prop="goodsUpdateTime" key="goodsUpdateTime" align="center" show-overflow-tooltip />
+      <el-table-column label="用户账号" prop="userName" key="userName" align="center" show-overflow-tooltip />
+      <el-table-column label="支付流水号" key="payId" align="center" show-overflow-tooltip>
         <template slot-scope="scope">
           <span>{{ scope.row.payId | empty(scope.row.payId) }}</span>
         </template>
       </el-table-column>
-      <el-table-column v-if="form.searchType === '2'" label="生效状态" prop="flowStatus" key="flowStatus" align="center"
-        :formatter="flowFormatter" />
-      <el-table-column v-if="form.searchType === '2'" label="生效时间" key="effectTime" align="center">
-        <template slot-scope="scope">
-          <span>{{ scope.row.effectTime | empty(scope.row.effectTime) }}</span>
-        </template>
-      </el-table-column>
+      <!-- 流量订单 -->
+      <span v-if="form.searchType === '2'">
+        <el-table-column label="生效状态" prop="flowStatus" key="flowStatus" align="center" :formatter="flowFormatter" />
+        <el-table-column label="生效时间" key="effectTime" align="center" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ scope.row.effectTime | empty(scope.row.effectTime) }}</span>
+          </template>
+        </el-table-column>
+      </span>
     </el-table>
     <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
       @pagination="getList" />
@@ -134,9 +152,9 @@
 <script>
 import { list, dialogList, download, downLoadHistory } from '@/api/order/list'
 import { list as sceneList } from '@/api/operation/scene'
-import { payTypeMixin, systemMixin, serviceTimeMixin } from '@/mixin/index'
+import { payTypeMixin, systemMixin, serviceTimeMixin, platformMixin } from '@/mixin/index'
 export default {
-  mixins: [payTypeMixin, systemMixin, serviceTimeMixin],
+  mixins: [payTypeMixin, systemMixin, serviceTimeMixin, platformMixin],
   data() {
     return {
       // 遮罩层
@@ -193,15 +211,13 @@ export default {
         value: 2,
         label: '已失效'
       }],
-      platformIdOptions: [{
-        value: 6,
-        label: 'QQ音乐'
+      // 订单内容类型
+      goodsTypeOptions: [{
+        value: 4,
+        label: '播客专辑'
       }, {
-        value: 9,
-        label: '酷狗音乐'
-      }, {
-        value: 10,
-        label: '爱听音乐'
+        value: 17,
+        label: '歌单'
       }],
       // 时间搜索不超过1个月
       selectDate: '',
@@ -226,6 +242,7 @@ export default {
   mounted() {
     this.getScene()
     this.getList()
+    this.getPlatform({})
     this.payOptions.push(this.form.searchType === '3' ? {
       value: 3,
       label: '苹果支付'
@@ -341,7 +358,7 @@ export default {
     },
 
     platformIdFormatter(row) {
-      return row.platformId === null ? '-' : this.selectDictLabel(this.platformIdOptions, row.platformId)
+      return row.platformId === null ? '-' : this.selectDictLabel(this.platformOptions, row.platformId)
     },
 
     flowFormatter(row) {
@@ -351,9 +368,13 @@ export default {
     amountFormatter(row) {
       return row.amount.toFixed(2)
     },
-    
+
     timeFormatter(row) {
       return this.selectDictLabel(this.serviceTimeOptions, row.expirationTime)
+    },
+
+    goodsTypeFormatter(row) {
+      return this.selectDictLabel(this.goodsTypeOptions, row.goodsType)
     }
   },
   // 过滤器