소스 검색

Merge branch 'develop/3.0.8' into test

# Conflicts:
#	src/views/music/album/detail.vue
DESKTOP-2S67K1S\31396 2 년 전
부모
커밋
165cb29bd2
36개의 변경된 파일1527개의 추가작업 그리고 1145개의 파일을 삭제
  1. 1 1
      package.json
  2. 35 0
      src/api/music/classify.js
  3. 1 1
      src/api/operation/channel.js
  4. 35 0
      src/api/operation/module.js
  5. 43 55
      src/api/operation/recommend.js
  6. 34 0
      src/api/operation/sceneTime.js
  7. 7 7
      src/components/Dialog/index.vue
  8. 3 0
      src/components/Upload/index.vue
  9. 14 1
      src/mixin/index.js
  10. 16 0
      src/router/index.js
  11. 4 5
      src/views/device/article/detail.vue
  12. 6 10
      src/views/device/article/index.vue
  13. 0 20
      src/views/device/article/mixin.js
  14. 1 27
      src/views/device/list/detail.vue
  15. 29 16
      src/views/device/list/index.vue
  16. 10 14
      src/views/music/album/detail.vue
  17. 3 4
      src/views/music/anchor/detail.vue
  18. 7 12
      src/views/music/blog/detail.vue
  19. 134 0
      src/views/music/classify/index.vue
  20. 3 4
      src/views/music/list/detail.vue
  21. 36 41
      src/views/music/menu/detail.vue
  22. 3 4
      src/views/music/program/detail.vue
  23. 3 4
      src/views/music/radio/detail.vue
  24. 3 4
      src/views/music/singer/detail.vue
  25. 3 6
      src/views/operation/channel/detail.vue
  26. 1 1
      src/views/operation/channel/index.vue
  27. 181 0
      src/views/operation/module/index.vue
  28. 508 0
      src/views/operation/recommend/detail.vue
  29. 218 890
      src/views/operation/recommend/index.vue
  30. 165 0
      src/views/operation/sceneTime/index.vue
  31. 4 4
      src/views/operation/tag/detail.vue
  32. 3 1
      src/views/operation/waken/detail.vue
  33. 2 2
      src/views/project/list/detail.vue
  34. 6 6
      src/views/registration/content/detail.vue
  35. 2 2
      src/views/registration/lottery/detail.vue
  36. 3 3
      vue.config.js

+ 1 - 1
package.json

@@ -5,7 +5,7 @@
   "author": "若依",
   "license": "MIT",
   "scripts": {
-    "dev": "vue-cli-service serve",
+    "dev": "vue-cli-service serve --host 0.0.0.0",
     "build:prod": "vue-cli-service build",
     "build:stage": "vue-cli-service build --mode staging",
     "preview": "node build/index.js --preview",

+ 35 - 0
src/api/music/classify.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(data) {
+  return request({
+    url: `/admin/tBroadcast/category/list`,
+    method: 'post',
+    data
+  })
+}
+
+// 新增 编辑
+export function submit(data) {
+  return request({
+    url: `/admin/tBroadcast/category/addOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/tBroadcast/category/queryById/${id}`,
+    method: 'get'
+  })
+}
+
+// 删除
+export function remove(ids) {
+  return request({
+    url: `/admin/tBroadcast/category/hitOrSold/${ids}`,
+    method: 'get'
+  })
+}

+ 1 - 1
src/api/operation/channel.js

@@ -74,7 +74,7 @@ export function edit(data) {
 // 频道内容列表
 export function list(query) {
   return request({
-    url: `/device/channelAudio/querypage`,
+    url: `/commonRadio/page`,
     method: 'get',
     params: query
   })

+ 35 - 0
src/api/operation/module.js

@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 列表
+export function list(data) {
+  return request({
+    url: `/recommend/type/page`,
+    method: 'post',
+    data
+  })
+}
+
+// 新增 / 编辑
+export function submit(data) {
+  return request({
+    url: `/recommend/type/saveOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/recommend/type/get/${id}`,
+    method: 'get'
+  })
+}
+
+// 删除
+export function remove(id) {
+  return request({
+    url: `/recommend/type/delete/${id}`,
+    method: 'delete'
+  })
+}

+ 43 - 55
src/api/operation/recommend.js

@@ -1,114 +1,102 @@
 import request from '@/utils/request'
 
 // 标签页分类
-export function listAll() {
+export function tabList() {
   return request({
-    url: `/recommendCategory/listAll`,
+    url: `/recommend/type/module/listAll`,
     method: 'get'
   })
 }
 
-// 标签页分类内容
-export function recommendList(query) {
+// 模板列表 
+export function typeList() {
   return request({
-    url: `/admin/recommendContentModule/allContentList`,
-    method: 'get',
-    params: query
+    url: `/recommend/type/getList`,
+    method: 'get'
   })
 }
 
-// 内容列表
-export function contentList(query) {
+// 二级列表
+export function list(id) {
   return request({
-    url: `/admin/recommendContentModule/list`,
-    method: 'get',
-    params: query
+    url: `/recommend/type/getSecondRecommend/${id}`,
+    method: 'get'
   })
 }
 
-// 保存分类下的某个模块
+// 新增 编辑 二级列表
 export function submit(data) {
   return request({
-    url: `/admin/recommendContentModule/save`,
+    url: `/recommend/type/module/second/saveOrUpdate`,
     method: 'post',
     data
   })
 }
 
-// 修改列表模块
-export function moduleDetail(query) {
-  return request({
-    url: `/recommendCategoryModule/detail`,
-    method: 'get',
-    params: query
-  })
-}
-
-
-// 音频内容列表
-export function radioList(query) {
+// 二级详情
+export function listDetail(id) {
   return request({
-    url: `/commonRadio/page`,
-    method: 'get',
-    params: query
+    url: `/recommend/type/getSecondRecommend/get/${id}`,
+    method: 'get'
   })
 }
 
-// 修改标题模块
-export function moduleContent(data){
+// 历史记录
+export function history(data) {
   return request({
-    url: `/recommendCategoryModule/update`,
+    url: `/recommend/type/history/list`,
     method: 'post',
     data
   })
 }
 
-// 上下架
-export function upOrDown(id, status){
+// 删除
+export function remove(lv, id) {
   return request({
-    url: `/admin/recommendContentModule/highOrSold/${id}/${status}`,
-    method: 'get' 
+    url: `/recommend/type/recmmend/delete/${lv}/${id}`,
+    method: 'get'
   })
 }
 
-// 新增时间段
-export function submitTime(data) {
+// 三级详情
+export function detail(id) {
   return request({
-    url: `/admin/appTime/addOrUpdate`,
-    method: 'post',
-    data
+    url: `/recommend/type/getThreeRecommend/get/${id}`,
+    method: 'get'
   })
 }
 
-// 查询时间段列表
-export function timeList() {
+// 查询模块
+export function moduleList(id) {
   return request({
-    url: `/admin/appTime/list`,
+    url: `/recommend/type/get/${id}`,
     method: 'get'
   })
 }
 
-// 删除 / 上下架时间段
-export function changeTime(ids, status) {
+// 音频内容列表
+export function radioList(query) {
   return request({
-    url: `/admin/appTime/hitOrSold/${ids}/${status}`,
-    method: 'get'
+    url: `/commonRadio/page`,
+    method: 'get',
+    params: query
   })
 }
 
-// 精选电台提交
-export function expandSave(data){
+// 新增 编辑 三级
+export function submitThree(data) {
   return request({
-    url: `/admin/recommendContentModule/expand/save`,
+    url: `/recommend/type/three/saveOrUpdate`,
     method: 'post',
     data
   })
 }
 
-// 删除精选电台
-export function removeList(ids, status){
+// 有效时间
+export function timeChange(data) {
   return request({
-    url: `/admin/recommendContentModule/highOrSold/${ids}/${status}`,
-    method: 'get'
+    url: `/recommend/type/time/saveOrUpdate`,
+    method: 'post',
+    data
   })
 }

+ 34 - 0
src/api/operation/sceneTime.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+// 查询时间段列表
+export function list() {
+  return request({
+    url: `/admin/appTime/list`,
+    method: 'get'
+  })
+}
+
+// 新增时间段
+export function submit(data) {
+  return request({
+    url: `/admin/appTime/addOrUpdate`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除 / 上下架时间段
+export function change(ids, status) {
+  return request({
+    url: `/admin/appTime/hitOrSold/${ids}/${status}`,
+    method: 'get'
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/appTime/queryById/${id}`,
+    method: 'get'
+  })
+}

+ 7 - 7
src/components/Dialog/index.vue

@@ -10,8 +10,7 @@
       </el-form-item>
       <el-form-item label="资源平台:">
         <el-select v-model="dialogForm.platformId" :disabled="[16, 17].includes(channelType)" clearable>
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="付费类型:" v-if="![2, 10, 11].includes(dialogForm.audioType)">
@@ -27,8 +26,7 @@
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
       </el-form-item>
     </el-form>
-    <el-table :data="tableData" ref="tableData" :row-key="getRowKey" @selection-change="getChange"
-      v-loading="loading">
+    <el-table :data="tableData" ref="tableData" :row-key="getRowKey" @selection-change="getChange" v-loading="loading">
       <el-table-column type="selection" align="center" :reserve-selection="true" />
       <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
       <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
@@ -37,12 +35,14 @@
           <el-image v-if="scope.row.audioPic" :src="scope.row.audioPic" />
         </template>
       </el-table-column>
+      <el-table-column label="音频作者" prop="singerName" align="center" />
+      <el-table-column label="专辑名称" prop="songName" align="center" />
       <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
       <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
     </el-table>
     <div slot="footer">
-      <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
-        :limit.sync="dialogForm.pageSize" @pagination="getList" />
+      <pagination v-show="total > 0" :total="total" :page.sync="dialogForm.pageNum" :limit.sync="dialogForm.pageSize"
+        @pagination="getList" />
     </div>
   </el-dialog>
 </template>
@@ -97,7 +97,7 @@ export default {
       this.dialogForm.audioType = this.channelOptions[val][0].value
     },
     'dialogForm.audioType'(val) {
-      if(this.dialogVisible){
+      if (this.dialogVisible) {
         this.getPlatform({
           audioType: val
         })

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

@@ -107,6 +107,9 @@ export default {
   watch: {
     url(val) {
       this.form.file = val
+      if(!val) {
+        this.percentage = 0
+      }
     },
     listType(val) {
       this.action = this.obj[val]

+ 14 - 1
src/mixin/index.js

@@ -278,7 +278,8 @@ const platformMixin = {
           if (res.code === 0) {
             res.data.map(i => this.platformOptions.push({
               value: Number(i.id),
-              label: i.name
+              label: i.name,
+              joinType: i.joinType
             }))
             e ? this.platformTypeOptions = this.platformOptions : ''
             resolve(this.platformOptions, this.platformTypeOptions)
@@ -287,6 +288,18 @@ const platformMixin = {
           reject()
         })
       })
+    },
+
+    // 第三方资源平台不可编辑
+    disabledPlatformId(e) {
+      if (e) {
+        return this.platformOptions.find(i => i.value === e).joinType.includes('1')
+      }
+    },
+
+    // 禁止选择第三方平台
+    disabledJoinType(e) {
+      return e.split(',').includes('1')
     }
   }
 }

+ 16 - 0
src/router/index.js

@@ -421,6 +421,22 @@ export const dynamicRoutes = [{
     }
   }]
 },
+// 推荐管理
+{
+  path: '/operation',
+  component: Layout,
+  hidden: true,
+  permissions: ['operation:recommend:list'],
+  children: [{
+    path: 'recommend/detail',
+    component: () => import('@/views/operation/recommend/detail'),
+    name: 'recommendDetail',
+    meta: {
+      title: '推荐详情',
+      activeMenu: '/operation/operationRecommend'
+    }
+  }]
+},
 // 定制频道
 {
   path: '/operation',

+ 4 - 5
src/views/device/article/detail.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form label-width="100px" :model="form" :rules="rules" ref="form">
       <el-form-item label="关联设备:" prop="linkDevice">
-        <el-select v-model="form.linkDevice" multiple placeholder="请选择关联设备">
+        <el-select v-model="form.linkDevice" filterable multiple placeholder="请选择关联设备">
           <el-option v-for="item in devOptions" :key="item.value" :label="item.label"
             :value="item.value.toString()" />
         </el-select>
@@ -21,7 +21,7 @@
       </el-form-item>
       <el-form-item label="文章状态:" prop="status" v-if="this.form.id">
         <el-select v-model="form.status" placeholder="请选择文章状态">
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
+          <el-option v-for="item in disabledOptions" :key="item.value" :label="item.label"
             :value="item.value" />
         </el-select>
       </el-form-item>
@@ -35,11 +35,10 @@
 
 <script>
 import { create, detail, edit } from '@/api/device/article'
-import { devMixin } from '@/mixin/index'
-import { statusMixin } from './mixin'
+import { devMixin, disabledMixin } from '@/mixin/index'
 import Editor from '@/components/Editor/index'
 export default {
-  mixins: [devMixin, statusMixin],
+  mixins: [devMixin, disabledMixin],
   components: {
     Editor
   },

+ 6 - 10
src/views/device/article/index.vue

@@ -3,13 +3,13 @@
     <!-- 搜索 -->
     <el-form inline size="mini">
       <el-form-item label="设备:">
-        <el-select v-model="form.deviceId" placeholder="请选择设备" clearable>
+        <el-select v-model="form.deviceId" filterable placeholder="请选择设备" clearable>
           <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="文章状态:">
         <el-select v-model="form.status" placeholder="请选择文章状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label"
+          <el-option v-for="item in disabledOptions" :key="item.value" :label="item.label"
             :value="item.value" />
         </el-select>
       </el-form-item>
@@ -47,11 +47,10 @@
 
 <script>
 import { list, remove } from '@/api/device/article'
-import { devMixin } from '@/mixin/index'
-import { statusMixin } from './mixin'
+import { devMixin, disabledMixin } from '@/mixin/index'
 export default {
   name: 'Article',
-  mixins: [devMixin, statusMixin],
+  mixins: [devMixin, disabledMixin],
   data() {
     return {
       // 遮罩层
@@ -144,11 +143,8 @@ export default {
       return row.linkDevice ? row.linkDevice.split(',').map(i => this.selectDictLabel(this.devOptions, i)).join(',') : ''
     },
     statusFormatter(row) {
-      return this.selectDictLabel(this.statusOptions, row.status)
+      return this.selectDictLabel(this.disabledOptions, row.status)
     }
   }
 }
-</script>
-
-<style lang="scss" scoped>
-</style>
+</script>

+ 0 - 20
src/views/device/article/mixin.js

@@ -1,20 +0,0 @@
-const statusMixin = {
-  data() {
-    return {
-      // 当前状态
-      statusOptions: [{
-          value: 0,
-          label: '上架'
-        },
-        {
-          value: 1,
-          label: '下架'
-        }
-      ]
-    }
-  }
-}
-
-export {
-  statusMixin
-}

+ 1 - 27
src/views/device/list/detail.vue

@@ -10,18 +10,6 @@
       <el-form-item label="蓝牙名称:" prop="bluetoothName">
         <el-input v-model="form.bluetoothName" placeholder="请输入蓝牙名称" />
       </el-form-item>
-      <el-form-item label="版本号:" prop="firstVersion">
-        <el-input v-model="form.firstVersion" placeholder="请输入初始版本号" />
-      </el-form-item>
-      <el-form-item label="升级方式:" prop="upgradeType">
-        <el-select v-model="form.upgradeType" placeholder="请选择升级方式">
-          <el-option v-for="item in upgradeTypeOptions" :key="item.value" :label="item.label"
-            :value="Number(item.value)" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="设备过滤:" prop="filter">
-        <el-input v-model="form.filter" placeholder="请输入设备过滤内容"></el-input>
-      </el-form-item>
       <el-form-item label="制造商:" prop="manufacturer">
         <el-select v-model="form.manufacturer" placeholder="请选择设备制造商" clearable>
           <el-option v-for="item in manuOptions" :key="item.value" :label="item.label" :value="item.value" />
@@ -82,7 +70,7 @@
         </el-form-item>
         <el-row>
           <el-col :span="12">
-            <el-form-item :label="item.type === 1 || 3 ? '连接引导图:' : '开机引导图'" :prop="`typeList.${index}.icon1`"
+            <el-form-item :label="item.type === 1 || item.type === 3 ? '连接引导图:' : '开机引导图'" :prop="`typeList.${index}.icon1`"
               :rules="{ required: true, message: '请上传引导图片', trigger: 'change' }">
               <Upload listType="picture-card" :url="item.icon1" @upload="handleUploadIcon($event, index, 'icon1')"
                 :disabled="disabled" />
@@ -96,10 +84,6 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页:" :prop="`typeList.${index}.guideUrl`"
-          :rules="{ required: true, message: '请输入引导页网址', trigger: 'blur' }">
-          <el-input v-model="item.guideUrl" placeholder="请输入引导页网址" />
-        </el-form-item>
         <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页内容:"
           :prop="`typeList.${index}.guidePageContent`" :rules="{ required: true, message: '请输入引导页内容', trigger: 'blur' }">
           <Editor v-model="item.guidePageContent" :min-height="250" :readOnly="disabled" />
@@ -145,8 +129,6 @@ export default {
         clientType: [{ required: true, message: "请输入设备型号", trigger: "blur" }],
         name: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
         bluetoothName: [{ required: true, message: '请输入蓝牙名称', trigger: 'blur' }],
-        firstVersion: [{ required: true, message: "请输入初始版本号", trigger: "blur" }],
-        upgradeType: [{ required: true, message: "请选择升级方式", trigger: "change" }],
         isHot: [{ required: true, message: "是否热门", trigger: "change" }],
         categoryId: [{ required: true, message: "请选择设备分类", trigger: "change" }],
         deviceType: [{ required: true, message: "请选择设备类型", trigger: 'change' }],
@@ -161,14 +143,6 @@ export default {
         value: 1,
         label: '是'
       }],
-      // 是否强制
-      upgradeTypeOptions: [{
-        value: 1,
-        label: '强制'
-      }, {
-        value: 2,
-        label: '指定'
-      }],
       // 设备连接
       connectTypeOptions: [{
         value: 2,

+ 29 - 16
src/views/device/list/index.vue

@@ -10,6 +10,21 @@
           <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
+      <el-form-item label="设备分类:">
+        <el-select v-model="form.deviceType" placeholder="请选择设备分类" clearable>
+          <el-option v-for="item in categoryOptions" :key="item.id" :value="item.id" :label="item.name" />
+        </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-select>
+      </el-form-item>
+      <el-form-item label="是否热门:">
+        <el-select v-model="form.isHot" placeholder="请选择是否热门" clearable>
+          <el-option v-for="item in hotOptions" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
@@ -41,7 +56,6 @@
       <el-table-column label="设备分类" prop="categoryName" align="center" />
       <el-table-column label="设备类型" prop="deviceType" align="center" :formatter="deviceTypeFormatter" />
       <el-table-column label="是否热门" prop="isHot" align="center" :formatter="hotFormatter" />
-      <el-table-column label="升级方式" align="center" :formatter="upgradeTypeFormatter" />
       <el-table-column label="创建时间" prop="createTimeText" align="center" />
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
@@ -71,9 +85,10 @@
 
 <script>
 import { List, Delete, upDown } from '@/api/device/list'
-import { devMixin } from '@/mixin/index'
+import { devMixin, onOrOffMixin } from '@/mixin/index'
+import { categoryList } from "@/api/device/category";
 export default {
-  mixins: [devMixin],
+  mixins: [devMixin, onOrOffMixin],
   data() {
     return {
       // 遮罩层
@@ -100,14 +115,6 @@ export default {
         value: 1,
         label: '是'
       }],
-      // 是否强制
-      upgradeTypeOptions: [{
-        value: 1,
-        label: '强制'
-      }, {
-        value: 2,
-        label: '指定'
-      }],
       deviceTypeOptions: [{
         value: 0,
         label: '音响'
@@ -117,11 +124,14 @@ export default {
       }, {
         value: 2,
         label: '穿戴'
-      }]
+      }],
+      // 设备分类
+      categoryOptions: []
     }
   },
   mounted() {
     this.getList()
+    this.getCategory()
   },
   methods: {
     // 列表
@@ -156,6 +166,13 @@ export default {
       return this.changeForm.ids === '' ? true : false
     },
 
+    // 设备分类
+    getCategory() {
+      categoryList().then(res => {
+        this.categoryOptions = res.data
+      })
+    },
+
     // 上下架
     getShelves(key, e) {
       if (e) {
@@ -214,10 +231,6 @@ export default {
       return this.selectDictLabel(this.hotOptions, row.isHot)
     },
 
-    upgradeTypeFormatter(row) {
-      return this.selectDictLabel(this.upgradeTypeOptions, row.upgradeType)
-    },
-
     deviceTypeFormatter(row) {
       return this.selectDictLabel(this.deviceTypeOptions, row.deviceType)
     }

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

@@ -14,8 +14,9 @@
         </el-select>
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
+        <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-select>
       </el-form-item>
       <el-form-item label="付费类型:" prop="payType">
@@ -30,10 +31,9 @@
         <el-input-number v-model="form.discount" placeholder="请输入折扣价" :min="1" :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" />
+        <Upload listType="picture-card" :url="form.coverUrl" @upload="upload($event, 'coverUrl')" :disabled="disabled" />
       </el-form-item>
-      <el-form-item label="歌曲列表:" style="width: 1000px;">
+      <el-form-item label="歌曲列表:" style="width: 100%;">
         <el-button type="primary" icon="el-icon-plus" @click="getDialog">添加歌曲</el-button>
         <!-- 列表 -->
         <el-table :data="form.programList" height="329px" v-loading="form_loading">
@@ -67,7 +67,8 @@
         </el-form-item>
         <el-form-item label="资源平台:">
           <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
+            <el-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>
@@ -195,8 +196,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 15,
-      joinType: 2
+      audioType: 15
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id
@@ -223,7 +223,7 @@ export default {
     // 添加歌曲
     getDialog() {
       this.dialogVisible = true
-      this.dialogForm.platformId = this.platformOptions[0].value
+      this.dialogForm.platformId = this.platformOptions.filter(i => !i.joinType.includes('1'))[0].value
       this.getList()
     },
 
@@ -317,11 +317,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.el-form {
+.el-form-item {
   width: 500px;
 }
-
-.form-btn {
-  margin-top: 20px;
-}
 </style>

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

@@ -9,9 +9,9 @@
           placeholder="请输入主播简介" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="主播头像:" prop="avatar">
@@ -58,8 +58,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 12,
-      joinType: 2
+      audioType: 12
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id

+ 7 - 12
src/views/music/blog/detail.vue

@@ -22,9 +22,9 @@
           maxlength="300" show-word-limit placeholder=" 请输入播客介绍" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="付费类型:" prop="charging">
@@ -47,7 +47,7 @@
         <el-button type="primary" @click="getDialog">关联节目</el-button>
         <el-button @click="getDelete" :disabled="ids.length > 0 ? false : true">解除关联</el-button>
       </el-form-item>
-      <el-form-item style="width: 1000px">
+      <el-form-item style="width: 100%">
         <el-table :data="form.adminPodCastProgramDetailResp" height="497" @selection-change="handleSelect">
           <el-table-column type="selection" align="center" />
           <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
@@ -79,7 +79,7 @@
         </el-form-item>
         <el-form-item label="资源平台:">
           <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
+            <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>
@@ -202,8 +202,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 8,
-      joinType: 2
+      audioType: 8
     })
     // 分类
     this.getClassify(8)
@@ -258,7 +257,7 @@ export default {
     // 弹窗
     getDialog() {
       this.dialogVisible = true
-      this.dialogForm.platformId = this.platformOptions[0].value
+      this.dialogForm.platformId = this.platformOptions.filter(i => !i.joinType.includes('1'))[0].value
       this.getList()
     },
 
@@ -375,11 +374,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.el-form {
+.el-form-item {
   width: 500px;
 }
-
-.form-btn {
-  margin-top: 20px;
-}
 </style>

+ 134 - 0
src/views/music/classify/index.vue

@@ -0,0 +1,134 @@
+<template>
+  <div class="app-container">
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDialog('新增')">新增</el-button>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column type="index" label="序号" align="center" />
+      <el-table-column label="分类名称" prop="title" align="center" />
+      <el-table-column label="更新时间" align="center">
+        <template slot-scope="scope">
+          {{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDialog('编辑', scope.row.id)">编辑</el-button>
+          <el-button type="delete" @click="getDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+      @pagination="getList" />
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" :title="title" width="500px">
+      <el-form :model="dialogForm" :rules="rules" ref="dialogForm" label-width="auto">
+        <el-form-item label="分类名称:" prop="title">
+          <el-input v-model="dialogForm.title" placeholder="请输入分类名称" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="cancel">取消</el-button>
+        <el-button type="primary" @click="getSubmit">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list, submit, detail, remove } from '@/api/music/classify'
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      // 列表
+      tableData: [],
+      // 总数据
+      total: 0,
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗名称
+      title: '新增',
+      // 弹窗表单
+      dialogForm: {},
+      // 校验
+      rules: {
+        title: [{
+          required: true, message: '请输入分类名称', trigger: 'blur'
+        }]
+      }
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 新增 编辑
+    getDialog(title, id) {
+      this.dialogVisible = true
+      this.title = title
+      if (id) {
+        detail(id).then(res => {
+          if (res.code === 0) {
+            this.dialogForm = res.data
+          }
+        })
+      }
+    },
+
+    // 提交
+    getSubmit() {
+      this.$refs.dialogForm.validate((valid) => {
+        if (valid) {
+          submit(this.dialogForm).then(res => {
+            if (res.code === 0) {
+              this.$message.success(`${this.title}成功!`)
+              this.cancel()
+              this.getList()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    // 取消
+    cancel() {
+      this.$refs.dialogForm.resetFields()
+      this.dialogVisible = false
+    },
+
+    // 列表
+    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
+        }
+      })
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.title}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        remove(row.id).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      }).catch(() => { })
+    }
+  }
+}
+</script>

+ 3 - 4
src/views/music/list/detail.vue

@@ -18,9 +18,9 @@
         </el-select>
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="音频封面:" prop="thumbUrl">
@@ -86,8 +86,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 11,
-      joinType: 2
+      audioType: 11
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id

+ 36 - 41
src/views/music/menu/detail.vue

@@ -5,44 +5,42 @@
         <el-input v-model="form.name" placeholder="请输入歌单名称" show-word-limit />
       </el-form-item>
       <el-form-item label="歌单介绍:" prop="description">
-        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10}"
-          maxlength="100" show-word-limit placeholder="请输入歌单介绍" />
+        <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="100"
+          show-word-limit placeholder="请输入歌单介绍" />
       </el-form-item>
       <el-form-item label="创建者:" prop="avatarNickName">
         <el-input v-model="form.avatarNickName" placeholder="请输入歌单创建者名称" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
-          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-            :label="item.label" />
+        <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-select>
       </el-form-item>
       <el-form-item label="歌单封面:" prop="coverUrl">
-        <Upload listType="picture-card" :url="form.coverUrl" @upload="upload($event, 'coverUrl')"
-          :disabled="disabled" />
+        <Upload listType="picture-card" :url="form.coverUrl" @upload="upload($event, 'coverUrl')" :disabled="disabled" />
       </el-form-item>
       <el-form-item label="头像:" prop="avatarNickHead">
         <Upload listType="picture-card" :url="form.avatarNickHead" @upload="upload($event, 'avatarNickHead')"
           :disabled="disabled" />
       </el-form-item>
-      <el-form-item label="歌曲列表:">
+      <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-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 />
+          <el-table-column label="播放时长" prop="playTime" align="center" />
+          <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+          <el-table-column label="操作" align="center">
+            <template slot-scope="scope">
+              <Audio :src="scope.row.progaramUrl" />
+              <el-button type="delete" @click="getDelete(scope.$index)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
       </el-form-item>
     </el-form>
-    <!-- 列表 -->
-    <el-table class="table" :data="form.programList" height="329px" v-loading="form_loading">
-      <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 />
-      <el-table-column label="播放时长" prop="playTime" align="center" />
-      <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
-      <el-table-column label="操作" align="center">
-        <template slot-scope="scope">
-          <Audio :src="scope.row.progaramUrl" />
-          <el-button type="delete" :disabled="disabled" @click="getDelete(scope.$index)">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
     <div class="form-btn">
       <el-button @click="cancel">取消</el-button>
       <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
@@ -59,8 +57,8 @@
         </el-form-item>
         <el-form-item label="资源平台:">
           <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
+            <el-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>
@@ -75,15 +73,14 @@
         <el-table-column label="播放时长" prop="playTime" align="center" />
         <el-table-column label="操作" align="center">
           <template slot-scope="scope">
-            <el-button type="text" @click="getChecked(scope.row)"
-              :disabled="form.programList.findIndex(i => i.id === scope.row.id) === -1 ? false : true">
+            <el-button type="text" @click="getChecked(scope.row)" :disabled="disabledList()">
               选择
             </el-button>
           </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>
@@ -152,8 +149,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 10,
-      joinType: 2
+      audioType: 10
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id
@@ -168,6 +164,7 @@ export default {
       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
         }
       })
@@ -180,7 +177,7 @@ export default {
     // 添加歌曲
     getDialog() {
       this.dialogVisible = true
-      this.dialogForm.platformId = this.platformOptions[0].value
+      this.dialogForm.platformId = this.platformOptions.filter(i => !i.joinType.includes('1'))[0].value
       this.getList()
     },
 
@@ -266,22 +263,20 @@ export default {
     // 字典翻译
     statusFormatter(row) {
       return this.selectDictLabel(this.onOrOffOptions, row.status)
+    },
+
+    // 已有的歌曲不可重复选择
+    disabledList() {
+      if (this.form.programList.length > 0) {
+        return this.form.programList.findIndex(i => i.id === scope.row.id) === -1 ? false : true
+      }
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
-.el-form {
+.el-form-item {
   width: 500px;
 }
-
-.form-btn {
-  margin-top: 20px;
-}
-
-.table {
-  width: calc(100% - 100px);
-  margin-left: 100px;
-}
 </style>

+ 3 - 4
src/views/music/program/detail.vue

@@ -9,9 +9,9 @@
           maxlength="100" show-word-limit placeholder="请输入节目介绍" />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="付费类型:" prop="isFree">
@@ -111,8 +111,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 6,
-      joinType: 2
+      audioType: 6
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id

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

@@ -5,9 +5,9 @@
         <el-input v-model="form.name" placeholder="请输入电台名称" show-word-limit />
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item v-if="form.platformId !== 4" label="地域分类:" prop="addressClassifyId">
@@ -79,8 +79,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 2,
-      joinType: 2
+      audioType: 2
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id

+ 3 - 4
src/views/music/singer/detail.vue

@@ -16,9 +16,9 @@
         </el-select>
       </el-form-item>
       <el-form-item label="资源平台:" prop="platformId">
-        <el-select v-model="form.platformId" placeholder="请选择资源平台">
+        <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" />
+            :label="item.label" :disabled="disabledJoinType(item.joinType)" />
         </el-select>
       </el-form-item>
       <el-form-item label="歌手简介:" prop="description">
@@ -73,8 +73,7 @@ export default {
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 9,
-      joinType: 2
+      audioType: 9
     })
     if (this.$route.query.id) {
       this.form.id = this.$route.query.id

+ 3 - 6
src/views/operation/channel/detail.vue

@@ -8,8 +8,7 @@
             <el-input v-model="form.aliasName" placeholder="请输入频道名称" />
           </el-form-item>
           <el-form-item label="频道属性:">
-            <el-select v-model="form.channelType" placeholder="请选择频道属性" :disabled="disabled"
-              @change="handleChange">
+            <el-select v-model="form.channelType" placeholder="请选择频道属性" :disabled="disabled" @change="handleChange">
               <el-option v-for="item in channelTypeOptions" :key="item.value" :value="Number(item.value)"
                 :label="item.label" />
             </el-select>
@@ -36,6 +35,8 @@
               <el-image :src="scope.row.audioPic" />
             </template>
           </el-table-column>
+          <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
+          <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
           <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
           <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
           <el-table-column label="当前状态" align="center" :formatter="statusFormatter" />
@@ -163,10 +164,6 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.form {
-  width: 1000px;
-}
-
 .el-image {
   width: 80px;
   height: 80px;

+ 1 - 1
src/views/operation/channel/index.vue

@@ -29,7 +29,7 @@
           <el-input v-model="dialogForm.name" placeholder="请输入规则名称" />
         </el-form-item>
         <el-form-item v-if="index !== 1" label="关联设备:">
-          <el-select v-model="ids" multiple placeholder="请选择关联设备">
+          <el-select v-model="ids" filterable multiple placeholder="请选择关联设备">
             <el-option v-for="item in devOptions" :key="item.clientTypeId" :value="item.clientTypeId.toString()"
               :label="item.name" />
           </el-select>

+ 181 - 0
src/views/operation/module/index.vue

@@ -0,0 +1,181 @@
+<template>
+  <div class="app-container">
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getDialog('新增')"
+      v-hasPermi="['operation:module:add']">新增</el-button>
+    <!-- 列表 -->
+    <el-table :data="tableData">
+      <el-table-column label="序号" type="index" align="center"></el-table-column>
+      <el-table-column label="模块类型" prop="typeName" align="center"></el-table-column>
+      <el-table-column label="模块组件" align="center" :formatter="elementIdsFormatter" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDialog('查看', scope.row.typeId, true)">查看</el-button>
+          <el-button type="text" @click="getDialog('编辑', scope.row.typeId)"
+            v-hasPermi="['operation:module:edit']">编辑</el-button>
+          <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['operation:module:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+      @pagination="getList" />
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" :title="title" width="500px" :before-close="cancel">
+      <el-form :model="dialogForm" :rules="rules" ref="dialogForm" label-width="100px" :disabled="disabled">
+        <el-form-item label="模块类型:" prop="typeName">
+          <el-input v-model="dialogForm.typeName" placeholder="请输入模块类型名称" />
+        </el-form-item>
+        <el-form-item label="模块组件:" prop="elementIds">
+          <el-select v-model="dialogForm.elementIds" multiple placeholder="请选择模块组件">
+            <el-option v-for="item in mouldOptions" :key="item.value" :value="item.value.toString()"
+              :label="item.label" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="cancel">取消</el-button>
+        <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list, submit, detail, remove } from '@/api/operation/module'
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      // 列表
+      tableData: [],
+      // 总数据
+      total: 0,
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗标题
+      title: '新增',
+      // 弹窗表单
+      dialogForm: {
+        elementIds: []
+      },
+      // 模块选择
+      mouldOptions: [{
+        value: 1,
+        label: '标题'
+      }, {
+        value: 3,
+        label: '简介'
+      }, {
+        value: 4,
+        label: '内容'
+      }, {
+        value: 5,
+        label: '跳转方式'
+      }, {
+        value: 6,
+        label: '封面模式'
+      }, {
+        value: 7,
+        label: '图片'
+      }, {
+        value: 8,
+        label: '排序'
+      }, {
+        value: 9,
+        label: '列表'
+      }],
+      // 校验
+      rules: {
+        typeName: [{
+          required: true, message: '请输入模块类型名称', trigger: 'blur'
+        }],
+        elementIds: [{
+          required: true, message: '请选择模块组件', trigger: 'change'
+        }]
+      },
+      // 只读
+      disabled: false
+    }
+  },
+  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
+        }
+      })
+    },
+
+    // 弹窗
+    getDialog(title, id, boolean) {
+      this.dialogVisible = true
+      this.title = title
+      if (id) {
+        detail(id).then(res => {
+          if (res.code === 0) {
+            this.dialogForm = res.data
+          }
+        })
+      }
+      this.disabled = boolean
+    },
+
+    // 取消
+    cancel() {
+      this.dialogVisible = false
+      this.$refs.dialogForm.resetFields()
+      this.dialogForm = {}
+    },
+
+    // 提交
+    getSubmit() {
+      this.$refs.dialogForm.validate((valid) => {
+        if (valid) {
+          submit(this.dialogForm).then(res => {
+            if (res.code === 0) {
+              this.getList()
+              this.$message.success(`${this.title}成功!`)
+              this.cancel()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    // 删除
+    getDelete(row) {
+      this.$confirm(`是否删除${row.typeName}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        remove(row.typeId).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      }).catch(() => { })
+    },
+
+    // 字典翻译
+    elementIdsFormatter(row) {
+      return row.elementIds.map(i => this.selectDictLabel(this.mouldOptions, i)).join(',')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

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

@@ -0,0 +1,508 @@
+<template>
+  <div class="app-container">
+    <el-button type="primary" icon="el-icon-plus" size="mini" @click="getPush">新增</el-button>
+    <!-- 模块 -->
+    <div style="display: flex; flex-wrap: wrap;">
+      <el-form class="form" v-for="(item, index) in form" :key="item.id" label-width="auto" :disabled="isRead">
+        <el-form-item class="sort" :label="(index + 1).toString()">
+          <el-link icon="el-icon-close" :underline="false" @click="getDelete(index)" />
+        </el-form-item>
+        <el-form-item v-if="'title' in item" label="标题:">
+          <el-input v-model="item.title" placeholder="请输入内容标题" />
+        </el-form-item>
+        <el-form-item v-if="'description' in item" label="简介:">
+          <el-input v-model="item.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }"
+            placeholder="请输入简介" />
+        </el-form-item>
+        <el-form-item v-if="'contentName' in item" label="内容:">
+          <el-input v-model="item.contentName" prefix-icon="el-icon-search" placeholder="选择内容"
+            @focus="getDialog(item, index, false)" />
+        </el-form-item>
+        <el-form-item v-if="'forwardType' in item" label="跳转方式:">
+          <el-select v-model="item.forwardType" placeholder="请选择跳转方式" @change="forwardTypeChange(item)">
+            <el-option v-for="item in forwardTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="'forwardUrl' in item" label="跳转地址:">
+          <el-input v-model="item.forwardUrl" placeholder="请输入跳转地址" />
+        </el-form-item>
+        <el-form-item v-if="'contentId' in item" label="专区页面:">
+          <el-select v-model="item.contentId" placeholder="请选择跳转专区" @change="contentIdChange(item)">
+            <el-option v-for="item in sceneOptions" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="'isCustom' in item" label="封面模式:">
+          <el-select v-model="item.isCustom" placeholder="选择封面模式" @change="isCustomChange(item, index)">
+            <el-option v-for="item in coverOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="'pic' in item" label="图片:">
+          <Upload listType="picture-card" :url="item.pic" @upload="upload($event, item)" :disabled="isRead" />
+        </el-form-item>
+        <el-form-item v-if="'sort' in item" label="排序:">
+          <el-input-number v-model="item.sort" />
+        </el-form-item>
+        <el-form-item v-if="'childList' in item" label="列表:">
+          <el-button type="primary" @click="getDialog(item, index, true)">添加内容</el-button>
+          <el-table :data="item.childList">
+            <el-table-column label="电台名称" prop="contentName" align="center" show-overflow-tooltip />
+            <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+            <el-table-column label="操作" align="center">
+              <template slot-scope="scope">
+                <el-button type="delete" @click="getRemove(scope.row, index)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="当前状态:">
+          <el-select v-model="item.status" placeholder="请选择当前状态">
+            <el-option v-for="item in disabledOptions" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <el-form-item style="float: right">
+          <el-button type="info">清空</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <!-- 提交 返回按钮 -->
+    <div class="btn">
+      <el-button @click="cancel">取消</el-button>
+      <el-button v-if="!isRead" type="primary" @click="getSubmit">确定</el-button>
+    </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="请选择类型" :disabled="disabled">
+            <el-option v-for="item in audioOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="资源平台:">
+          <el-select v-model="dialogForm.platformId" placeholder="请选择平台">
+            <el-option v-for="item in platformOptions" :key="item.value" :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-form-item>
+      </el-form>
+      <el-table :data="dialogTableData" ref="dialogTableData" :row-key="rowKey" @selection-change="handleSelectionChange"
+        v-loading="loading">
+        <el-table-column v-if="isSelection" type="selection" align="center" reserve-selection key="selection" />
+        <el-table-column v-else label="操作" align="center" key="change">
+          <template slot-scope="scope">
+            <el-button type="text" @click="getSelect(scope.row)">
+              选择
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="音频ID" prop="audioId" align="center" key="audioId" show-overflow-tooltip />
+        <el-table-column label="音频名称" prop="audioName" align="center" key="audioName" show-overflow-tooltip />
+        <el-table-column label="音频封面" align="center" key="audioPic" width="100px">
+          <template slot-scope="scope">
+            <el-image :src="scope.row.audioPic" />
+          </template>
+        </el-table-column>
+        <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
+        <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
+        <el-table-column label="音频类型" prop="audioType" align="center" key="audioType" :formatter="audioFormatter" />
+        <el-table-column label="音频数量" prop="programCount" align="center" key="programCount" />
+        <el-table-column label="付费类型" align="center" key="isFree" :formatter="freeFormatter" width="100px" />
+        <el-table-column label="当前状态" align="center" key="status" :formatter="statusFormatter" />
+      </el-table>
+      <pagination v-show="total > 0" :total="total" :page.sync="dialogForm.pageNum" :limit.sync="dialogForm.pageSize"
+        @pagination="getList" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list } from '@/api/operation/scene'
+import { detail, moduleList, radioList, submitThree } from '@/api/operation/recommend'
+import { coverMixin, audioMixin, platformMixin, isFreeMixin, disabledMixin } from '@/mixin/index'
+export default {
+  mixins: [coverMixin, audioMixin, platformMixin, isFreeMixin, disabledMixin],
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 二级id
+      secondId: this.$route.query.secondId,
+      // 三级id
+      threeId: this.$route.query.threeId,
+      // 表单
+      form: [],
+      // 模板
+      module: [],
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗表单
+      dialogForm: {
+        pageNum: 1,
+        pageSize: 10,
+        audioType: '',
+        platformId: ''
+      },
+      // 弹窗列表
+      dialogTableData: [],
+      // 总数据
+      total: 0,
+      // 禁止操作
+      disabled: false,
+      // 是否启用多选
+      isSelection: true,
+      // 弹窗索引
+      index: 0,
+      // 专区模块
+      sceneOptions: [],
+      // 跳转方式
+      forwardTypeOptions: [{
+        value: 0,
+        label: 'APP内容跳转广播',
+        type: 2
+      }, {
+        value: 1,
+        label: 'APP内容跳转歌曲',
+        type: 11
+      }, {
+        value: 2,
+        label: 'APP内容跳转歌单',
+        type: 10
+      }, {
+        value: 3,
+        label: 'APP内容跳转专辑',
+        type: 8
+      }, {
+        value: 4,
+        label: 'APP内容跳转节目',
+        type: 6
+      }, {
+        value: 7,
+        label: 'APP内容跳转专区',
+        type: 16
+      }, {
+        value: 5,
+        label: 'H5内链'
+      }, {
+        value: 6,
+        label: 'H5外链'
+      }],
+      // 只读
+      isRead: false,
+      // 缓存内容图片
+      picList: {}
+    }
+  },
+  watch: {
+    'dialogForm.audioType'(val) {
+      this.getPlatform({
+        audioType: val
+      })
+    }
+  },
+  mounted() {
+    this.getSceneList()
+    this.getModule()
+  },
+  methods: {
+    // 模块 详情
+    getModule() {
+      let moduleOptions = {
+        1: 'title',
+        3: 'description',
+        4: 'contentName',
+        5: 'forwardType',
+        6: 'isCustom',
+        7: 'pic',
+        8: 'sort',
+        9: 'childList'
+      }
+      moduleList(this.$route.query.moduleTypeId).then(res => {
+        if (res.code === 0) {
+          res.data.elementIds.map(i => {
+            this.module.push(moduleOptions[i])
+          })
+          if (this.$route.query.threeId) {
+            this.getDetail()
+            this.isRead = Boolean(this.$route.query.boolean)
+          }
+        }
+      })
+    },
+
+    // 详情
+    getDetail() {
+      detail(this.$route.query.threeId).then(res => {
+        if (res.code === 0 && res.data.list.length > 0) {
+          // 组件模板
+          let obj = {}
+          this.module.map(j => {
+            obj[j] = ''
+          })
+          // 将详情数据遍历
+          res.data.list.map((i, index) => {
+            let newObj = {}
+            // 只保留组件模板的参数
+            for (const key in i) {
+              if (obj.hasOwnProperty(key)) {
+                newObj[key] = i[key]
+                // 跳转方式关联 内容 栏目 地址
+                if ([0, 1, 2, 3, 4].includes(i.forwardType)) {
+                  newObj.contentName = i.contentName
+                  newObj.module = i.module
+                } else if ([5, 6].includes(i.forwardType)) {
+                  newObj.forwardUrl = i.forwardUrl
+                } else if ([7].includes(i.forwardType)) {
+                  newObj.contentId = i.module.contentId
+                  newObj.module = i.module
+                }
+
+                // 封面模式关联 图片
+                if (i.isCustom === 1) {
+                  this.picList[index] = i.pic
+                }
+              }
+              newObj.status = i.status
+            }
+            this.form.push(newObj)
+          })
+        }
+      })
+    },
+
+    // 新增模块
+    getPush() {
+      let item = {}
+      this.module.map(i => {
+        item[i] = i === 'childList' ? [] : null
+      })
+      this.form.push(item)
+    },
+
+    // 爱听专区
+    getSceneList() {
+      list().then(res => {
+        if (res.code === 0) {
+          res.data.map(i => {
+            this.sceneOptions.push({
+              value: i.id,
+              label: i.name
+            })
+          })
+        }
+      })
+    },
+
+    // 跳转方式
+    forwardTypeChange(item) {
+      this.$set(item, 'module', {}),
+        [0, 1, 2, 3, 4].includes(item.forwardType) ? [
+          this.$set(item, 'contentName', ''),
+          delete item.forwardUrl,
+          delete item.contentId
+        ] : [5, 6].includes(item.forwardType) ? [
+          this.$set(item, 'forwardUrl', ''),
+          delete item.contentName,
+          delete item.contentId
+        ] : [
+          this.$set(item, 'contentId', ''),
+          delete item.contentName,
+          delete item.forwardUrl
+        ]
+    },
+
+    // 封面模式
+    isCustomChange(item, index) {
+      item.isCustom === 1 ? item.pic = this.picList[index] : item.pic = ''
+    },
+
+    // 上传图片
+    upload(e, item) {
+      item.pic = e.file
+    },
+
+    // 专区页面
+    contentIdChange(item) {
+      item.module = {}
+      item.forwardType === 7 ? [
+        item.module.contentType = 16,
+        item.module.contentId = item.contentId
+      ] : ''
+    },
+
+    // 弹窗
+    getDialog(item, index, boolean) {
+      this.dialogVisible = true
+      this.index = index
+      this.isSelection = boolean
+      if ('forwardType' in item) {
+        this.dialogForm.audioType = this.forwardTypeOptions.find(i => i.value === item.forwardType).type
+        this.disabled = true
+      } else {
+        this.dialogForm.audioType = this.audioOptions[0].value
+      }
+      this.getList()
+    },
+
+    // 音频列表
+    getList() {
+      this.loading = true
+      radioList(this.dialogForm).then(res => {
+        if (res.code === 0) {
+          this.dialogTableData = res.data.records
+          this.total = res.data.total
+          let row = ''
+          if (this.form[this.index].childList && this.form[this.index].childList.length > 0) {
+            this.form[this.index].childList.map(i => {
+              row = res.data.records.find(j => j.audioId === i.module.contentId)
+            })
+          }
+          row ? this.$refs.dialogTableData.toggleRowSelection(row) : this.$refs.dialogTableData.clearSelection();
+          this.loading = false
+        }
+      })
+    },
+
+    // 搜索
+    getSearch() {
+      this.dialogForm.pageNum = 1
+      this.getList()
+    },
+
+    rowKey(row) {
+      return row.audioId
+    },
+
+    // 选择
+    getSelect(row) {
+      let e = this.form[this.index]
+      e.module = {
+        contentId: row.audioId,
+        platformId: row.platformId,
+        contentType: row.audioType,
+        description: row.description
+      }
+      e.contentName = row.audioName
+      e.pic = row.audioPic
+      // 封面模式自定义封面会丢失内容封面图片 所以缓存以便改回来使用
+      this.picList[this.index] = row.audioPic
+      this.$message.success('选择成功!')
+      this.dialogVisible = false
+    },
+
+    // 批量选择
+    handleSelectionChange(row) {
+      this.form[this.index].childList = []
+      if (row.length > 0) {
+        row.map(i => {
+          if (this.form[this.index].childList.findIndex(j => j.module.contentId === i.audioId) === -1) {
+            this.form[this.index].childList.push({
+              module: {
+                contentId: i.audioId,
+                platformId: i.platformId,
+                contentType: i.audioType,
+                description: i.description,
+              },
+              contentName: i.audioName,
+              pic: i.audioPic,
+              status: i.status
+            })
+          }
+        })
+      }
+    },
+
+    // 提交
+    getSubmit() {
+      let data = this.secondId ? {
+        secondId: this.secondId,
+        list: this.form
+      } : {
+        threeId: this.threeId,
+        list: this.form
+      }
+      for (const key in this.form) {
+        delete this.form[key].contentId
+      }
+      submitThree(data).then(res => {
+        if (res.code === 0) {
+          this.$message.success('提交成功!')
+          this.cancel()
+        }
+      })
+    },
+
+    // 返回
+    cancel() {
+      this.$tab.closeOpenPage("/operation/operationRecommend");
+    },
+
+    // 删除模块
+    getDelete(index) {
+      this.form.splice(index, 1)
+    },
+
+    // 删除关联
+    getRemove(row, index) {
+      let e = this.form[index].childList.findIndex(i => i.contentId === row.contentId)
+      this.form[index].childList.splice(e, 1)
+    },
+
+    // 字典翻译
+    audioFormatter(row) {
+      return this.selectDictLabel(this.audioOptions, row.audioType)
+    },
+    freeFormatter(row) {
+      return this.selectDictLabel(this.freeOptions, row.isFree)
+    },
+    statusFormatter(row) {
+      return this.selectDictLabel(this.disabledOptions, row.status)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+  padding-bottom: 100px;
+}
+
+.form {
+  width: 500px;
+  border: 1px solid #dcdfe6;
+  box-shadow: 5px 5px 5px 0 #dcdfe6;
+  padding: 20px;
+  margin-bottom: 20px;
+  position: relative;
+  margin-right: 20px;
+
+  .sort {
+    ::v-deep .el-form-item__label-wrap {
+      margin: 0 !important;
+    }
+
+    .el-link {
+      float: right;
+    }
+  }
+}
+
+.btn {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100px;
+  border-top: 1px solid #dcdfe6;
+  box-shadow: 5px 0 10px 0 #dcdfe6;
+  line-height: 100px;
+  text-align: right;
+  padding: 0 20px;
+  background: #FFF;
+}
+</style>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 218 - 890
src/views/operation/recommend/index.vue


+ 165 - 0
src/views/operation/sceneTime/index.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="app-container">
+    <el-button type="primary" size="mini" icon="el-icon-plus" @click="getDialog('新增')" v-hasPermi="['operation:sceneTime:add']">新增</el-button>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column type="index" label="序号" align="center" />
+      <el-table-column label="时间段" align="center">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime }} - {{ scope.row.endTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="时间段文案" prop="name" align="center" />
+      <el-table-column label="时间Icon" width="100px" align="center">
+        <template slot-scope="scope">
+          <el-image :src="scope.row.pic" style="background: #000;" />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" prop="createtTime" align="center" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button type="text" @click="getDialog('查看', scope.row)">查看</el-button>
+          <el-button type="text" @click="getDialog('编辑', scope.row)" v-hasPermi="['operation:sceneTime:edit']">编辑</el-button>
+          <el-button type="delete" @click="getDelete(scope.row, 2)" v-hasPermi="['operation:sceneTime:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 弹窗 -->
+    <el-dialog :visible.sync="dialogVisible" :title="title" width="500px" :before-close="cancel">
+      <el-form :model="dialogForm" ref="dialogForm" :rules="rules" label-width="110px" :disabled="disabled">
+        <el-form-item label="时间段:" prop="date">
+          <el-time-picker is-range v-model="dialogForm.date" start-placeholder="开始时间" end-placeholder="结束时间"
+            value-format="HH:mm:ss" format="HH:mm:ss" placeholder="选择时间范围" />
+        </el-form-item>
+        <el-form-item label="时间段文案:" prop="name">
+          <el-input v-model="dialogForm.name" placeholder="请输入时间段文案" />
+        </el-form-item>
+        <el-form-item label="时间段Icon:" prop="pic">
+          <Upload listType="picture-card" :url="dialogForm.pic" @upload="upload" style="background: #000;" :disabled="disabled" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="cancel">取消</el-button>
+        <el-button v-if="disabled" type="primary" @click="getSubmit">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list, submit, change, detail } from '@/api/operation/sceneTime'
+export default {
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 列表
+      tableData: [],
+      // 弹窗
+      dialogVisible: false,
+      // 弹窗title
+      title: '',
+      // 弹窗表单
+      dialogForm: {},
+      // 校验
+      rules: {
+        date: [{
+          required: true, message: '请选择时间段', trigger: 'change'
+        }],
+        name: [{
+          required: true, message: '请输入时间段文案', trigger: 'blur'
+        }],
+        pic: [{
+          required: true, message: '请上传图片', trigger: 'change'
+        }]
+      },
+      // 只读
+      disabled: false
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    // 列表
+    getList() {
+      this.loading = true
+      list().then(res => {
+        if (res.code === 0) {
+          this.tableData = res.data
+          this.loading = false
+        }
+      })
+    },
+
+    // 弹窗
+    getDialog(title, row) {
+      this.dialogVisible = true
+      this.title = title
+      this.disabled = title === '查看' ? true : false
+      if (row) {
+        this.getDetail(row.id)
+      }
+    },
+
+    // 详情
+    getDetail(id) {
+      detail(id).then(res => {
+        if (res.code === 0) {
+          this.dialogForm = res.data
+          this.dialogForm.date = [res.data.startTime, res.data.endTime]
+        }
+      })
+    },
+
+    // 上传icon
+    upload(e) {
+      this.dialogForm.pic = e.file
+    },
+
+    // 取消
+    cancel() {
+      this.dialogVisible = false
+      this.dialogForm = {
+        date: ['', ''],
+        name: '',
+        pic: ''
+      }
+      this.$refs.dialogForm.resetFields()
+    },
+
+    // 确定
+    getSubmit() {
+      this.$refs.dialogForm.validate((valid) => {
+        if (valid) {
+          this.dialogForm.startTime = this.dialogForm.date[0]
+          this.dialogForm.endTime = this.dialogForm.date[1]
+          delete this.dialogForm.date
+          submit(this.dialogForm).then(res => {
+            if (res.code === 0) {
+              this.$message.success('提交成功!')
+              this.getList()
+              this.cancel()
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+
+    getDelete(row, status) {
+      this.$confirm(`是否删除${row.name}?`, '提示', {
+        type: 'warning'
+      }).then(() => {
+        change(row.id, status).then(res => {
+          if (res.code === 0) {
+            this.$message.success('删除成功!')
+            this.getList()
+          }
+        })
+      })
+    }
+  }
+}
+</script>

+ 4 - 4
src/views/operation/tag/detail.vue

@@ -22,10 +22,8 @@
       <el-form-item label="频道封面:" prop="channelCover">
         <Upload listType="picture-card" :url="form.channelCover" @upload="upload" :disabled="disabled" />
       </el-form-item>
-      <el-form-item label="频道内容:">
+      <el-form-item label="频道内容:" style="width: 100%;">
         <el-button type="primary" @click="getDialog" :disabled="!form.channelType">关联内容</el-button>
-      </el-form-item>
-      <el-form-item style="width: 1000px">
         <el-table :data="form.listagCategoryAudio">
           <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
           <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
@@ -34,6 +32,8 @@
               <el-image :src="scope.row.audioPic" />
             </template>
           </el-table-column>
+          <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
+          <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
           <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
           <el-table-column label="资源平台" align="center" :formatter="platfromFormatter" />
           <el-table-column label="当前状态" align="center" :formatter="statusFormatter" />
@@ -193,7 +193,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.el-form {
+.el-form-item {
   width: 500px;
 }
 

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

@@ -10,7 +10,7 @@
         </el-select>
       </el-form-item>
       <el-form-item label="关联设备:" prop="deviceIds">
-        <el-select v-model="form.deviceIds" multiple placeholder="请选择关联设备">
+        <el-select v-model="form.deviceIds" filterable multiple placeholder="请选择关联设备">
           <el-option v-for="item in deviceOptions" :key="item.clientTypeId" :value="item.clientTypeId.toString()"
             :label="item.name" />
         </el-select>
@@ -77,6 +77,8 @@
             <el-image :src="scope.row.audioPic" />
           </template>
         </el-table-column>
+        <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
+        <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
         <el-table-column label="付费类型" align="center" prop="isFree" :formatter="freeFormatter" />
         <el-table-column label="资源平台" align="center" prop="platformId" :formatter="platfromFormatter" />
       </el-table>

+ 2 - 2
src/views/project/list/detail.vue

@@ -8,7 +8,7 @@
       <el-form-item label="图标:">
         <Upload :url="projectForm.pic" listType="picture-card" @upload="getUpload($event, 'icon')" />
       </el-form-item>
-      <el-form-item v-if="projectForm.id" label="版本管理:" style="width: 1500px">
+      <el-form-item v-if="projectForm.id" label="版本管理:" style="width: 100%;">
         <!-- app列表 -->
         <el-button type="primary" icon="el-icon-plus" @click="getDialog()">新增</el-button>
         <el-table :data="versionData" v-loading="loading" height="342px">
@@ -323,7 +323,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.form {
+.el-form-item {
   width: 500px;
 }
 

+ 6 - 6
src/views/registration/content/detail.vue

@@ -26,14 +26,12 @@
       <el-form inline size="mini" style="width: 100%">
         <el-form-item label="资源平台:">
           <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
-            <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
+            <el-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.audioType" placeholder="请选择音频类型">
-            <el-option v-for="item in audioTypeOptions" :key="item.value" :value="item.value"
-              :label="item.label" />
+            <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="音频名称:">
@@ -52,6 +50,8 @@
             <el-image :src="scope.row.audioPic" />
           </template>
         </el-table-column>
+        <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
+        <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
         <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
         <el-table-column label="音频数量" prop="programCount" align="center" />
         <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
@@ -61,8 +61,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>

+ 2 - 2
src/views/registration/lottery/detail.vue

@@ -29,7 +29,7 @@
           <el-option v-for="item in numOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
-      <el-form-item style="width: 1200px">
+      <el-form-item style="width: 100%">
         <el-table :data="form.lotteryConfigGoodList">
           <el-table-column label="顺序" type="index" align="center" />
           <el-table-column label="奖品类型" align="center">
@@ -228,7 +228,7 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.el-form {
+.el-form-item {
   width: 500px;
 }
 

+ 3 - 3
vue.config.js

@@ -35,10 +35,10 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `https://o3tapi.radio1964.com/admin`, // 测试
+        target: `https://o3tapi.radio1964.com/admin`,
         // target: `http://192.168.0.217:2678/admin`, // 付新保本地
-        // target: `http://192.168.0.185:2027`, // 陈浩
-        // target: `http://10.0.2.36:2027`,
+        // target: `http://192.168.199.74:2027`, // 陈浩
+        // target: `http://10.0.2.24:2027`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''