2
0

237 Коммиты 2872107523 ... 97361b915d

Автор SHA1 Сообщение Дата
  zeng.chen 97361b915d fix:去掉新增设备页的自动出现的删除按钮 1 месяц назад
  332777428@qq.com d0fea505c6 feat: 解决会员套餐,获取详情数据连续多次的问题 1 месяц назад
  332777428@qq.com e019e7b658 feat: 解决会员套餐,点击取消出现404错误的问题 1 месяц назад
  332777428@qq.com b29ff60e6e feat: 解决查看历史记录,第一次进入查看,页面异常显示 1 месяц назад
  332777428@qq.com b2f793d4fd Merge branch 'develop/3.2.9' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.9 1 месяц назад
  332777428@qq.com ddc6d6de02 feat: 解决详情页面切换不自动刷新的问题 1 месяц назад
  zeng.chen ec5e589aad fix:音乐套餐增加报错提示 1 месяц назад
  332777428@qq.com 61385cc253 feat: 解决导出文件还未创建或失败不能下载的问题 1 месяц назад
  332777428@qq.com f77df14d66 Merge branch 'develop/3.2.9' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.9 1 месяц назад
  332777428@qq.com 21f40cf844 feat: 解决导出文件还未创建或失败不能下载的问题 1 месяц назад
  zeng.chen 0c7350b670 feature:去掉旧的设备会员收费时间 1 месяц назад
  zeng.chen 8d325997bf feature:增加音乐-博客专辑的序号功能 1 месяц назад
  332777428@qq.com 538c94807f feat: 解决部分频道,跳转到详情界面出现黑屏的问题 1 месяц назад
  332777428@qq.com fd59ccc1da feat: 解决报错问题 1 месяц назад
  332777428@qq.com 124765e6e3 feat: 去掉多频多台和定制频道最外层的序号 1 месяц назад
  332777428@qq.com ff4691ee0f feat: 解决多频多台序号输入框无法出现的问题 1 месяц назад
  332777428@qq.com a672c3affd feat: 解决定制频道序号输入框无法出现的问题 1 месяц назад
  332777428@qq.com 25d76737ad feat: 对定多频多台详情序号编辑符号隐现处理 1 месяц назад
  zeng.chen 0812e6d0ac feature:修改编辑排序不受disabled影响 1 месяц назад
  zeng.chen ef3acfb084 feature:修改不能排序的不显示编辑按钮 1 месяц назад
  zeng.chen 53437da790 feature:修改音乐专辑只有一个的修改序号问题 1 месяц назад
  332777428@qq.com 12f4f20662 feat: 对定多频多台详情序号处理 1 месяц назад
  332777428@qq.com c9832d755a Merge branch 'develop/3.2.9' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.9 1 месяц назад
  332777428@qq.com afeca9db1e feat: 对定制频道详情序号处理 1 месяц назад
  zeng.chen 36cc41f7e5 feature:修改音乐专辑插入下标的规则 1 месяц назад
  zeng.chen 35c2625057 feature:去掉回车键的方法 1 месяц назад
  zeng.chen feed25fd1c feature:音乐专辑的序号挪到新增里 1 месяц назад
  zeng.chen 4f9fe740fa feature:增加设备的资源平台的唯一性校验 1 месяц назад
  332777428@qq.com f6955f9a6e feat: 对定制频道和多频多台enter键处理 1 месяц назад
  332777428@qq.com 280187c6d5 feat: 对定制频道和多频多台enter键处理 1 месяц назад
  332777428@qq.com b4aa643425 feat: 定制频道编辑交换位置本地处理 1 месяц назад
  332777428@qq.com 5289f030c2 Merge branch 'develop/3.2.9' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.9 1 месяц назад
  332777428@qq.com 497b2950ff feat: 多频多台编辑交换位置本地处理 1 месяц назад
  zeng.chen c3c03450dc feature:修改添加设备的资源平台的编辑刷新 1 месяц назад
  332777428@qq.com 53a4b23c31 feat: 定制频道和多频多台编辑序号修改效果处理 1 месяц назад
  332777428@qq.com af65070d7f feat: 处理定制频道和多频多台编辑序号没变化情况处理 1 месяц назад
  332777428@qq.com eef0eb328f feat: 优化定制频道和多频多台展示处理 1 месяц назад
  332777428@qq.com 0a29bd31b4 feat: 处理结果定制频道添加添加序号和编辑图标 1 месяц назад
  332777428@qq.com 89ea5cd47b feat: 处理结果多频多台添加添加序号和编辑图标 1 месяц назад
  332777428@qq.com 047e47a237 feat: 多频多台添加添加序号和编辑图标 1 месяц назад
  zeng.chen 81a46cad3d feature:修改设备详情资源的资源文案,数据源获取方法 1 месяц назад
  zeng.chen be41378371 feature:修改音乐专辑的下标选择 1 месяц назад
  zeng.chen 5fa2214823 feature:设备详情页新增资源平台选项 1 месяц назад
  332777428@qq.com 0c75825cbd Merge branch 'develop/3.2.9' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.9 1 месяц назад
  332777428@qq.com bfb23358be feat: 解决实现编辑后回到上一个界面出现的问题 1 месяц назад
  zeng.chen c74186a82e fix:优化序号的选择功能 1 месяц назад
  zeng.chen dd94c09d47 feature:增加音乐专辑的编辑按钮 1 месяц назад
  332777428@qq.com 8bffd2e3c7 feat: 修复音乐套餐和流量套餐名称没对应上问题 1 месяц назад
  332777428@qq.com ab6d565694 feat: 解决,系统管理,语音管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 1823fe1839 feat: 解决,系统管理,通知公告,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 4062b2a47a feat: 解决,系统管理,参数设置,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com a0d1f8ece1 feat: 解决,系统管理,字典管理详情,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 1f138ad62b feat: 解决,系统管理,字典管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 6ab2118774 feat: 解决,系统管理,岗位管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 99431e6dde feat: 解决,系统管理,部门管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com e157075412 feat: 解决,系统管理,菜单管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 893a119e8c feat: 解决,系统管理,角色管理,翻页面,回到之前界面数据不刷新 1 месяц назад
  332777428@qq.com 8fd6acfa2a feat: 解决,项目管理,用户管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 1e15662b3d feat: 解决,项目管理,项目列表详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com af3b0a06a0 feat: 解决,项目管理,项目列表,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 272c6ef869 feat: 解决,用户管理,仓库账号,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b3f074d132 feat: 解决,用户管理,用户账号,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 19e263b3e5 feat: 解决,订单管理,流量订单,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 0e41e40865 feat: 解决,订单管理,商品订单,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b5f4100c5b feat: 解决,商品管理,商品推荐详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 40e6ba2eb6 feat: 解决,商品管理,商品推荐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 013623fb1a feat: 解决,推送管理,推送弹窗详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com db4ef42005 feat: 解决,推送管理,推送弹窗,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 1e8f209fc9 feat: 解决,推送管理,APP升级详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 530d4c33bd feat: 解决,推送管理,APP升级,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 57b81bce02 feat: 解决,推送管理,消息推送,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 9f98c41623 feat: 解决,签到管理,兑换订单,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 738b6a3f46 feat: 解决,签到管理,兑换配置详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 421fa4e652 feat: 解决,签到管理,兑换配置,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com a25586545c feat: 解决,签到管理,内容配置详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com ba5af0771e feat: 解决,签到管理,内容配置,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 3e93ad8c4d feat: 解决,签到管理,抽奖统计详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 18b8e0f3c2 feat: 解决,签到管理,抽奖统计,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 9d24752351 feat: 解决,签到管理,抽奖配置,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 108bf3ac63 feat: 解决,签到管理,签到配置,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com c35deae479 feat: 解决,猫舍管理,栏目管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 0299c2c363 feat: 解决,猫舍管理,运营管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 53d4afb407 feat: 解决,猫舍管理,内容推荐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 71fd558a93 feat: 解决,猫舍管理,内容列表,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 04578e03ef feat: 解决,服务管理,内容视频和文章,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 7e5d89a695 feat: 解决,服务管理,微信轮播图详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 38d7cea4c9 feat: 解决,服务管理,微信轮播图,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 939ddd0e8d feat: 解决,服务管理,上传壁纸,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com ada6e36bca feat: 解决,服务管理,说明书管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b66a8fdd1c feat: 解决,服务管理,说明书管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 6b8d27e676 feat: 解决,服务管理,门店管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 78cd111006 feat: 解决,服务管理,门店管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 83ad450cbb feat: 解决,服务管理,反馈类型,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com abf2fec93a feat: 解决,服务管理,反馈列表详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 6b87bb7b53 feat: 解决,服务管理,反馈列表,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 2f868c5843 feat: 解决,服务管理,活动管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 72b9a70d73 feat: 解决,服务管理,活动管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 9d98e5530b feat: 解决,服务管理,协议管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com e32298c243 feat: 解决,服务管理,协议管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 6daa0c76c8 feat: 解决,服务管理,场景专区详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d52ad4b6ff feat: 解决,服务管理,场景专区,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 24e544e1a1 feat: 解决,服务管理,唤醒音详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 9ba5d2efa4 feat: 解决,服务管理,唤醒音,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 1e416ceb66 feat: 解决,服务管理,爱听弹窗,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 274135fcd3 feat: 解决,服务管理,标签分类详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b9d31c27b1 feat: 解决,服务管理,标签分类,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d0561ea058 feat: 解决,服务管理,多频多台详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com f974371551 feat: 解决,服务管理,多频多台,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 26752218a0 feat: 解决,服务管理,定制频道详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 721893e589 feat: 解决,服务管理,定制频道,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 941350b35b feat: 解决,服务管理,场景时间,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 8bb5899c17 feat: 解决,服务管理,模块配置,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 3524ac87c7 feat: 解决,服务管理,推荐管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 00cf452bcd feat: 解决,服务管理,推荐管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com a77eded867 feat: 解决,服务管理,启动页详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d9a708b462 feat: 解决,服务管理,启动页,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com cfc36b6502 feat: 解决,服务管理,回收记录,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com ccca06a6e4 feat: 解决,服务管理,兑换码,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 58262e6e15 feat: 解决,服务管理,音乐套餐和流量套餐详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 04497e5853 feat: 解决,服务管理,音乐套餐和流量套餐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 8bfdd5ad2d feat: 解决,服务管理,音乐套餐详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b14a0f7ac7 feat: 解决,服务管理,音乐套餐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 2191f989e9 feat: 解决,服务管理,平台管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com f9c2c7ec74 feat: 解决,音频管理,异常监控,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d42c8431c8 feat: 解决,音频管理,播客分类,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d0b2d5c953 feat: 解决,音频管理,广播分类,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 7cb06ac4ce feat: 解决,音频管理,资源平台,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com a6d35386fa feat: 解决,音频管理,猫王精选电台详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d31d4f16e9 feat: 解决,音频管理,猫王精选电台,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com ab76d3cb7e feat: 解决,音频管理,广播电台详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 6132f1bfa5 feat: 解决,音频管理,广播电台,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 260c0791be feat: 解决,音频管理,主播详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com c6d99b0adc feat: 解决,音频管理,主播,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com dab1290648 feat: 解决,音频管理,节目详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com f17e07e491 feat: 解决,音频管理,节目,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 271e9323dd feat: 解决,音频管理,播客专辑详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 499a11a9da feat: 解决,音频管理,播客专辑,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 2989dd071d feat: 解决,音频管理,音乐专辑详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 8bc276ec8b feat: 解决,音频管理,音乐专辑,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 664ab27336 feat: 解决,音频管理,歌单详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 25612b880f feat: 解决,音频管理,歌单,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com c470b82309 feat: 解决,音频管理,歌曲详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 6994b347d0 feat: 解决,音频管理,歌曲,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com a6d3080fcd feat: 解决,音频管理,歌手详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 2b6f7300d3 feat: 解决,音频管理,歌手,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com efd0158d15 feat: 解决,设备管理,预警管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 7d6fb4f0ea feat: 解决,设备管理,云小微,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com d5fc08f94e feat: 解决,设备管理,功能权限,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 2840839783 feat: 解决,设备管理,设备分类,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com f36804f6ad feat: 解决,设备管理,设备音乐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com feb5ad5432 feat: 解决,设备管理,设备文章详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com ef6c98a3e3 feat: 解决,设备管理,设备文章,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com f1764bb592 feat: 解决,设备管理,设备升级详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 5f34096ba8 feat: 解决,设备管理,设备升级,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com e90a3e6918 feat: 解决,设备管理,设备大类详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 545e3c810b feat: 解决,设备管理,设备大类,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b9823a918b feat: 解决,设备管理,设备列表详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 0594977289 feat: 解决,设备管理,设备列表,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com b4b9217d53 feat: 解决,内容管理,文章管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 5695327c5e feat: 解决,内容管理,文章管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 164a23c770 feat: 解决,内容管理,视频管理详情,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com a20d16585a feat: 解决,服务管理,音乐套餐,翻页面,回到之前界面数据不刷新 2 месяцев назад
  332777428@qq.com 14223c8ba3 Merge branch 'develop/3.2.8' of http://60.205.190.38:9000/zhaoheqing/ohplay_system into develop/3.2.8 2 месяцев назад
  332777428@qq.com 44b1cfb78f feat: 解决内容管理视频管理,翻页面,回到之前界面数据不刷新 2 месяцев назад
  zeng.chen 1148a4f9da fix:去掉提示语 2 месяцев назад
  zeng.chen e4ed83928c fix:去掉会员/流量套餐的空列表提示语 2 месяцев назад
  zeng.chen 54fc264d0f fix:修改服务-会员流量套餐的文案,空提示 2 месяцев назад
  zeng.chen d22c7bcb03 fix:会员订单去掉资源平台选项 2 месяцев назад
  zeng.chen 91fa630055 fix:修改会员订单的平台id为0的问题 2 месяцев назад
  zeng.chen 5a81a87e44 fix:修改流量套餐的提示语判断问题 2 месяцев назад
  zeng.chen b67067e61f fix:修改流量套餐的提示语判断问题 2 месяцев назад
  zeng.chen 1180003306 fix:修改新增会员套餐时,关联设备下拉框数据重复的问题 2 месяцев назад
  zeng.chen 7f70c97e44 feature:修改设备的会员收费时间的文案 2 месяцев назад
  zeng.chen 29498039cd feature:增加添加设备的会员收费时间选项 2 месяцев назад
  zeng.chen 49bd348e5b feature:修改喜马拉雅的平台ID 2 месяцев назад
  zeng.chen b48872bede fix:会员列表增加管理设备的查询 2 месяцев назад
  zeng.chen 52d291f15f feature:修改会员套餐的详情也跳转问题 2 месяцев назад
  zeng.chen e0ecdf9dd3 feature:会员套餐移动到服务列表里 2 месяцев назад
  zeng.chen e5291f4343 feature:增加流量套餐的不可点击功能 3 месяцев назад
  zeng.chen 7a39ebc115 feature:增加会员套餐的不可点击功能 3 месяцев назад
  zeng.chen ee7e60bce5 feature:修改会员套餐的接口刷新功能 3 месяцев назад
  zeng.chen 86706687eb feature:修改流量套餐的新增赠送会员接口功能 3 месяцев назад
  zeng.chen 17d9f59241 feature:调试会员套餐的新增接口功能 3 месяцев назад
  zeng.chen e74e4ef408 feature:添加服务-流量套餐界面的UI,接口 3 месяцев назад
  zeng.chen dec1d165af feature:更新会员套餐的界面,接口 3 месяцев назад
  zeng.chen 58f0ee78fa fix:修改是否赠送流量的默认值 3 месяцев назад
  zeng.chen e677be87ef feature:增加后台的流量套餐的UI 3 месяцев назад
  332777428@qq.com b853f88c88 feat: 数据处理 5 месяцев назад
  332777428@qq.com b5136c68e7 feat: 处理rgb图片上传,接口添加参数处理成功 5 месяцев назад
  332777428@qq.com 8868de7be3 feat: 处理rgb图片上传,兼容上传图片插件处理 5 месяцев назад
  zeng.chen 60c9611ca0 fix:修改后台管理的删除文案 5 месяцев назад
  zeng.chen 9454554c40 fix:修改地址为必填项 5 месяцев назад
  zeng.chen 09d5e8fe26 fix:修改上传组件的属性 5 месяцев назад
  zeng.chen 6a67e81741 fix:增加banner图片的校验 5 месяцев назад
  zeng.chen 1b2999acd4 feature:修改管理后台的轮播图接口参数 5 месяцев назад
  zeng.chen bb2db5fddd feature:添加微信轮播图的接口,界面刷新 5 месяцев назад
  zeng.chen f1d6583110 feature:添加后台管理界面的微信轮播图功能 5 месяцев назад
  332777428@qq.com 7f07e32d28 feat: 解决没有删除图片,图片还存在提示请上传图片的问题 6 месяцев назад
  332777428@qq.com d14214d696 feat: 上传的壁纸分辨率为做限制大小 6 месяцев назад
  332777428@qq.com 25c88c5e65 feat: 编辑内容时,删除壁纸,点击保存,显示保存成功 6 месяцев назад
  332777428@qq.com b3e90e9d20 feat: 解决新增壁纸后,页面不会刷新 6 месяцев назад
  332777428@qq.com 483318f431 feat: 编辑已上传壁纸时,替换壁纸,页面列表壁纸会消失 6 месяцев назад
  332777428@qq.com 7bed11b4c6 feat: 适配上传壁纸图片大小展示 6 месяцев назад
  Damon fc94eb1c3a feat: 播客专辑资源平台为api接口的,合集内容不允许改变排序 7 месяцев назад
  Damon 5ad77c72cf feat: 播客专辑资源平台为api接口的,合集内容不允许改变排序 7 месяцев назад
  Damon 776634f804 feat: 音乐资源资源平台为api接口的,合集内容不允许改变排序 7 месяцев назад
  Damon 95abc7bba5 feat: 歌单、资源平台为api接口的,合集内容允许改变排序 7 месяцев назад
  Damon f9b29f2fb5 feat: 处理弹窗报频繁展示处理 7 месяцев назад
  Damon 69a812140a feat: 兼容H5页面数据处理 7 месяцев назад
  Damon 3108540502 feat: 增加说明书二维码复制链接功能 7 месяцев назад
  Damon 1e7f88421c feat: 调整批量上传按钮类型风格 7 месяцев назад
  Damon 1744e16072 feat: 解决上传获取不到平台id 的问题 7 месяцев назад
  Damon 074a7e14f3 feat: 处理批量上传弹窗选择资源平台上传 7 месяцев назад
  Damon a7ad005226 feat: 调整说明书处理 7 месяцев назад
  Damon 94e9b8aefd feat: 修复已功能类型,添加到了已删除的数据 8 месяцев назад
  Damon f09cf1d42a feat: 修复已功能类型,添加到了已删除的数据 8 месяцев назад
  Damon d2eaab43d4 feat: 修复设备列表详情可多选小程序和app 8 месяцев назад
  Damon 2bba0319a6 feat: 增加钢琴音响壁纸图片删除和编辑修复 8 месяцев назад
  Damon 829302df2f feat: 增加钢琴音响壁纸图片删除功能 8 месяцев назад
  Damon f9f0231c00 feat: 增加钢琴音响壁纸图片重新编辑功能 8 месяцев назад
  Damon 5c6fae1b44 feat: 增加钢琴音响上传壁纸列表界面和新增数据 8 месяцев назад
  Damon 8b330d7aab feat: 增加说明书管理编辑和新增功能 8 месяцев назад
  Damon e54b5342a2 feat: 增加说明书管理列表界面和新增数据 8 месяцев назад
  Damon 5bc48859ff feat: 处理音乐专辑添加多个列表数据,原来的数据不存在的问题 8 месяцев назад
  Damon edad4b0a49 feat: 处理播客专辑列表,自动被选中 8 месяцев назад
  Damon 096d6db06a feat: 处理音乐专辑列表,自动被选中 8 месяцев назад
  Damon f1be0bd8c5 feat: 处理歌单列吧,自动被选中 8 месяцев назад
  Damon 3aa1fd50e6 feat: 活动管理-新增赠送流量特殊处理 8 месяцев назад
  Damon a37cae5608 feat: 处理播客专辑列表数据展示中全选和全不选问题 8 месяцев назад
  Damon 07d47db1c4 feat: 增添加音乐专辑详情添加多个音频,上下移动删除 8 месяцев назад
  Damon f1b465ef46 feat: 增添加播客专辑详情添加多个音频,上下移动删除 8 месяцев назад
  Damon 6af97328c1 feat: 增添加歌单详情添加多个音频,上下移动删除 8 месяцев назад
  Damon 5aed216b6e feat: 播控专辑批量添加自行上传的音频 8 месяцев назад
  Damon f80e4ff957 feat: 音乐专辑批量添加自行上传的音频 8 месяцев назад
  Damon d43694bd14 feat: 创建歌单/节目支持批量添加自行上传的音频 8 месяцев назад
  Damon ff7100dab4 feat: 处理设备名称 8 месяцев назад
  Damon 115c60011d feat: 添加设备列表-设备详情新增应用类型字段 8 месяцев назад
100 измененных файлов с 5977 добавлено и 2257 удалено
  1. 1 0
      package.json
  2. 4 4
      src/api/music/list.js
  3. 6 4
      src/api/ohplay/operation.js
  4. 1 1
      src/api/operation/channels.js
  5. 48 0
      src/api/operation/explain.js
  6. 40 0
      src/api/operation/piano.js
  7. 68 0
      src/api/operation/wxbanner.js
  8. 26 4
      src/api/service/package.js
  9. 22 16
      src/components/AudioUpload/index.vue
  10. 167 79
      src/components/Upload/index.vue
  11. 339 302
      src/mixin/index.js
  12. 392 170
      src/router/index.js
  13. 20 4
      src/utils/request.js
  14. 560 234
      src/views/content/article/detail.vue
  15. 1 0
      src/views/content/article/index.vue
  16. 50 29
      src/views/content/video/detail.vue
  17. 1 0
      src/views/content/video/index.vue
  18. 114 62
      src/views/device/article/detail.vue
  19. 3 3
      src/views/device/article/index.vue
  20. 2 1
      src/views/device/category/index.vue
  21. 289 112
      src/views/device/class/detail.vue
  22. 1 0
      src/views/device/class/index.vue
  23. 2 0
      src/views/device/function/index.vue
  24. 342 91
      src/views/device/list/detail.vue
  25. 2 1
      src/views/device/list/index.vue
  26. 3 1
      src/views/device/music/index.vue
  27. 3 3
      src/views/device/version/detail.vue
  28. 2 1
      src/views/device/version/index.vue
  29. 1 0
      src/views/device/warning/index.vue
  30. 101 32
      src/views/device/yxw/index.vue
  31. 1 0
      src/views/goods/list/detail.vue
  32. 3 1
      src/views/goods/list/index.vue
  33. 242 180
      src/views/music/album/detail.vue
  34. 39 156
      src/views/music/album/index.vue
  35. 3 2
      src/views/music/anchor/detail.vue
  36. 1 0
      src/views/music/anchor/index.vue
  37. 282 231
      src/views/music/blog/detail.vue
  38. 1 0
      src/views/music/blog/index.vue
  39. 1 0
      src/views/music/blogclass/index.vue
  40. 2 1
      src/views/music/choiceness/detail.vue
  41. 1 0
      src/views/music/choiceness/index.vue
  42. 137 68
      src/views/music/list/detail.vue
  43. 83 8
      src/views/music/list/index.vue
  44. 481 131
      src/views/music/menu/detail.vue
  45. 1 0
      src/views/music/menu/index.vue
  46. 3 0
      src/views/music/monitor/index.vue
  47. 1 0
      src/views/music/platform/index.vue
  48. 4 3
      src/views/music/program/detail.vue
  49. 1 0
      src/views/music/program/index.vue
  50. 4 3
      src/views/music/radio/detail.vue
  51. 1 0
      src/views/music/radio/index.vue
  52. 1 0
      src/views/music/radioclass/index.vue
  53. 3 2
      src/views/music/singer/detail.vue
  54. 1 0
      src/views/music/singer/index.vue
  55. 3 0
      src/views/ohplay/content/index.vue
  56. 3 0
      src/views/ohplay/operation/index.vue
  57. 3 0
      src/views/ohplay/programa/index.vue
  58. 3 0
      src/views/ohplay/recommend/index.vue
  59. 3 2
      src/views/operation/activity/detail.vue
  60. 3 3
      src/views/operation/activity/index.vue
  61. 3 2
      src/views/operation/agreement/detail.vue
  62. 1 0
      src/views/operation/agreement/index.vue
  63. 110 1
      src/views/operation/channel/detail.vue
  64. 83 3
      src/views/operation/channel/index.vue
  65. 108 1
      src/views/operation/channels/detail.vue
  66. 92 1
      src/views/operation/channels/index.vue
  67. 2 1
      src/views/operation/dialog/index.vue
  68. 198 0
      src/views/operation/explain/detail.vue
  69. 143 0
      src/views/operation/explain/index.vue
  70. 2 1
      src/views/operation/feedbacklist/detail.vue
  71. 2 0
      src/views/operation/feedbacklist/index.vue
  72. 1 0
      src/views/operation/feedbacktype/index.vue
  73. 2 1
      src/views/operation/map/detail.vue
  74. 1 0
      src/views/operation/map/index.vue
  75. 1 0
      src/views/operation/module/index.vue
  76. 302 0
      src/views/operation/piano/index.vue
  77. 565 276
      src/views/operation/recommend/detail.vue
  78. 3 0
      src/views/operation/recommend/index.vue
  79. 3 2
      src/views/operation/scene/detail.vue
  80. 2 1
      src/views/operation/scene/index.vue
  81. 3 0
      src/views/operation/sceneTime/index.vue
  82. 3 2
      src/views/operation/startPage/detail.vue
  83. 1 0
      src/views/operation/startPage/index.vue
  84. 2 1
      src/views/operation/tag/detail.vue
  85. 2 1
      src/views/operation/tag/index.vue
  86. 2 1
      src/views/operation/waken/detail.vue
  87. 1 0
      src/views/operation/waken/index.vue
  88. 205 0
      src/views/operation/wxbanner/detail.vue
  89. 165 0
      src/views/operation/wxbanner/index.vue
  90. 20 10
      src/views/order/list/index.vue
  91. 2 1
      src/views/project/list/detail.vue
  92. 3 0
      src/views/project/list/index.vue
  93. 2 1
      src/views/push/dialog/detail.vue
  94. 3 1
      src/views/push/dialog/index.vue
  95. 3 0
      src/views/push/message/index.vue
  96. 3 1
      src/views/push/update/detail.vue
  97. 3 1
      src/views/push/update/index.vue
  98. 3 2
      src/views/registration/content/detail.vue
  99. 1 0
      src/views/registration/content/index.vue
  100. 0 0
      src/views/registration/exchange/detail.vue

+ 1 - 0
package.json

@@ -55,6 +55,7 @@
     "js-cookie": "3.0.1",
     "jsencrypt": "3.2.1",
     "nprogress": "0.2.0",
+    "qrcode": "^1.5.4",
     "quill": "^1.3.7",
     "screenfull": "5.0.2",
     "sortablejs": "1.10.2",

+ 4 - 4
src/api/music/list.js

@@ -19,7 +19,7 @@ export function submit(data) {
 }
 
 // 详情
-export function detail(id){
+export function detail(id) {
   return request({
     url: `/admin/program/queryById/${id}`,
     method: 'get'
@@ -35,7 +35,7 @@ export function remove(id) {
 }
 
 // 上下架
-export function change(id, status){
+export function change(id, status) {
   return request({
     url: `/admin/program/hitOrSold/${id}/${status}`,
     method: 'get'
@@ -43,10 +43,10 @@ export function change(id, status){
 }
 
 // 批量上传歌曲
-export function upload(data){
+export function upload(data) {
   return request({
     url: `/admin/program/batch/upload`,
     method: 'post',
     data
   })
-}
+}

+ 6 - 4
src/api/ohplay/operation.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 
 // 广告位 推荐位 快捷位上传
-export function create(data){
+export function create(data) {
   return request({
     url: `/house/tAdminAdvertising/add`,
     method: 'post',
@@ -10,16 +10,18 @@ export function create(data){
 }
 
 // 运营管理列表
-export function list(data){
-  return request({
+export function list(data) {
+  var res = request({
     url: `/house/tAdminAdvertising/list`,
     method: 'post',
     data
   })
+  console.log("运营管理列表", res)
+  return res;
 }
 
 // 删除
-export function remove(ids){
+export function remove(ids) {
   return request({
     url: `/house/tAdminAdvertising/remove/${ids}`,
     method: 'delete',

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

@@ -83,7 +83,7 @@ export function channelDetail(data) {
   })
 }
 
-// 编辑频道
+// 编辑外层频道数据 最外层
 export function channeledit(data) {
   return request({
     url: `/admin/config/channel/edit`,

+ 48 - 0
src/api/operation/explain.js

@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+
+// 获取列表
+export function list(data) {
+  return request({
+    url: `/admin/electronicManual/page`,
+    method: 'post',
+    data,
+    // headers: {
+    //   'Content-Type': 'multipart/form-data'
+    // }
+  })
+}
+
+// status 0:上架 1:下架 2:删除
+export function deletes(id, status) {
+  return request({
+    url: `/admin/electronicManual/hitOrSold/${id}/${status}`,
+    method: 'get'
+  })
+}
+
+// 详情
+export function detail(id) {
+  return request({
+    url: `/admin/electronicManual/detail?id=` + id,
+    method: 'get'
+  })
+}
+
+// 新增 
+export function add(data) {
+  return request({
+    url: `/admin/electronicManual/save`,
+    method: 'post',
+    data
+  })
+}
+
+//  编辑
+export function edit(data) {
+  return request({
+    url: `/admin/electronicManual/update`,
+    method: 'post',
+    data
+  })
+}

+ 40 - 0
src/api/operation/piano.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+
+// 获取列表
+export function list(data) {
+  return request({
+    url: `/admin/wallpaperConfig/page`,
+    method: 'post',
+    data,
+    // headers: {
+    //   'Content-Type': 'multipart/form-data'
+    // }
+  })
+}
+
+// status 0:上架 1:下架 2:删除
+export function deletes(id, status) {
+  return request({
+    url: `/admin/wallpaperConfig/hitOrSold/${id}/${status}`,
+    method: 'get'
+  })
+}
+
+// 新增 
+export function add(data) {
+  return request({
+    url: `/admin/wallpaperConfig/save`,
+    method: 'post',
+    data
+  })
+}
+
+//  编辑
+export function edit(data) {
+  return request({
+    url: `/admin/wallpaperConfig/update`,
+    method: 'post',
+    data
+  })
+}

+ 68 - 0
src/api/operation/wxbanner.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+
+// 获取列表
+export function list(data) {
+    let status = data.status;
+    let url = `/miniBannerConfig/page?pageNum=${data.pageNum}&pageSize=${data.pageSize}`
+    if (status != -1) {
+        url += `&status=${status}`
+    }
+    return request({
+        url: url,
+        method: 'get',
+        data,
+        // headers: {
+        //   'Content-Type': 'multipart/form-data'
+        // }
+    })
+}
+
+// status 2:删除
+export function deletes(id) {
+    return request({
+        url: `/miniBannerConfig/remove?id=${id}`,
+        method: 'post',
+        data: {
+            "id": id,
+        }
+    })
+}
+// status 0上架,1下架
+export function upAnddown(id, status) {
+    return request({
+        url: `/miniBannerConfig/updateStatus`,
+        method: 'post',
+        data: {
+            "id": id,
+            "status": status,
+        }
+    })
+}
+
+// 详情
+export function detail(id) {
+    return request({
+        url: `/miniBannerConfig/get?id=` + id,
+        method: 'get'
+    })
+}
+
+// 新增 
+export function add(data) {
+    return request({
+        url: `/miniBannerConfig/save`,
+        method: 'post',
+        data
+    })
+}
+
+//  编辑
+export function edit(data) {
+    return request({
+        url: `/miniBannerConfig/update`,
+        method: 'post',
+        data
+    })
+}
+

+ 26 - 4
src/api/service/package.js

@@ -1,7 +1,7 @@
 import request from '@/utils/request'
 
 // 列表
-export function list(data){
+export function list(data) {
   return request({
     url: `/admin/goods/list`,
     method: 'post',
@@ -18,7 +18,7 @@ export function detail(id) {
 }
 
 // 修改
-export function edit(data){
+export function edit(data) {
   return request({
     url: `/admin/goods/edit`,
     method: 'put',
@@ -27,7 +27,7 @@ export function edit(data){
 }
 
 // 新增
-export function create(data){
+export function create(data) {
   return request({
     url: `/admin/goods/add`,
     method: 'post',
@@ -57,4 +57,26 @@ export function goodsList(type) {
     url: `/admin/goods/queryPackageList?platform=${type}`,
     method: 'get'
   })
-}
+}
+// 流量套餐
+export function newGoodsList(type, businessType) {
+  return request({
+    url: `/admin/goods/queryList/${type}/${businessType}`,
+    method: 'get'
+  })
+}
+
+// 查询设备下对应的赠送的商品列表
+export function deviceGoodsList(type, businessType, deviceIds) {
+  // /?deviceIds=${deviceIds}&businessType=${businessType}&type=${type}
+  console.log("获取请求链接=00=");
+  return request({
+    url: `/admin/goods/listByDevice`,
+    method: 'post',
+    data: {
+      "deviceIds": deviceIds,
+      "type": type,
+      "businessType": businessType,
+    }
+  })
+}

+ 22 - 16
src/components/AudioUpload/index.vue

@@ -1,42 +1,48 @@
 <template>
-  <el-upload action="#" :show-file-list="false" multiple :auto-upload="false" :on-change="onChange">
+  <el-upload
+    action="#"
+    :show-file-list="false"
+    multiple
+    :auto-upload="false"
+    :on-change="onChange"
+  >
     <el-button type="primary" slot="trigger">批量选择音频</el-button>
     <el-button :disabled="disabled" @click="getUpload">上传</el-button>
   </el-upload>
 </template>
 
 <script>
-import { upload } from '@/api/music/list'
+import { upload } from "@/api/music/list";
 export default {
   data() {
     return {
       data: new FormData(),
       fileList: [],
       // 是否选完文件
-      disabled: true
-    }
+      disabled: true,
+    };
   },
   methods: {
     // 选择文件
     onChange(file) {
-      this.data.append('multipartFiles', file.raw)
-      this.disabled = false
+      this.data.append("multipartFiles", file.raw);
+      this.disabled = false;
     },
 
     // 上传
     getUpload() {
-      this.$emit('loading')
-      upload(this.data).then(res => {
+      this.$emit("loading");
+      upload(this.data).then((res) => {
         if (res.code === 0) {
-          this.$message.success('上传成功!')
-          this.disabled = true
-          this.data = []
-          this.$emit('upload')
+          this.$message.success("上传成功!");
+          this.disabled = true;
+          this.data = [];
+          this.$emit("upload");
         }
-      })
-    }
-  }
-}
+      });
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>

+ 167 - 79
src/components/Upload/index.vue

@@ -1,10 +1,31 @@
 <template>
   <div class="upload">
-    <el-upload v-if="isBtn()" :action="action" :headers="headers" :multiple="multiple" :data="data" :name="name"
-      :show-file-list="showFileList" :drag="drag" :accept="accept" :listType="listType" :autoUpload="autoUpload"
-      :disabled="disabled" :before-upload="beforeUpload" :on-progress="onProgress" :on-success="onSuccess"
-      :on-error="onError">
-      <el-button v-if="listType !== 'picture-card'" :type="type" ref="upload">
+    <el-upload
+      v-if="isBtn()"
+      :platformId="platformId"
+      :action="action"
+      :headers="headers"
+      :multiple="multiple"
+      :data="data"
+      :name="name"
+      :show-file-list="showFileList"
+      :drag="drag"
+      :accept="accept"
+      :listType="listType"
+      :autoUpload="autoUpload"
+      :disabled="disabled"
+      :before-upload="beforeUpload"
+      :on-progress="onProgress"
+      :on-success="onSuccess"
+      :on-error="onError"
+    >
+      <!-- <el-button v-if="listType !== 'picture-card'" :type="type" ref="upload"> -->
+      <el-button
+        v-if="listType !== 'picture-card'"
+        type="primary"
+        size="mini"
+        ref="upload"
+      >
         <slot v-if="percentage <= 0 && !form.file">点击上传</slot>
         <span v-if="percentage > 0 && !form.file">{{ title }}</span>
         <span v-if="form.file">上传成功</span>
@@ -13,8 +34,14 @@
         <i class="el-icon-plus" />
       </div>
     </el-upload>
-    <el-progress v-if="isPercentage()" type="circle" :percentage="percentage" :status="status"
-      @click.native="handleUpload" :width="146" />
+    <el-progress
+      v-if="isPercentage()"
+      type="circle"
+      :percentage="percentage"
+      :status="status"
+      @click.native="handleUpload"
+      :width="146"
+    />
     <div class="img" v-if="isImg()">
       <i class="el-icon-delete" v-if="!disabled" @click="onDelete" />
       <el-image :src="form.file" />
@@ -23,8 +50,8 @@
 </template>
 
 <script>
-const baseUrl = process.env.VUE_APP_BASE_API
-import { getToken } from '@/utils/auth'
+const baseUrl = process.env.VUE_APP_BASE_API;
+import { getToken } from "@/utils/auth";
 export default {
   props: {
     // 回显图片
@@ -32,197 +59,258 @@ export default {
     // 是否支持多选文件
     multiple: {
       type: Boolean,
-      default: false
+      default: false,
     },
     // 是否显示文件列表
     showFileList: {
       type: Boolean,
-      default: false
+      default: false,
     },
     // 是否支持拖拽上传
     drag: {
       type: Boolean,
-      default: false
+      default: false,
     },
     // 上传类型
     listType: {
       type: String,
-      default: 'text'
+      default: "text",
+    },
+    listTypes: {
+      type: String,
+      default: "text",
+    },
+    platformId: {
+      type: Number,
+      default: null,
     },
     // 是否支持自动上传
     autoUpload: {
       type: Boolean,
-      default: true
+      default: true,
     },
     // 是否禁用
     disabled: {
       type: Boolean,
-      default: false
+      default: false,
     },
     // 最大允许上传个数
     limit: Number,
     // 文件类型
     accept: {
       type: String,
-      default: ''
+      default: "",
     },
-    // 文件名
+
+    // 文件名  multipartFile
     name: {
       type: String,
-      default: 'multipartFile'
+      default: "multipartFile",
     },
     // 图片尺寸
     width: {
       type: Number,
-      default: null
+      default: null,
     },
     height: {
       type: Number,
-      default: null
+      default: null,
     },
     // 文件大小
     size: {
       type: Number,
-      default: null
-    }
+      default: null,
+    },
   },
+
   data() {
     return {
       // 上传类型
       obj: {
-        'text': `${baseUrl}/system/file/file/upload`, // 文件上传
-        'picture-card': `${baseUrl}/system/file/picture/upload`, // 图片上传
-        'audio': `${baseUrl}/system/file/mp3/upload`, // 音频上传
-        'zip': `${baseUrl}/system/file/file/uploadFolderZip`, // 压缩包上传
-        'mp3': `${baseUrl}/admin/program/batch/upload` // 歌曲批量上传
+        text: `${baseUrl}/system/file/file/upload`, // 文件上传
+        "picture-card": `${baseUrl}/system/file/picture/upload`, // 图片上传
+        "picture-rgb": `${baseUrl}/system/file/getRGBUrl`, // 图片上传
+        audio: `${baseUrl}/system/file/mp3/upload`, // 音频上传
+        zip: `${baseUrl}/system/file/file/uploadFolderZip`, // 压缩包上传
+        mp3: `${baseUrl}/admin/program/batch/upload`, // 歌曲批量上传
       },
       // 上传地址
-      action: '#',
+      action: "#",
       // 请求头部
       headers: {
-        Authorization: "Bearer " + getToken()
+        Authorization: "Bearer " + getToken(),
       },
       // 额外参数
       data: {},
       // 进度条
       percentage: 0,
-      title: '',
+      title: "",
       // 进度条状态
       status: null,
-      type: 'primary',
+      type: "primary",
       // 表单
       form: {
         size: 0,
-        file: ''
-      }
-    }
+        file: "",
+      },
+    };
   },
+
   watch: {
     url(val) {
-      this.form.file = val
+      this.form.file = val;
       if (!val) {
-        this.percentage = 0
+        this.percentage = 0;
       }
     },
     listType(val) {
-      this.action = this.obj[val]
-    }
+      this.action = this.obj[val];
+    },
+
+    platformId(val) {
+      this.form.platformId = val;
+    },
   },
+
   created() {
     // 根据上传类型 变更 上传地址
-    this.action = this.obj[this.listType]
+    if (this.listTypes == "picture-rgb") {
+      this.action = this.obj[this.listTypes];
+    } else {
+      this.action = this.obj[this.listType];
+    }
     // 回显图片
-    this.form.file = this.url
+    this.form.file = this.url;
   },
+
   methods: {
     // 上传之前
     async beforeUpload(file) {
+      var platformId = this.$props.platformId;
+      this.form.platformId = platformId;
+      this.data.platformId = platformId;
+      this.form.width = this.width;
+      this.data.width = this.width;
+      this.form.height = this.height;
+      this.data.height = this.height;
+
+      // console.log("beforeUpload:", this.width, this.height)
       if (this.width && this.height) {
-        const data = await this.readerImg(file)
-        let _width = data.width % this.width === 0 || this.width % data.width === 0 ? true : false
-        let _height = data.height % this.height === 0 || this.height % data.height === 0 ? true : false
+        // var w = Number(this.width);
+        // var h = Number(this.height);
+        // 检查并转换 width 和 height 为数字
+        const w =
+          typeof this.width === "String" ? Number(this.width) : this.width;
+        const h =
+          typeof this.height === "String" ? Number(this.height) : this.height;
+        // console.log("传入的:", w, h, "666", typeof this.height === 'string')
+        const data = await this.readerImg(file);
+
+        let _width =
+          data.width % w === 0 || w % data.width === 0 ? true : false;
+        let _height =
+          data.height % h === 0 || h % data.height === 0 ? true : false;
         if (!_width || !_height) {
-          this.$message.error(`请上传${this.width}x${this.height}尺寸或同比例倍数的图片`)
-          return Promise.reject(false)
+          this.$message.error(`请上传${w}x${h}尺寸或同比例倍数的图片`);
+          return Promise.reject(false);
         }
       }
 
-      if (this.size && (file.size / 1024 / 1024 > this.size)) {
-        this.$message.error(`文件大小不得超过${this.size}MB`)
-        return Promise.reject(false)
+      if (this.size && file.size / 1024 / 1024 > this.size) {
+        this.$message.error(`文件大小不得超过${this.size}MB`);
+        return Promise.reject(false);
       }
 
-      this.form.size = file.size
+      this.form.size = file.size;
     },
 
     readerImg(file) {
       return new Promise((resolve, reject) => {
-        const reader = new FileReader()
-        reader.readAsDataURL(file)
+        const reader = new FileReader();
+        reader.readAsDataURL(file);
         reader.onload = () => {
-          const img = new Image()
-          img.src = reader.result
+          const img = new Image();
+          img.src = reader.result;
           img.onload = () => {
             resolve({
               width: img.width,
-              height: img.height
-            })
-          }
-        }
-      })
+              height: img.height,
+            });
+          };
+        };
+      });
     },
 
     // 上传过程中
     onProgress(file) {
-      this.percentage = parseInt(file.percent - 1)
-      this.title = `已上传 ${parseInt(file.percent - 1)}%`
+      this.percentage = parseInt(file.percent - 1);
+      this.title = `已上传 ${parseInt(file.percent - 1)}%`;
     },
 
+    // {"data":null,"code":0,"message":"请求成功","requestId":null,"success":true}
     // 上传成功
     onSuccess(file) {
       if (file.code === 0) {
-        this.form.file = file.data
-        this.$emit('upload', this.form)
-        this.title = '上传成功'
-        this.type = 'success'
+        this.form.file = file.data;
+        this.$emit("upload", this.form);
+        this.title = "批量上传";
+        this.type = "success";
+        if (this.form.platformId != null && this.form.platformId != "") {
+          this.$message.success(`上传成功`);
+        }
       } else {
-        this.onError()
+        this.onError();
+        if (this.form.platformId != null && this.form.platformId != "") {
+          this.$message.success(`上传失败`);
+        }
       }
     },
 
     // 上传失败
     onError() {
-      this.status = 'exception'
-      this.type = 'danger'
-      this.title = '上传失败'
+      this.status = "exception";
+      this.type = "danger";
+      this.title = "上传失败";
+      if (this.form.platformId != null && this.form.platformId != "") {
+        this.$message.success(`上传失败`);
+      }
     },
 
     // 删除
     onDelete() {
-      this.form.file = ''
-      this.percentage = 0
-      this.$emit('upload', this.form)
+      this.form.file = "";
+      this.percentage = 0;
+      this.$emit("upload", this.form);
     },
 
     // 如果上传失败 重新上传
     handleUpload() {
-      this.percentage = 0
+      this.percentage = 0;
     },
 
     // 上传按钮
     isBtn() {
-      return ['text', 'audio', 'zip', 'mp3'].includes(this.listType) || (this.listType === 'picture-card' && this.percentage == 0 && !this.form.file)
+      return (
+        ["text", "audio", "zip", "mp3"].includes(this.listType) ||
+        (this.listType === "picture-card" &&
+          this.percentage == 0 &&
+          !this.form.file)
+      );
     },
     // 显示进度条
     isPercentage() {
-      return this.listType === 'picture-card' && this.percentage !== 0 && !this.form.file
+      return (
+        this.listType === "picture-card" &&
+        this.percentage !== 0 &&
+        !this.form.file
+      );
     },
     // 显示图片
     isImg() {
-      return this.listType === 'picture-card' && this.form.file
-    }
-  }
-}
+      return this.listType === "picture-card" && this.form.file;
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>
@@ -267,4 +355,4 @@ export default {
     }
   }
 }
-</style>
+</style>

+ 339 - 302
src/mixin/index.js

@@ -39,6 +39,7 @@ const devMixin = {
       getClientTypeList(e ? e : {}).then((res) => {
         // console.log("获取设备列表==" + JSON.stringify(res));
         if (res.code === 0) {
+          this.devOptions = [];
           res.data.map((i) => {
             this.devOptions.push({
               value: i.clientTypeId,
@@ -56,25 +57,25 @@ const devModeMixin = {
   data() {
     return {
       devModeOptions: [{
-          value: 1,
-          label: "蓝牙",
-          disabled: false,
-        },
-        {
-          value: 2,
-          label: "WIFI",
-          disabled: false,
-        },
-        {
-          value: 3,
-          label: "传统蓝牙",
-          disabled: false,
-        },
-        {
-          value: 4,
-          label: "4G",
-          disabled: false,
-        },
+        value: 1,
+        label: "蓝牙",
+        disabled: false,
+      },
+      {
+        value: 2,
+        label: "WIFI",
+        disabled: false,
+      },
+      {
+        value: 3,
+        label: "传统蓝牙",
+        disabled: false,
+      },
+      {
+        value: 4,
+        label: "4G",
+        disabled: false,
+      },
       ],
     };
   },
@@ -90,7 +91,7 @@ const devCategoryMixin = {
   methods: {
     getCateGory(status) {
       categoryList({
-        status: status
+        status: status,
       }).then((res) => {
         res.data.map((i) => {
           this.categoryOptions.push({
@@ -108,17 +109,17 @@ const devTypeMixin = {
   data() {
     return {
       devTypeOptions: [{
-          value: 0,
-          label: "音响",
-        },
-        {
-          value: 1,
-          label: "耳机",
-        },
-        {
-          value: 2,
-          label: "穿戴",
-        },
+        value: 0,
+        label: "音响",
+      },
+      {
+        value: 1,
+        label: "耳机",
+      },
+      {
+        value: 2,
+        label: "穿戴",
+      },
       ],
     };
   },
@@ -131,8 +132,13 @@ const devFucMixin = {
       devFucOptions: [],
     };
   },
+
+
   mounted() {
-    functionList().then((res) => {
+    functionList({
+      status: 0,
+      isDelete: 0,
+    }).then((res) => {
       if (res.code === 0) {
         res.data.map((i) => {
           this.devFucOptions.push({
@@ -150,13 +156,13 @@ const yesOrNoMixin = {
   data() {
     return {
       yesOrNoOptions: [{
-          value: 0,
-          label: "否",
-        },
-        {
-          value: 1,
-          label: "是",
-        },
+        value: 0,
+        label: "否",
+      },
+      {
+        value: 1,
+        label: "是",
+      },
       ],
     };
   },
@@ -167,49 +173,49 @@ const serviceTimeMixin = {
   data() {
     return {
       serviceTimeOptions: [{
-          value: -1,
-          label: "1天",
-        },
-        {
-          value: 1,
-          label: "7天",
-        },
-        {
-          value: 2,
-          label: "14天",
-        },
-        {
-          value: 3,
-          label: "1个月",
-        },
-        {
-          value: 4,
-          label: "3个月",
-        },
-        {
-          value: 5,
-          label: "6个月",
-        },
-        {
-          value: 6,
-          label: "1年",
-        },
-        {
-          value: 7,
-          label: "2年",
-        },
-        {
-          value: 8,
-          label: "3年",
-        },
-        {
-          value: 9,
-          label: "5年",
-        },
-        {
-          value: 0,
-          label: "永久",
-        },
+        value: -1,
+        label: "1天",
+      },
+      {
+        value: 1,
+        label: "7天",
+      },
+      {
+        value: 2,
+        label: "14天",
+      },
+      {
+        value: 3,
+        label: "1个月",
+      },
+      {
+        value: 4,
+        label: "3个月",
+      },
+      {
+        value: 5,
+        label: "6个月",
+      },
+      {
+        value: 6,
+        label: "1年",
+      },
+      {
+        value: 7,
+        label: "2年",
+      },
+      {
+        value: 8,
+        label: "3年",
+      },
+      {
+        value: 9,
+        label: "5年",
+      },
+      {
+        value: 0,
+        label: "永久",
+      },
       ],
     };
   },
@@ -220,29 +226,29 @@ const serviceTypeMixin = {
     return {
       // 服务类型
       serviceTypeOptions: [{
-          value: 0,
-          label: "签到",
-        },
-        {
-          value: 1,
-          label: "收听奖励",
-        },
-        {
-          value: 2,
-          label: "积分抽奖",
-        },
-        {
-          value: 3,
-          label: "打开手机通知",
-        },
-        {
-          value: 4,
-          label: "积分兑换",
-        },
-        {
-          value: 5,
-          label: "会员中心",
-        },
+        value: 0,
+        label: "签到",
+      },
+      {
+        value: 1,
+        label: "收听奖励",
+      },
+      {
+        value: 2,
+        label: "积分抽奖",
+      },
+      {
+        value: 3,
+        label: "打开手机通知",
+      },
+      {
+        value: 4,
+        label: "积分兑换",
+      },
+      {
+        value: 5,
+        label: "会员中心",
+      },
       ],
     };
   },
@@ -253,13 +259,13 @@ const isFreeMixin = {
   data() {
     return {
       freeOptions: [{
-          value: 0,
-          label: "付费",
-        },
-        {
-          value: 1,
-          label: "免费",
-        },
+        value: 0,
+        label: "付费",
+      },
+      {
+        value: 1,
+        label: "免费",
+      },
       ],
     };
   },
@@ -270,37 +276,37 @@ const audioMixin = {
   data() {
     return {
       audioOptions: [{
-          value: 2,
-          label: "广播电台",
-        },
-        {
-          value: 6,
-          label: "节目",
-        },
-        {
-          value: 8,
-          label: "播客专辑",
-        },
-        {
-          value: 9,
-          label: "歌手",
-        },
-        {
-          value: 10,
-          label: "歌单",
-        },
-        {
-          value: 11,
-          label: "歌曲",
-        },
-        {
-          value: 12,
-          label: "主播",
-        },
-        {
-          value: 15,
-          label: "音乐专辑",
-        },
+        value: 2,
+        label: "广播电台",
+      },
+      {
+        value: 6,
+        label: "节目",
+      },
+      {
+        value: 8,
+        label: "播客专辑",
+      },
+      {
+        value: 9,
+        label: "歌手",
+      },
+      {
+        value: 10,
+        label: "歌单",
+      },
+      {
+        value: 11,
+        label: "歌曲",
+      },
+      {
+        value: 12,
+        label: "主播",
+      },
+      {
+        value: 15,
+        label: "音乐专辑",
+      },
       ],
       audioTypeOptions: [],
     };
@@ -330,17 +336,17 @@ const sexMixin = {
   data() {
     return {
       sexOptions: [{
-          value: 0,
-          label: "未知",
-        },
-        {
-          value: 1,
-          label: "男",
-        },
-        {
-          value: 2,
-          label: "女",
-        },
+        value: 0,
+        label: "未知",
+      },
+      {
+        value: 1,
+        label: "男",
+      },
+      {
+        value: 2,
+        label: "女",
+      },
       ],
     };
   },
@@ -351,29 +357,29 @@ const regionMixin = {
   data() {
     return {
       regionOptions: [{
-          value: 0,
-          label: "内地",
-        },
-        {
-          value: 1,
-          label: "港台",
-        },
-        {
-          value: 2,
-          label: "欧美",
-        },
-        {
-          value: 3,
-          label: "日本",
-        },
-        {
-          value: 4,
-          label: "韩国",
-        },
-        {
-          value: 5,
-          label: "其他",
-        },
+        value: 0,
+        label: "内地",
+      },
+      {
+        value: 1,
+        label: "港台",
+      },
+      {
+        value: 2,
+        label: "欧美",
+      },
+      {
+        value: 3,
+        label: "日本",
+      },
+      {
+        value: 4,
+        label: "韩国",
+      },
+      {
+        value: 5,
+        label: "其他",
+      },
       ],
     };
   },
@@ -384,29 +390,29 @@ const languageMixin = {
   data() {
     return {
       languageOptions: [{
-          value: 1,
-          label: "国语",
-        },
-        {
-          value: 2,
-          label: "欧美",
-        },
-        {
-          value: 3,
-          label: "粤语",
-        },
-        {
-          value: 4,
-          label: "韩语",
-        },
-        {
-          value: 5,
-          label: "日语",
-        },
-        {
-          value: 6,
-          label: "其他",
-        },
+        value: 1,
+        label: "国语",
+      },
+      {
+        value: 2,
+        label: "欧美",
+      },
+      {
+        value: 3,
+        label: "粤语",
+      },
+      {
+        value: 4,
+        label: "韩语",
+      },
+      {
+        value: 5,
+        label: "日语",
+      },
+      {
+        value: 6,
+        label: "其他",
+      },
       ],
     };
   },
@@ -422,6 +428,32 @@ const platformMixin = {
   },
   methods: {
     // 通过音频类型获取对应的平台
+    //     {"data":[{"id":"5","name":"音乐随身听","status":1,"isThird":null,"updateTime":1684215874,"createTime":0,
+    //       "audioType":"10,9,11,15,6,8,12","joinType":"2,3"},{"id":"6","name":"QQ音乐","status":1,"isThird":null,
+    //         "updateTime":1666345649,"createTime":0,"audioType":"10,11,9,15","joinType":"1"},
+    //   {"id":"25","name":"验收测试环境3","status":1,"isThird":null,
+    // "updateTime":1664274267,"createTime":1663146321,"audioType":"10,11,9,15","joinType":"1"}
+    // ,{"id":"72","name":"测试3","status":1,"isThird":null,"updateTime":1667455705,
+    // "createTime":1664173454,"audioType":"2,8,6,11,10,9,12,15","joinType":"1,3"},
+    // {"id":"82","name":"测试本地管理","status":1,"isThird":null,"updateTime":1684208429,"createTime":1684206852,
+    //   "audioType":"2,6,8,9,10,11,12,15","joinType":"2"},{"id":"99","name":"人民音乐出版社","status":1,
+    //     "isThird":null,"updateTime":1731041082,"createTime":1711004056,"audioType":"6,8,9,10,11,15,12",
+    //     "joinType":"2"}],"code":0,"message":"","requestId":null,"success":true}
+
+    /// 喜马拉雅:12
+    // 获取对应平台====5==音乐随身听==2,3
+    // 获取对应平台====6==QQ音乐==1
+    // 获取对应平台====7==HIFIVE音加加==1
+    // 获取对应平台====7==HIFIVE音加加==1
+    // 获取对应平台====8==看见音乐==1
+    // 获取对应平台====9==酷狗音乐==1
+    // 获取对应平台====10==爱听歌单音乐==1
+    // 获取对应平台====21==测试环境==2
+    // 获取对应平台====25==验收测试环境3==1
+    // 获取对应平台====72==测试3==1,3
+    // 获取对应平台====82==测试本地管理==2
+    // 获取对应平台====99==人民音乐出版社==2
+
     getPlatform(e) {
       this.platformOptions = [];
       return new Promise((resolve, reject) => {
@@ -436,6 +468,11 @@ const platformMixin = {
                 })
               );
               e ? (this.platformTypeOptions = this.platformOptions) : "";
+              res.data.map((i) => {
+//                console.log("获取对应平台====" + Number(i.id) + "==" + i.name + "==" + i.joinType);
+                return i;
+              });
+
               resolve(this.platformOptions, this.platformTypeOptions);
             }
           })
@@ -465,13 +502,13 @@ const onOrOffMixin = {
   data() {
     return {
       onOrOffOptions: [{
-          value: 1,
-          label: "上架",
-        },
-        {
-          value: 2,
-          label: "下架",
-        },
+        value: 1,
+        label: "上架",
+      },
+      {
+        value: 2,
+        label: "下架",
+      },
       ],
     };
   },
@@ -482,13 +519,13 @@ const disabledMixin = {
   data() {
     return {
       disabledOptions: [{
-          value: 0,
-          label: "上架",
-        },
-        {
-          value: 1,
-          label: "下架",
-        },
+        value: 0,
+        label: "上架",
+      },
+      {
+        value: 1,
+        label: "下架",
+      },
       ],
     };
   },
@@ -499,25 +536,25 @@ const payTypeMixin = {
   data() {
     return {
       payTypeOptions: [{
-          value: 1,
-          label: "免费",
-        },
-        {
-          value: 2,
-          label: "全集购买",
-        },
-        {
-          value: 3,
-          label: "单集购买",
-        },
-        {
-          value: 4,
-          label: "Vip专享",
-        },
-        {
-          value: 5,
-          label: "亲子付费",
-        },
+        value: 1,
+        label: "免费",
+      },
+      {
+        value: 2,
+        label: "全集购买",
+      },
+      {
+        value: 3,
+        label: "单集购买",
+      },
+      {
+        value: 4,
+        label: "Vip专享",
+      },
+      {
+        value: 5,
+        label: "亲子付费",
+      },
       ],
     };
   },
@@ -528,25 +565,25 @@ const albumTypeMixin = {
   data() {
     return {
       albumTypeOptions: [{
-          value: 1,
-          label: "Single",
-        },
-        {
-          value: 2,
-          label: "EP",
-        },
-        {
-          value: 3,
-          label: "Album",
-        },
-        {
-          value: 4,
-          label: "古典专辑",
-        },
-        {
-          value: 5,
-          label: "自制专辑",
-        },
+        value: 1,
+        label: "Single",
+      },
+      {
+        value: 2,
+        label: "EP",
+      },
+      {
+        value: 3,
+        label: "Album",
+      },
+      {
+        value: 4,
+        label: "古典专辑",
+      },
+      {
+        value: 5,
+        label: "自制专辑",
+      },
       ],
     };
   },
@@ -629,17 +666,17 @@ const currentMixin = {
   data() {
     return {
       currentOptions: [{
-          value: 0,
-          label: "已生效",
-        },
-        {
-          value: 1,
-          label: "待生效",
-        },
-        {
-          value: 2,
-          label: "已失效",
-        },
+        value: 0,
+        label: "已生效",
+      },
+      {
+        value: 1,
+        label: "待生效",
+      },
+      {
+        value: 2,
+        label: "已失效",
+      },
       ],
     };
   },
@@ -650,13 +687,13 @@ const coverMixin = {
   data() {
     return {
       coverOptions: [{
-          value: 0,
-          label: "自定义封面",
-        },
-        {
-          value: 1,
-          label: "内容封面",
-        },
+        value: 0,
+        label: "自定义封面",
+      },
+      {
+        value: 1,
+        label: "内容封面",
+      },
       ],
     };
   },
@@ -670,37 +707,37 @@ const channelMixin = {
         2: [{
           value: 2,
           label: "广播电台",
-        }, ],
+        },],
         6: [{
-            value: 6,
-            label: "节目",
-          },
-          {
-            value: 11,
-            label: "歌曲",
-          },
+          value: 6,
+          label: "节目",
+        },
+        {
+          value: 11,
+          label: "歌曲",
+        },
         ],
         8: [{
-            value: 8,
-            label: "播客专辑",
-          },
-          {
-            value: 10,
-            label: "歌单",
-          },
-          {
-            value: 15,
-            label: "音乐专辑",
-          },
+          value: 8,
+          label: "播客专辑",
+        },
+        {
+          value: 10,
+          label: "歌单",
+        },
+        {
+          value: 15,
+          label: "音乐专辑",
+        },
         ],
         16: [{
           value: 8,
           label: "播客专辑",
-        }, ],
+        },],
         17: [{
           value: 2,
           label: "广播电台",
-        }, ],
+        },],
       },
     };
   },
@@ -711,13 +748,13 @@ const systemMixin = {
   data() {
     return {
       systemOptions: [{
-          value: 1,
-          label: "Android",
-        },
-        {
-          value: 2,
-          label: "iOS",
-        },
+        value: 1,
+        label: "Android",
+      },
+      {
+        value: 2,
+        label: "iOS",
+      },
       ],
     };
   },
@@ -763,14 +800,14 @@ const mapMixin = {
 
         let city =
           province && province.childList.length > 0 ?
-          province.childList.find((i) => i.id == row.city) :
-          "";
+            province.childList.find((i) => i.id == row.city) :
+            "";
         let cityName = city ? `-${city.name}` : "";
 
         let area =
           city && city.childList.length > 0 ?
-          city.childList.find((i) => i.id == row.area) :
-          "";
+            city.childList.find((i) => i.id == row.area) :
+            "";
         let areaName = area ? `-${area.name}` : "";
         return `${provinceName}${cityName}${areaName}`;
       }

Разница между файлами не показана из-за своего большого размера
+ 392 - 170
src/router/index.js


+ 20 - 4
src/utils/request.js

@@ -63,11 +63,24 @@ service.interceptors.request.use(config => {
       const s_url = sessionObj.url; // 请求地址
       const s_data = sessionObj.data; // 请求数据
       const s_time = sessionObj.time; // 请求时间
-      const interval = 2000; // 间隔时间(ms),小于此时间视为重复提交
+      var interval; // 间隔时间(ms),小于此时间视为重复提交
+
+      // console.log("获取请求链接==" + JSON.stringify(config.url));
+      ///活动管理-新增赠送流量特殊处理
+      if (config.url === "/admin/activity/doExchange") {
+        interval = 2000;
+      } else if (config.url === "/admin/program/list") {
+        interval = 0;
+      } else if (config.url === "/admin/goods/listByDevice") {
+        interval = 0;
+      } else {
+        interval = 500;
+      }
+
       if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
-       const message = '数据正在处理,请勿重复提交';
-      //  console.warn(`[${s_url}]: ` + message)
-       return Promise.reject(new Error(message))
+        const message = '数据正在处理,请勿重复提交';
+        console.warn(`[${s_url}]: ` + message)
+        return Promise.reject(new Error(message))
       } else {
         cache.session.setJSON('sessionObj', requestObj)
       }
@@ -86,6 +99,9 @@ service.interceptors.response.use(res => {
     // 获取错误信息
     const msg = errorCode[code] || res.data.msg || errorCode['default']
 
+    // console.log("gadfadsqwerqewrwqr=bbb==" + code + "====" + res.data.msg);
+    // console.log("gadfadsqwerqewrwqr=cccc==" + JSON.stringify(res));
+
     // 二进制数据则直接返回
     if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
       return res.data

Разница между файлами не показана из-за своего большого размера
+ 560 - 234
src/views/content/article/detail.vue


+ 1 - 0
src/views/content/article/index.vue

@@ -115,6 +115,7 @@ import { change, list } from "@/api/content/article";
 import { dialogCallBack } from "@/utils/DialogUtil";
 import VueQr from "vue-qr";
 export default {
+  name: "ContentArticle",
   components: {
     VueQr,
   },

+ 50 - 29
src/views/content/video/detail.vue

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

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

@@ -98,6 +98,7 @@ import { change, list } from "@/api/content/video";
 import { dialogCallBack } from "@/utils/DialogUtil";
 import VueQr from "vue-qr";
 export default {
+  name: "ContentVideo",
   components: {
     VueQr,
   },

+ 114 - 62
src/views/device/article/detail.vue

@@ -2,8 +2,18 @@
   <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" filterable multiple placeholder="请选择关联设备">
-          <el-option v-for="item in devOptions" :key="item.value" :label="item.label" :value="item.value.toString()" />
+        <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>
       </el-form-item>
       <el-form-item label="文章标题:" prop="title">
@@ -13,14 +23,27 @@
         <Editor v-model="form.content" :min-height="250" />
       </el-form-item>
       <el-form-item label="背景图:" prop="pic">
-        <Upload listType="picture-card" :url="form.pic" @upload="upload($event, 'pic')" />
+        <Upload
+          listType="picture-card"
+          :url="form.pic"
+          @upload="upload($event, 'pic')"
+        />
       </el-form-item>
       <el-form-item label="分享图:" prop="shareIcon">
-        <Upload listType="picture-card" :url="form.shareIcon" @upload="upload($event, 'shareIcon')" />
+        <Upload
+          listType="picture-card"
+          :url="form.shareIcon"
+          @upload="upload($event, 'shareIcon')"
+        />
       </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 disabledOptions" :key="item.value" :label="item.label" :value="item.value" />
+          <el-option
+            v-for="item in disabledOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
     </el-form>
@@ -32,103 +55,132 @@
 </template>
 
 <script>
-import { create, detail, edit } from '@/api/device/article'
-import { devMixin, disabledMixin } from '@/mixin/index'
-import Editor from '@/components/Editor/index'
+import { create, detail, edit } from "@/api/device/article";
+import Editor from "@/components/Editor/index";
+import { devMixin, disabledMixin } from "@/mixin/index";
 export default {
+  // name: "deviceArticleDetail",
   mixins: [devMixin, disabledMixin],
   components: {
-    Editor
+    Editor,
   },
   data() {
     return {
       // 表单
       form: {
-        linkDevice: []
+        linkDevice: [],
       },
       // 校验
       rules: {
-        linkDevice: [{
-          required: true, message: '请选择关联设备', trigger: 'change'
-        }],
-        title: [{
-          required: true, message: '请输入文章标题', trigger: 'blur'
-        }],
-        pic: [{
-          required: true, message: '请上传文章背景图', trigger: 'change'
-        }],
-        content: [{
-          required: true, message: '请输入文章内容', trigger: 'blur'
-        }],
-        shareIcon: [{
-          required: true, message: '请上传文章分享图', trigger: 'change'
-        }],
-        status: [{
-          required: true, message: '请选择文章状态', trigger: 'change'
-        }]
-      }
-    }
+        linkDevice: [
+          {
+            required: true,
+            message: "请选择关联设备",
+            trigger: "change",
+          },
+        ],
+        title: [
+          {
+            required: true,
+            message: "请输入文章标题",
+            trigger: "blur",
+          },
+        ],
+        pic: [
+          {
+            required: true,
+            message: "请上传文章背景图",
+            trigger: "change",
+          },
+        ],
+        content: [
+          {
+            required: true,
+            message: "请输入文章内容",
+            trigger: "blur",
+          },
+        ],
+        shareIcon: [
+          {
+            required: true,
+            message: "请上传文章分享图",
+            trigger: "change",
+          },
+        ],
+        status: [
+          {
+            required: true,
+            message: "请选择文章状态",
+            trigger: "change",
+          },
+        ],
+      },
+    };
   },
   mounted() {
-    this.getDevList()
+    this.getDevList();
     if (this.$route.query.id) {
-      this.form.id = this.$route.query.id
-      this.getList()
+      this.form.id = this.$route.query.id;
+      this.getList();
     }
   },
   methods: {
     // 详情
     getList() {
       detail({
-        id: this.form.id
-      }).then(res => {
+        id: this.form.id,
+      }).then((res) => {
         if (res.code === 0) {
-          this.form = res.data
-          this.form.linkDevice = res.data.linkDevice.split(',')
+          this.form = res.data;
+          this.form.linkDevice = res.data.linkDevice.split(",");
         }
-      })
+      });
     },
 
     // 上传
     upload(e, key) {
-      this.form[key] = e.file
+      this.form[key] = e.file;
     },
 
     // 提交
     getSubmit() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          this.form.linkDevice = this.form.linkDevice.join(',')
+          this.form.linkDevice = this.form.linkDevice.join(",");
           if (this.form.id) {
-            edit(this.form).then(res => {
-              if (res.code === 0) {
-                this.$message.success('修改成功!')
-                this.cancel()
-              }
-            }).catch(err => {
-              this.form.linkDevice = this.form.linkDevice.split(',')
-            })
+            edit(this.form)
+              .then((res) => {
+                if (res.code === 0) {
+                  this.$message.success("修改成功!");
+                  this.cancel();
+                }
+              })
+              .catch((err) => {
+                this.form.linkDevice = this.form.linkDevice.split(",");
+              });
           } else {
-            create(this.form).then(res => {
-              if (res.code === 0) {
-                this.$message.success('新增成功!')
-                this.cancel()
-              }
-            }).catch(err => {
-              this.form.linkDevice = this.form.linkDevice.split(',')
-            })
+            create(this.form)
+              .then((res) => {
+                if (res.code === 0) {
+                  this.$message.success("新增成功!");
+                  this.cancel();
+                }
+              })
+              .catch((err) => {
+                this.form.linkDevice = this.form.linkDevice.split(",");
+              });
           }
         } else {
-          return false
+          return false;
         }
-      })
+      });
     },
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/device/article");
-    }
-  }
-}
+      this.$tab.closeOpenPage("/device/deviceArticle");
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>

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

@@ -1,5 +1,5 @@
 
-<!-- 设备文章 -->
+<!--设备管理 设备文章 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -101,7 +101,7 @@ import { list, remove } from "@/api/device/article";
 import { devMixin, disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
-  name: "Article",
+  name: "DeviceArticle",
   mixins: [devMixin, disabledMixin],
   data() {
     return {
@@ -212,4 +212,4 @@ export default {
     },
   },
 };
-</script>
+</script>

+ 2 - 1
src/views/device/category/index.vue

@@ -1,4 +1,4 @@
-<!-- 设备分类 详情 -->
+<!--设备管理 设备分类 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -87,6 +87,7 @@
 import { create, edit, list, remove } from "@/api/device/category";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceCategory",
   data() {
     return {
       // 遮罩层

+ 289 - 112
src/views/device/class/detail.vue

@@ -1,32 +1,68 @@
 <template>
-  <div class='app-container'>
-    <el-form :model="form" ref="form" :rules="rules" label-width="auto" :disabled="disabled">
+  <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="设备分类:" prop="categoryId">
         <el-select v-model="form.categoryId" placeholder="请选择设备分类">
-          <el-option v-for="item in categoryOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <el-option
+            v-for="item in categoryOptions"
+            :key="item.value"
+            :value="item.value"
+            :label="item.label"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="设备类型:" prop="type">
         <el-select v-model="form.type" placeholder="请选择设备类型">
-          <el-option v-for="item in devTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <el-option
+            v-for="item in devTypeOptions"
+            :key="item.value"
+            :value="item.value"
+            :label="item.label"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="是否热门:" prop="isHot">
         <el-select v-model="form.isHot" placeholder="请选择是否热门">
-          <el-option v-for="item in yesOrNoOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <el-option
+            v-for="item in yesOrNoOptions"
+            :key="item.value"
+            :value="item.value"
+            :label="item.label"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="关联设备:" prop="deviceIds">
-        <el-select v-model="form.deviceIds" filterable multiple placeholder="请选择关联的设备">
-          <el-option v-for="item in devOptions" :key="item.clientTypeId" :value="item.clientTypeId" :label="item.name" />
+        <el-select
+          v-model="form.deviceIds"
+          filterable
+          multiple
+          placeholder="请选择关联的设备"
+        >
+          <el-option
+            v-for="item in devOptions"
+            :key="item.clientTypeId"
+            :value="item.clientTypeId"
+            :label="item.name"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="可见用户:" prop="userType">
         <el-select v-model="form.userType" placeholder="请选择可见用户">
-          <el-option v-for="item in pushOptions" :key="item.value" :value="item.value" :label="item.label" />
+          <el-option
+            v-for="item in pushOptions"
+            :key="item.value"
+            :value="item.value"
+            :label="item.label"
+          />
         </el-select>
       </el-form-item>
       <el-form-item v-if="form.userType === 3" label="指定用户:" prop="user">
@@ -35,153 +71,292 @@
       <el-row :gutter="70">
         <el-col :span="12">
           <el-form-item label="在线图片:" prop="img">
-            <Upload listType="picture-card" :url="form.img" @upload="upload($event, 'img')" :disabled="disabled" />
+            <Upload
+              listType="picture-card"
+              :url="form.img"
+              @upload="upload($event, 'img')"
+              :disabled="disabled"
+            />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="离线图片:" prop="offlineImg">
-            <Upload listType="picture-card" :url="form.offlineImg" @upload="upload($event, 'offlineImg')"
-              :disabled="disabled" />
+            <Upload
+              listType="picture-card"
+              :url="form.offlineImg"
+              @upload="upload($event, 'offlineImg')"
+              :disabled="disabled"
+            />
           </el-form-item>
         </el-col>
       </el-row>
-      <el-button v-if="disabled === false && form.typeList.length < 4" type="primary" icon="el-icon-plus"
-        @click="getAdd">新增</el-button>
+      <el-button
+        v-if="disabled === false && form.typeList.length < 4"
+        type="primary"
+        icon="el-icon-plus"
+        @click="getAdd"
+        >新增</el-button
+      >
       <div class="sub-form" v-for="(i, index) in form.typeList" :key="i.id">
-        <el-form-item label="设备模式:" :prop="`typeList.${index}.type`"
-          :rules="{ required: true, message: '请选择设备模式', trigger: 'change' }">
-          <el-select v-model="i.type" placeholder="请选择设备模式" @change="getTypeChange(i)">
-            <el-option v-for="item in devModeOptions" :key="item.value" :value="item.value" :label="item.label"
-              :disabled="item.disabled" />
+        <el-form-item
+          label="设备模式:"
+          :prop="`typeList.${index}.type`"
+          :rules="{
+            required: true,
+            message: '请选择设备模式',
+            trigger: 'change',
+          }"
+        >
+          <el-select
+            v-model="i.type"
+            placeholder="请选择设备模式"
+            @change="getTypeChange(i)"
+          >
+            <el-option
+              v-for="item in devModeOptions"
+              :key="item.value"
+              :value="item.value"
+              :label="item.label"
+              :disabled="item.disabled"
+            />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="i.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`"
-          :rules="{ type: 'array', required: true, message: '请选择功能权限', trigger: 'change' }">
-          <el-select v-model="i.functionList" multiple placeholder="请选择功能权限">
-            <el-option v-for="item in devFucOptions" :key="item.value" :value="item.value.toString()"
-              :label="item.label" />
+        <el-form-item
+          v-if="i.type !== 3"
+          label="功能权限:"
+          :prop="`typeList.${index}.functionList`"
+          :rules="{
+            type: 'array',
+            required: true,
+            message: '请选择功能权限',
+            trigger: 'change',
+          }"
+        >
+          <el-select
+            v-model="i.functionList"
+            multiple
+            placeholder="请选择功能权限"
+          >
+            <el-option
+              v-for="item in devFucOptions"
+              :key="item.value"
+              :value="item.value.toString()"
+              :label="item.label"
+            />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="i.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`"
-          :rules="{ required: true, message: '请选择连接方式', trigger: 'change' }">
+        <el-form-item
+          v-if="i.type == 2"
+          label="连接方式:"
+          :prop="`typeList.${index}.connectType`"
+          :rules="{
+            required: true,
+            message: '请选择连接方式',
+            trigger: 'change',
+          }"
+        >
           <el-select v-model="i.connectType" placeholder="请选择连接方式">
-            <el-option v-for="item in connectOptions" :key="item.value" :value="item.value" :label="item.label" />
+            <el-option
+              v-for="item in connectOptions"
+              :key="item.value"
+              :value="item.value"
+              :label="item.label"
+            />
           </el-select>
         </el-form-item>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item :label="[1, 3].includes(i.type) ? '连接引导图:' : '开机引导图:'" :prop="`typeList.${index}.icon1`"
-              :rules="{ required: true, message: '请上传引导图', trigger: 'change' }">
-              <Upload listType="picture-card" :url="i.icon1" @upload="upload($event, 'icon1', index)"
-                :disabled="disabled" />
+            <el-form-item
+              :label="[1, 3].includes(i.type) ? '连接引导图:' : '开机引导图:'"
+              :prop="`typeList.${index}.icon1`"
+              :rules="{
+                required: true,
+                message: '请上传引导图',
+                trigger: 'change',
+              }"
+            >
+              <Upload
+                listType="picture-card"
+                :url="i.icon1"
+                @upload="upload($event, 'icon1', index)"
+                :disabled="disabled"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="配对引导图:" :prop="`typeList.${index}.icon2`"
-              :rules="{ required: true, message: '请上传引导图', trigger: 'change' }">
-              <Upload listType="picture-card" :url="i.icon2" @upload="upload($event, 'icon2', index)"
-                :disabled="disabled" />
+            <el-form-item
+              label="配对引导图:"
+              :prop="`typeList.${index}.icon2`"
+              :rules="{
+                required: true,
+                message: '请上传引导图',
+                trigger: 'change',
+              }"
+            >
+              <Upload
+                listType="picture-card"
+                :url="i.icon2"
+                @upload="upload($event, 'icon2', index)"
+                :disabled="disabled"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item v-if="[1, 3].includes(i.type)" label="引导页:">
-          <Editor v-model="i.guidePageContent" :min-height="250" :readOnly="disabled" />
+          <Editor
+            v-model="i.guidePageContent"
+            :min-height="250"
+            :readOnly="disabled"
+          />
         </el-form-item>
-        <el-form-item v-else label="引导图:" :prop="`typeList.${index}.icon`"
-          :rules="{ required: true, message: '请上传引导图', trigger: 'change' }">
-          <Upload listType="picture-card" :url="i.icon" @upload="upload($event, 'icon', index)" :disabled='disabled' />
+        <el-form-item
+          v-else
+          label="引导图:"
+          :prop="`typeList.${index}.icon`"
+          :rules="{
+            required: true,
+            message: '请上传引导图',
+            trigger: 'change',
+          }"
+        >
+          <Upload
+            listType="picture-card"
+            :url="i.icon"
+            @upload="upload($event, 'icon', index)"
+            :disabled="disabled"
+          />
         </el-form-item>
-        <el-link class="el-icon-close" v-if="form.typeList.length > 1" :underline="false"
-          @click="getDelete(i.type, index)" :disabled="disabled" />
+        <el-link
+          class="el-icon-close"
+          v-if="form.typeList.length > 1"
+          :underline="false"
+          @click="getDelete(i.type, index)"
+          :disabled="disabled"
+        />
       </div>
     </el-form>
     <div>
       <el-button @click="close">取消</el-button>
-      <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
+      <el-button v-if="!disabled" type="primary" @click="getSubmit"
+        >确定</el-button
+      >
     </div>
   </div>
 </template>
 
 <script>
-import { devList, submit, detail } from '@/api/device/class'
-import { devModeMixin, yesOrNoMixin, devTypeMixin, devCategoryMixin, devFucMixin } from '@/mixin/index'
+import { detail, devList, submit } from "@/api/device/class";
+import {
+devCategoryMixin,
+devFucMixin,
+devModeMixin,
+devTypeMixin,
+yesOrNoMixin,
+} from "@/mixin/index";
 export default {
-  mixins: [devModeMixin, yesOrNoMixin, devTypeMixin, devCategoryMixin, devFucMixin],
+  // name: "deviceClassDetail",
+  mixins: [
+    devModeMixin,
+    yesOrNoMixin,
+    devTypeMixin,
+    devCategoryMixin,
+    devFucMixin,
+  ],
   data() {
     return {
       // 表单
       form: {
         id: this.$route.query.id,
         deviceIds: [],
-        typeList: [{
-          functionList: [],
-        }],
+        typeList: [
+          {
+            functionList: [],
+          },
+        ],
       },
       // 校验
       rules: {
-        name: [{ required: true, message: '请输入大类名称', trigger: 'blur' }],
-        categoryId: [{ required: true, message: '请选择设备分类', trigger: 'chang' }],
-        type: [{ required: true, message: '请选择设备类型', trigger: 'change' }],
-        isHot: [{ required: true, message: '请选择是否热门', trigger: 'change' }],
-        deviceIds: [{ required: true, message: '请选择关联的设备', trigger: 'change' }],
-        userType: [{ required: true, message: '请选择可见用户', trigger: 'change' }],
-        user: [{ required: true, message: '请输入指定用户', trigger: 'blur' }],
-        img: [{ required: true, message: '请上传在线图片', trigger: 'change' }],
-        offlineImg: [{ required: true, message: '请上传离线图片', trigger: 'change' }]
+        name: [{ required: true, message: "请输入大类名称", trigger: "blur" }],
+        categoryId: [
+          { required: true, message: "请选择设备分类", trigger: "chang" },
+        ],
+        type: [
+          { required: true, message: "请选择设备类型", trigger: "change" },
+        ],
+        isHot: [
+          { required: true, message: "请选择是否热门", trigger: "change" },
+        ],
+        deviceIds: [
+          { required: true, message: "请选择关联的设备", trigger: "change" },
+        ],
+        userType: [
+          { required: true, message: "请选择可见用户", trigger: "change" },
+        ],
+        user: [{ required: true, message: "请输入指定用户", trigger: "blur" }],
+        img: [{ required: true, message: "请上传在线图片", trigger: "change" }],
+        offlineImg: [
+          { required: true, message: "请上传离线图片", trigger: "change" },
+        ],
       },
       // 设备列表
       devOptions: [],
       // 可见用户
-      pushOptions: [{
-        value: 1,
-        label: '全部'
-      }, {
-        value: 3,
-        label: '指定'
-      }],
+      pushOptions: [
+        {
+          value: 1,
+          label: "全部",
+        },
+        {
+          value: 3,
+          label: "指定",
+        },
+      ],
       // 设备连接
-      connectOptions: [{
-        value: 2,
-        label: 'UPnP'
-      }, {
-        value: 3,
-        label: 'MQTT'
-      }],
+      connectOptions: [
+        {
+          value: 2,
+          label: "UPnP",
+        },
+        {
+          value: 3,
+          label: "MQTT",
+        },
+      ],
       // 只读
-      disabled: Boolean(this.$route.query.boolean)
-    }
+      disabled: Boolean(this.$route.query.boolean),
+    };
   },
   mounted() {
-    this.getCateGory(1)
-    this.getDevList()
+    this.getCateGory(1);
+    this.getDevList();
     if (this.form.id) {
-      this.getDetail()
+      this.getDetail();
     }
   },
   methods: {
     // 详情
     getDetail() {
-      detail(this.form.id).then(res => {
+      detail(this.form.id).then((res) => {
         if (res.code === 0) {
-          this.form = res.data
-          this.form.deviceIds = res.data.deviceIds.split(',')
+          this.form = res.data;
+          this.form.deviceIds = res.data.deviceIds.split(",");
           this.form.typeList.map((i) => {
             this.devModeOptions[i.type - 1].disabled = true;
-          })
+          });
         }
-      })
+      });
     },
 
     // 设备列表
     getDevList() {
       devList({
         type: 2,
-        id: this.form.id
-      }).then(res => {
+        id: this.form.id,
+      }).then((res) => {
         if (res.code === 0) {
-          this.devOptions = res.data
+          this.devOptions = res.data;
         }
-      })
+      });
     },
 
     // 新增子表单
@@ -190,46 +365,48 @@ export default {
         type: null,
         functionList: [],
         connectType: null,
-        icon1: '',
-        icon2: '',
-        guidePageContent: ''
-      })
+        icon1: "",
+        icon2: "",
+        guidePageContent: "",
+      });
     },
 
     // 删除子表单
     getDelete(type, index) {
-      this.form.typeList.splice(index, 1)
+      this.form.typeList.splice(index, 1);
       if (type) {
-        this.devModeOptions.find(i => i.value == type).disabled = false
+        this.devModeOptions.find((i) => i.value == type).disabled = false;
       }
     },
 
     // 修改设备模式
     getTypeChange(i) {
       for (let key in this.devModeOptions) {
-        this.devModeOptions[key].disabled = false
+        this.devModeOptions[key].disabled = false;
       }
       // 选中的设备模式禁止再选
-      this.form.typeList.map(item => {
+      this.form.typeList.map((item) => {
         if (item.type) {
-          let index = this.devModeOptions.findIndex(j => j.value == item.type)
-          this.devModeOptions[index].disabled = true
+          let index = this.devModeOptions.findIndex(
+            (j) => j.value == item.type
+          );
+          this.devModeOptions[index].disabled = true;
         }
-      })
+      });
       // 除了设备模式都为空
-      Object.keys(i).map(e => {
-        if (!['type', 'icon'].includes(e)) {
-          i[e] = e === 'functionList' ? [] : null
+      Object.keys(i).map((e) => {
+        if (!["type", "icon"].includes(e)) {
+          i[e] = e === "functionList" ? [] : null;
         }
-      })
+      });
     },
 
     // 上传图片
     upload(e, key, index) {
       if (index == undefined) {
-        this.form[key] = e.file
+        this.form[key] = e.file;
       } else {
-        this.form.typeList[index][key] = e.file
+        this.form.typeList[index][key] = e.file;
       }
     },
 
@@ -237,25 +414,25 @@ export default {
     getSubmit() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          this.form.deviceIds = this.form.deviceIds.join(',')
-          submit(this.form).then(res => {
+          this.form.deviceIds = this.form.deviceIds.join(",");
+          submit(this.form).then((res) => {
             if (res.code === 0) {
-              this.$message.success('提交成功!')
-              this.close()
+              this.$message.success("提交成功!");
+              this.close();
             }
-          })
+          });
         } else {
-          return false
+          return false;
         }
-      })
+      });
     },
 
     // 取消
     close() {
-      this.$tab.closeOpenPage('/device/class')
-    }
-  }
-}
+      this.$tab.closeOpenPage("/device/deviceClass");
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>

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

@@ -177,6 +177,7 @@ yesOrNoMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceClass",
   mixins: [
     devCategoryMixin,
     devMixin,

+ 2 - 0
src/views/device/function/index.vue

@@ -1,3 +1,4 @@
+<!--设备管理 功能权限 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -82,6 +83,7 @@
 import { create, edit, list } from "@/api/device/function";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceFunction",
   dicts: ["sys_normal_disable"],
   data() {
     return {

+ 342 - 91
src/views/device/list/detail.vue

@@ -1,9 +1,29 @@
 <template>
   <div class="app-container">
     <el-form :model="form" :rules="rules" ref="form" label-width="auto" :disabled="disabled">
+      <!-- <el-form-item label="应用类型:" prop="applicationType">
+        <el-select v-model="form.applicationType" placeholder="请选择设备分类">
+          <el-option
+            v-for="item in applicationType"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+      </el-form-item> -->
+
+      <!-- disabled === false -->
+      <el-form-item label="应用类型:" prop="applicationType">
+        <input type="checkbox" v-model="isChecked1" :disabled="disabled" />
+        小程序
+        <input type="checkbox" style="margin-left: 30px" v-model="isChecked2" :disabled="disabled" />
+        APP
+      </el-form-item>
+
       <el-form-item label="设备型号:" prop="clientType">
         <el-input v-model="form.clientType" placeholder="请输入设备型号" />
       </el-form-item>
+
       <el-form-item label="设备名称:" prop="name">
         <el-input v-model="form.name" placeholder="请输入设备名称" />
       </el-form-item>
@@ -12,7 +32,7 @@
       </el-form-item>
       <el-form-item label="蓝牙名称:" prop="bluetoothNames">
         <el-tag v-for="(item, index) in form.bluetoothNames" :key="item" :closable="!disabled"
-          :disable-transition="false" @close="handleClose(index)" style="margin-right: 10px;">{{ item }}</el-tag>
+          :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>
@@ -33,11 +53,13 @@
           <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="设备分类:" prop="categoryId">
         <el-select v-model="form.categoryId" placeholder="请选择设备分类">
           <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
+
       <el-form-item label="设备类型:" prop="deviceType">
         <el-select v-model="form.deviceType" placeholder="请选择设备类型">
           <el-option v-for="item in devTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
@@ -48,6 +70,35 @@
           <el-option v-for="item in yesOrNoOptions" :key="item.value" :label="item.label" :value="Number(item.value)" />
         </el-select>
       </el-form-item>
+      <el-form-item label="资源平台:">
+        <el-button @click="clickAddPlatform" size="mini">新增+</el-button>
+      </el-form-item>
+      <el-form-item v-if="isShowPlatform">
+        <el-table :data="contentVipPlatformList" border style="width: min-content">
+          <el-table-column prop="platformId" label="资源平台" width="180">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.platformId" placeholder="请选择流量平台"
+                @change="handlePlatformChange(scope.row, scope.$index)">
+                <el-option v-for="item in platformOptions" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column prop="contentVip" label="设备会员收费时间" width="180">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.contentVip" placeholder="默认关闭">
+                <el-option v-for="item in contentVipOptions" :key="item.value" :label="item.label"
+                  :value="item.value" />
+              </el-select>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      <!-- <el-form-item label="设备会员收费时间:" prop="contentVip">
+        <el-select v-model="form.contentVip" placeholder="默认关闭">
+          <el-option v-for="item in contentVipOptions" :key="item.value" :label="item.label"
+            :value="Number(item.value)" />
+        </el-select>
+      </el-form-item> -->
       <el-row>
         <el-col :span="12">
           <el-form-item label="在线图片:" prop="img">
@@ -56,7 +107,7 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="离线图片:" prop="offlineImg" style="float:right">
+          <el-form-item label="离线图片:" prop="offlineImg" style="float: right">
             <Upload listType="picture-card" :url="form.offlineImg" @upload="handleUploadImg($event, 'offline')"
               :disabled="disabled" />
           </el-form-item>
@@ -66,27 +117,40 @@
       <el-button v-if="disabled === false && form.typeList.length < 4" type="primary" icon="el-icon-plus"
         @click="getAdd">新增</el-button>
       <div class="sub-form" v-for="(item, index) in form.typeList" :key="item.id">
-        <el-form-item label="设备模式:" :prop="`typeList.${index}.type`"
-          :rules="{ required: true, message: '请选择设备模式', trigger: 'change' }">
+        <el-form-item label="设备模式:" :prop="`typeList.${index}.type`" :rules="{
+          required: true,
+          message: '请选择设备模式',
+          trigger: 'change',
+        }">
           <el-select v-model="item.type" placeholder="请选择设备模式" @change="getTypeChange(item)">
             <el-option v-for="item in devModeOptions" :key="item.value" :label="item.label" :value="Number(item.value)"
               :disabled="item.disabled" />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="item.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`"
-          :rules="{ type: 'array', required: true, message: '请选择功能权限', trigger: 'change' }">
+        <el-form-item v-if="item.type !== 3" label="功能权限:" :prop="`typeList.${index}.functionList`" :rules="{
+          type: 'array',
+          required: true,
+          message: '请选择功能权限',
+          trigger: 'change',
+        }">
           <el-select v-model="item.functionList" placeholder="请选择功能权限" multiple>
             <el-option v-for="item in devFucOptions" :key="item.value" :label="item.label" :value="item.value" />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="item.type == 2" label="芯片方案:" :prop="`typeList.${index}.is5g`"
-          :rules="{ required: true, message: '请选择芯片方案', trigger: 'change' }">
+        <el-form-item v-if="item.type == 2" label="芯片方案:" :prop="`typeList.${index}.is5g`" :rules="{
+          required: true,
+          message: '请选择芯片方案',
+          trigger: 'change',
+        }">
           <el-select v-model="item.is5g" placeholder="请选择芯片方案">
             <el-option v-for="item in planOptions" :key="item.value" :value="item.value" :label="item.label" />
           </el-select>
         </el-form-item>
-        <el-form-item v-if="item.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`"
-          :rules="{ required: true, message: '请选择连接方式', trigger: 'change' }">
+        <el-form-item v-if="item.type == 2" label="连接方式:" :prop="`typeList.${index}.connectType`" :rules="{
+          required: true,
+          message: '请选择连接方式',
+          trigger: 'change',
+        }">
           <el-select v-model="item.connectType" placeholder="请选择连接方式">
             <el-option v-for="item in connectTypeOptions" :key="item.value" :label="item.label"
               :value="Number(item.value)" />
@@ -94,23 +158,35 @@
         </el-form-item>
         <el-row>
           <el-col :span="12">
-            <el-form-item :label="item.type === 1 || item.type === 3 ? '连接引导图:' : '开机引导图:'"
-              :prop="`typeList.${index}.icon1`" :rules="{ required: true, message: '请上传引导图片', trigger: 'change' }">
+            <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" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="配对键引导图:" :prop="`typeList.${index}.icon2`" style="float:right"
-              :rules="{ required: true, message: '请上传配对键引导图', trigger: 'change' }">
+            <el-form-item label="配对键引导图:" :prop="`typeList.${index}.icon2`" style="float: right" :rules="{
+              required: true,
+              message: '请上传配对键引导图',
+              trigger: 'change',
+            }">
               <Upload listType="picture-card" :url="item.icon2" @upload="handleUploadIcon($event, index, 'icon2')"
                 :disabled="disabled" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item v-if="item.type === 1 || item.type === 3" label="引导页内容:"
-          :prop="`typeList.${index}.guidePageContent`"
-          :rules="{ required: true, message: '请输入引导页内容', trigger: 'blur' }">
+          :prop="`typeList.${index}.guidePageContent`" :rules="{
+            required: true,
+            message: '请输入引导页内容',
+            trigger: 'blur',
+          }">
           <Editor v-model="item.guidePageContent" :min-height="250" :readOnly="disabled" />
         </el-form-item>
         <!-- 删除按钮 -->
@@ -127,83 +203,181 @@
 
 <script>
 import { create, detail, edit } from "@/api/device/list";
-import { devModeMixin, devTypeMixin, devCategoryMixin, yesOrNoMixin, devFucMixin } from "@/mixin/index";
+import {
+devCategoryMixin,
+devFucMixin,
+devModeMixin,
+devTypeMixin,
+yesOrNoMixin,
+} from "@/mixin/index";
+
 export default {
-  mixins: [devModeMixin, devTypeMixin, devCategoryMixin, yesOrNoMixin, devFucMixin],
+  // name: "deviceListDetail",
+  mixins: [
+    devModeMixin,
+    devTypeMixin,
+    devCategoryMixin,
+    yesOrNoMixin,
+    devFucMixin,
+  ],
   data() {
     return {
+      isChecked1: false,
+      isChecked2: false,
+      isShowPlatform: false,
+      contentVipPlatformList: [
+
+      ],
+      platformOptions: [
+        { label: "QQ音乐", value: 6 },
+        { label: "喜马拉雅", value: 12 },
+      ],
+      platformContentVipOptions: [],
       // 表单
       form: {
-        typeList: [{
-          functionList: [],
-        }],
-        bluetoothNames: []
+        typeList: [
+          {
+            functionList: [],
+          },
+        ],
+        bluetoothNames: [],
+        contentVipPlatformList: [],
       },
       // 显示蓝牙输入框
       inputVisible: false,
       // 蓝牙名称
-      bluetoothName: '',
+      bluetoothName: "",
       // 表单验证
       rules: {
-        clientType: [{ required: true, message: "请输入设备型号", trigger: "blur" }],
+        applicationType: [
+          { required: true, message: "请选择应用类型", trigger: "blur" },
+        ],
+        clientType: [
+          { required: true, message: "请输入设备型号", trigger: "blur" },
+        ],
         name: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
-        bluetoothNames: [{ type: 'array', 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' }],
+        categoryId: [
+          { required: true, message: "请选择设备分类", trigger: "change" },
+        ],
+        deviceType: [
+          { required: true, message: "请选择设备类型", trigger: "change" },
+        ],
         img: [{ required: true, message: "请上传在线图片", trigger: "change" }],
-        offlineImg: [{ required: true, message: "请上传离线图片", trigger: "change" }],
+        offlineImg: [
+          { required: true, message: "请上传离线图片", trigger: "change" },
+        ],
       },
+      contentVipOptions: [
+        {
+          value: 0,
+          label: "默认关闭",
+        },
+        {
+          value: 1,
+          label: "开机激活收取",
+        },
+        {
+          value: 2,
+          label: "1年后",
+        },
+        {
+          value: 3,
+          label: "2年后",
+        },
+        {
+          value: 4,
+          label: "3年后",
+        },
+      ],
       // 设备连接
-      connectTypeOptions: [{
-        value: 2,
-        label: 'UPnP'
-      }, {
-        value: 3,
-        label: 'MQTT'
-      }],
+      connectTypeOptions: [
+        {
+          value: 2,
+          label: "UPnP",
+        },
+        {
+          value: 3,
+          label: "MQTT",
+        },
+      ],
       // 制造商
-      manuOptions: [{
-        value: 'ShanJing',
-        label: 'ShanJing'
-      }, {
-        value: 'JieLi',
-        label: 'JieLi'
-      }, {
-        value: 'LingXin',
-        label: 'LingXin'
-      }, {
-        value: 'QiXinWei',
-        label: 'QiXinWei'
-      }],
+      manuOptions: [
+        {
+          value: "ShanJing",
+          label: "ShanJing",
+        },
+        {
+          value: "JieLi",
+          label: "JieLi",
+        },
+        {
+          value: "LingXin",
+          label: "LingXin",
+        },
+        {
+          value: "QiXinWei",
+          label: "QiXinWei",
+        },
+      ],
       // 芯片方案
-      planOptions: [{
-        value: 1,
-        label: '兼容5GHZ频段芯片方案'
-      }, {
-        value: 0,
-        label: '不兼容5GHZ频段芯片方案'
-      }],
+      planOptions: [
+        {
+          value: 1,
+          label: "兼容5GHZ频段芯片方案",
+        },
+        {
+          value: 0,
+          label: "不兼容5GHZ频段芯片方案",
+        },
+      ],
       // 流量平台
-      typeOptions: [{
-        value: -1,
-        label: '默认'
-      },{
-        value: 0,
-        label: '树米'
-      }, {
-        value: 1,
-        label: '联通'
-      }],
+      typeOptions: [
+        {
+          value: -1,
+          label: "默认",
+        },
+        {
+          value: 0,
+          label: "树米",
+        },
+        {
+          value: 1,
+          label: "联通",
+        },
+      ],
       // 只读
-      disabled: Boolean(this.$route.query.boolean)
+      disabled: Boolean(this.$route.query.boolean),
     };
   },
   mounted() {
-    this.getCateGory(1)
-    this.getList()
+    this.getCateGory(1);
+    this.getList();
   },
   methods: {
+    handlePlatformChange(row, index) {
+      // 检查是否有重复的platformId
+      const value = row.platformId;
+      if (!value) return;
+
+      const exists = this.contentVipPlatformList.some(
+        (item, idx) => item.platformId === value && idx !== index
+      );
+
+      if (exists) {
+        // 如果存在重复,清空当前选择并提示
+        this.$set(row, 'platformId', null);
+        this.$message.warning('该资源平台已存在,请选择其他平台');
+      }
+    },
     // 详情
     getList() {
       if (this.$route.query.id) {
@@ -212,9 +386,45 @@ export default {
         }).then((res) => {
           if (res.code === 0) {
             this.form = res.data;
+            this.form.contentVipPlatformList.forEach((item) => {
+              if (item.platformId > 0) {
+                this.contentVipPlatformList.push({
+                  platformId: item.platformId,
+                  contentVip: item.contentVip,
+                });
+              }
+            });
+            this.isShowPlatform = this.contentVipPlatformList.length > 0;
             this.form.typeList.map((i) => {
               this.devModeOptions[i.type - 1].disabled = true;
             });
+
+            var applicationType = this.form.applicationType;
+            this.isChecked1 = false;
+            this.isChecked2 = false;
+            if (applicationType != null && applicationType != "") {
+              applicationType = applicationType.replace(/[\[\]]/g, "");
+              // 使用split按逗号分割字符串
+              let result = applicationType.split(",");
+              if (result != null && result != "" && result.length > 0) {
+                if (result.length == 2) {
+                  this.isChecked1 = true;
+                  this.isChecked2 = true;
+                } else {
+                  if (result[0] == "0") {
+                    this.isChecked1 = true;
+                  } else {
+                    this.isChecked2 = true;
+                  }
+                }
+              } else {
+                if (applicationType == 0) {
+                  this.isChecked1 = true;
+                } else if (applicationType == 1) {
+                  this.isChecked2 = true;
+                }
+              }
+            }
           }
         });
       }
@@ -222,30 +432,30 @@ export default {
 
     // 删除蓝牙名称
     handleClose(index) {
-      this.form.bluetoothNames.splice(index, 1)
+      this.form.bluetoothNames.splice(index, 1);
     },
 
     // 显示输入框
     showInput() {
-      this.inputVisible = true
+      this.inputVisible = true;
       this.$nextTick(() => {
-        this.$refs.saveTagInput.$refs.input.focus()
-      })
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
     },
 
     // 禁止输入逗号
     handleInput(e) {
-      this.bluetoothName = e.replace(/[,,]/g, "")
+      this.bluetoothName = e.replace(/[,,]/g, "");
     },
 
     // 保存蓝牙名称
     handleInputConfirm() {
-      let inputValue = this.bluetoothName
+      let inputValue = this.bluetoothName;
       if (inputValue) {
-        this.form.bluetoothNames.push(inputValue)
+        this.form.bluetoothNames.push(inputValue);
       }
-      this.inputVisible = false
-      this.bluetoothName = ''
+      this.inputVisible = false;
+      this.bluetoothName = "";
     },
 
     // 上传设备图片
@@ -263,21 +473,23 @@ export default {
     // 选中一个设备类型就从数组中去掉
     getTypeChange(i) {
       for (let key in this.devModeOptions) {
-        this.devModeOptions[key].disabled = false
+        this.devModeOptions[key].disabled = false;
       }
       // 选中的设备模式禁止再选
-      this.form.typeList.map(item => {
+      this.form.typeList.map((item) => {
         if (item.type) {
-          let index = this.devModeOptions.findIndex(j => j.value == item.type)
-          this.devModeOptions[index].disabled = true
+          let index = this.devModeOptions.findIndex(
+            (j) => j.value == item.type
+          );
+          this.devModeOptions[index].disabled = true;
         }
-      })
+      });
       // 除了设备模式都为空
-      Object.keys(i).map(e => {
-        if (!['type', 'icon1', 'icon2'].includes(e)) {
-          i[e] = e === 'functionList' ? [] : null
+      Object.keys(i).map((e) => {
+        if (!["type", "icon1", "icon2"].includes(e)) {
+          i[e] = e === "functionList" ? [] : null;
         }
-      })
+      });
     },
 
     // 新增子表单
@@ -286,9 +498,9 @@ export default {
         type: null,
         functionList: [],
         connectType: null,
-        icon1: '',
-        icon2: '',
-        guidePageContent: ''
+        icon1: "",
+        icon2: "",
+        guidePageContent: "",
       });
     },
 
@@ -296,7 +508,7 @@ export default {
     getDelete(type, index) {
       this.form.typeList.splice(index, 1);
       if (type) {
-        this.devModeOptions.find(i => i.value == type).disabled = false
+        this.devModeOptions.find((i) => i.value == type).disabled = false;
       }
     },
 
@@ -307,11 +519,40 @@ export default {
 
     // 提交
     getSubmit() {
+      if (!this.isChecked1 && !this.isChecked2) {
+        this.$message.success("请选择应用类型");
+        return;
+      }
+
+      if (this.isChecked1 && this.isChecked2) {
+        this.form.applicationType = "[0,1]";
+      } else if (this.isChecked2) {
+        this.form.applicationType = "[1]";
+      } else {
+        this.form.applicationType = "[0]";
+      }
+
+      // 替换成下面的资源平台了
+      this.form.contentVip = null;
+
+      this.form.contentVipPlatformList = []
+      this.contentVipPlatformList.forEach(element => {
+        if (element.platformId != null) {
+          this.form.contentVipPlatformList.push({
+            contentVip: element.contentVip ?? 0,
+            platformId: element.platformId,
+          })
+        }
+      });
+
+      // console.log("this.contentVipPlatformList===", JSON.stringify(this.contentVipPlatformList), JSON.stringify(this.form.contentVipPlatformList));
+
       this.$refs.form.validate((valid) => {
         if (valid) {
           if (this.$route.query.id) {
             // 编辑
             edit(this.form).then((res) => {
+              console.log("gadsfqewrqewrqr====" + JSON.stringify(res));
               if (res.code === 0) {
                 this.$message.success("修改成功!");
                 this.getCancel();
@@ -321,7 +562,7 @@ export default {
             // 新建
             create(this.form).then((res) => {
               if (res.code === 0) {
-                this.$message.success("提交成功!");
+                this.$message.success("添加成功!");
                 this.getCancel();
               }
             });
@@ -331,6 +572,16 @@ export default {
         }
       });
     },
+    clickAddPlatform() {
+      this.isShowPlatform = true;
+      if (this.platformOptions.length != 0 && this.contentVipPlatformList.length < this.platformOptions.length) {
+
+        this.contentVipPlatformList.push({ "contentVip": null, "platformId": null, });
+      } else {
+        let tips = `最多只能添加${this.platformOptions.length}个平台`;
+        this.$message.warning(tips);
+      }
+    },
   },
 };
 </script>

+ 2 - 1
src/views/device/list/index.vue

@@ -1,4 +1,4 @@
-<!-- 设备管理 设备分类 -->
+<!-- 设备管理 设备列表 -->
 <template>
   <div class="app-container">
     <!-- 搜索表单 -->
@@ -180,6 +180,7 @@ yesOrNoMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceList",
   mixins: [
     devMixin,
     onOrOffMixin,

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

@@ -1,4 +1,4 @@
-<!-- 设备音乐 -->
+<!-- 设备管理 设备音乐 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -208,7 +208,9 @@ import { list as sceneList } from "@/api/operation/scene";
 import { disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceMusic",
   mixins: [disabledMixin],
+  
   data() {
     return {
       // 遮罩层

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

@@ -1,4 +1,3 @@
-<!-- 设备升级 -->
 <template>
   <div class="app-container" v-loading="loading">
     <el-form :model="form" :rules="rules" ref="form" label-width="100px">
@@ -127,6 +126,7 @@
 import { getDetailInfo, getVersionAdd, updateEdit } from "@/api/device/version";
 import { devMixin, devModeMixin } from "@/mixin/index";
 export default {
+  // name: "deviceVersionDetail",
   mixins: [devMixin, devModeMixin],
   data() {
     return {
@@ -307,7 +307,7 @@ export default {
     },
     // 取消
     getCancel() {
-      this.$tab.closeOpenPage("/device/version");
+      this.$tab.closeOpenPage("/device/deviceVersion");
     },
   },
 };
@@ -317,4 +317,4 @@ export default {
 .el-form {
   width: 500px;
 }
-</style>
+</style>

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

@@ -1,6 +1,6 @@
 
 
-<!-- 设备升级 -->
+<!--设备管理 设备升级 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -114,6 +114,7 @@ import { getPageList, getVersionDelete } from "@/api/device/version";
 import { devMixin, devModeMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "DeviceVersion",
   mixins: [devMixin, devModeMixin],
   data() {
     return {

+ 1 - 0
src/views/device/warning/index.vue

@@ -83,6 +83,7 @@
 import { change, detail, list, submit } from "@/api/device/warning";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"DeviceWarning",
   data() {
     var reg = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
     var checkPhone = (rule, value, callback) => {

+ 101 - 32
src/views/device/yxw/index.vue

@@ -1,3 +1,4 @@
+<!-- 设备管理 云小微 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -6,43 +7,100 @@
         <el-input v-model="form.dsn" placeholder="请输入设备号" clearable />
       </el-form-item>
       <el-form-item label="设备型号:">
-        <el-input v-model="form.clientType" placeholder="请输入设备型号" clearable />
+        <el-input
+          v-model="form.clientType"
+          placeholder="请输入设备型号"
+          clearable
+        />
       </el-form-item>
       <el-form-item label="设备标识:">
-        <el-input v-model="form.deviceMac" placeholder="请输入设备标识" clearable />
+        <el-input
+          v-model="form.deviceMac"
+          placeholder="请输入设备标识"
+          clearable
+        />
       </el-form-item>
       <el-form-item label="设备模式:">
-        <el-select v-model="form.deviceType" placeholder="请选择设备类型" clearable>
-          <el-option v-for="item in devModeOptions" :key="item.value" :label="item.label" :value="item.value" />
+        <el-select
+          v-model="form.deviceType"
+          placeholder="请选择设备类型"
+          clearable
+        >
+          <el-option
+            v-for="item in devModeOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="当前状态:">
         <el-select v-model="form.status" placeholder="请选择当前状态" clearable>
-          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" />
+          <el-option
+            v-for="item in statusOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="创建时间:">
-        <el-date-picker v-model="createTime" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
-          value-format="yyyy-MM-dd HH:mm:ss" clearable />
+        <el-date-picker
+          v-model="createTime"
+          type="datetimerange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          clearable
+        />
       </el-form-item>
       <el-form-item label="激活时间:">
-        <el-date-picker v-model="updateTime" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
-          value-format="yyyy-MM-dd HH:mm:ss" clearable />
+        <el-date-picker
+          v-model="updateTime"
+          type="datetimerange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          clearable
+        />
       </el-form-item>
       <el-form-item>
-        <el-button icon="el-icon-search" type="primary" @click="getSearch">搜索</el-button>
+        <el-button icon="el-icon-search" type="primary" @click="getSearch"
+          >搜索</el-button
+        >
         <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
-        <el-button icon="el-icon-plus" type="primary" plain @click="dialogVisible = true"
-          v-hasPermi="['device:yxw:add']">新增</el-button>
-        <el-button icon="el-icon-download" type="primary" @click="getDownLoadNo"
-          v-hasPermi="['device:yxw:downloadDev']">导出设备号</el-button>
-        <el-button icon="el-icon-download" type="primary" @click="getDownLoadData"
-          v-hasPermi="['device:yxw:download']">导出数据</el-button>
+        <el-button
+          icon="el-icon-plus"
+          type="primary"
+          plain
+          @click="dialogVisible = true"
+          v-hasPermi="['device:yxw:add']"
+          >新增</el-button
+        >
+        <el-button
+          icon="el-icon-download"
+          type="primary"
+          @click="getDownLoadNo"
+          v-hasPermi="['device:yxw:downloadDev']"
+          >导出设备号</el-button
+        >
+        <el-button
+          icon="el-icon-download"
+          type="primary"
+          @click="getDownLoadData"
+          v-hasPermi="['device:yxw:download']"
+          >导出数据</el-button
+        >
       </el-form-item>
     </el-form>
     <!-- 列表 -->
     <el-table :data="tableData" v-loading="loading">
-      <el-table-column prop="id" label="设备号" align="center" show-overflow-tooltip />
+      <el-table-column
+        prop="id"
+        label="设备号"
+        align="center"
+        show-overflow-tooltip
+      />
       <el-table-column prop="deviceMac" label="设备标识" align="center" />
       <el-table-column prop="clientType" label="设备型号" align="center" />
       <el-table-column prop="type" label="设备模式" align="center" />
@@ -50,12 +108,23 @@
       <el-table-column prop="updateTimeStr" label="激活时间" align="center" />
       <el-table-column prop="statusStr" label="当前状态" align="center" />
     </el-table>
-    <pagination v-show="total > 0" :total="total" :page.sync="form.pageIndex" :limit.sync="form.pageSize"
-      @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="form.pageIndex"
+      :limit.sync="form.pageSize"
+      @pagination="getList"
+    />
     <!-- 弹窗 -->
     <el-dialog title="新增" :visible.sync="dialogVisible" width="500px">
       <el-form :model="dialogForm" ref="form" label-width="100px">
-        <el-form-item prop="num" label="设备数量:" :rules="[{ required: true, message: '请输入设备数量', trigger: 'blur' }]">
+        <el-form-item
+          prop="num"
+          label="设备数量:"
+          :rules="[
+            { required: true, message: '请输入设备数量', trigger: 'blur' },
+          ]"
+        >
           <el-input v-model="dialogForm.num" placeholder="请输入设备数量" />
         </el-form-item>
       </el-form>
@@ -68,9 +137,10 @@
 </template>
 
 <script>
-import { getYxwPage, getYxwAdd } from "@/api/device/yxw";
-import { devModeMixin } from '@/mixin/index'
+import { getYxwAdd, getYxwPage } from "@/api/device/yxw";
+import { devModeMixin } from "@/mixin/index";
 export default {
+  name:"DeviceYXW",
   mixins: [devModeMixin],
   data() {
     return {
@@ -104,18 +174,18 @@ export default {
       dialogVisible: false,
       // 新增设备数量
       dialogForm: {
-        num: ""
-      }
+        num: "",
+      },
     };
   },
   watch: {
     createTime(val) {
-      this.form.startCreateTime = val[0]
-      this.form.endCreateTime = val[1]
+      this.form.startCreateTime = val[0];
+      this.form.endCreateTime = val[1];
     },
     updateTime(val) {
-      this.form.startUpdateTime = val[0]
-      this.form.endUpdateTime = val[1]
+      this.form.startUpdateTime = val[0];
+      this.form.endUpdateTime = val[1];
     },
   },
   mounted() {
@@ -162,10 +232,9 @@ export default {
             }
           });
         } else {
-          return false
+          return false;
         }
-      })
-
+      });
     },
 
     // 导出设备号
@@ -184,7 +253,7 @@ export default {
         this.form,
         `云小微设备数据.xlsx`
       );
-    }
+    },
   },
 };
 </script>

+ 1 - 0
src/views/goods/list/detail.vue

@@ -41,6 +41,7 @@
 import { create, detail, edit } from '@/api/goods/list'
 import { locMixin } from './mixin'
 export default {
+  // name:"goodsListDetail",
   mixins: [locMixin],
   data() {
     return {

+ 3 - 1
src/views/goods/list/index.vue

@@ -1,4 +1,5 @@
-<!-- 商品推荐 -->
+<!-- 商品管理 商品推荐 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -118,6 +119,7 @@ import { currentMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 import { locMixin } from "./mixin";
 export default {
+  name:"GoodsList",
   mixins: [locMixin, currentMixin],
   data() {
     return {

+ 242 - 180
src/views/music/album/detail.vue

@@ -1,139 +1,77 @@
 <!-- 音乐专辑 详情 -->
 <template>
   <div class="app-container">
-    <el-form
-      class="form"
-      :model="form"
-      ref="form"
-      :rules="rules"
-      label-width="100px"
-      :disabled="disabled"
-    >
+    <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="请输入专辑名称" />
       </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="albumType">
         <el-select v-model="form.albumType" placeholder="请选择专辑类型">
-          <el-option
-            v-for="item in albumTypeOptions"
-            :key="item.value"
-            :value="item.value"
-            :label="item.label"
-          />
+          <el-option v-for="item in albumTypeOptions" :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-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">
         <el-select v-model="form.payType" 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.payType !== 1" label="原价:" prop="price">
-        <el-input-number
-          v-model="form.price"
-          placeholder="请输入原价"
-          :min="1"
-          :precision="2"
-          :controls="false"
-        />
+        <el-input-number v-model="form.price" placeholder="请输入原价" :min="1" :precision="2" :controls="false" />
       </el-form-item>
       <el-form-item v-if="form.payType !== 1" label="折扣价:" prop="discount">
-        <el-input-number
-          v-model="form.discount"
-          placeholder="请输入折扣价"
-          :min="1"
-          :precision="2"
-          :controls="false"
-        />
+        <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: 100%">
-        <el-button type="primary" icon="el-icon-plus" @click="getDialog"
-          >添加歌曲</el-button
-        >
+        <el-button type="primary" icon="el-icon-plus" @click="getDialog">添加歌曲</el-button>
         <!-- 列表 -->
         <el-table :data="form.programList" 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="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="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+          <el-table-column label="序号" align="center">
+            <template slot-scope="scope">
+              <div v-if="currentEditIndex !== scope.$index">
+                <span :style="{ marginRight: (canOrder) ? '0px' : '8px' }">
+                  {{ (dialogForm.pageNum - 1) * dialogForm.pageSize + scope.$index + 1 }}
+                </span>
+                <svg-icon v-if="canOrder" icon-class="edit" @click.native="handleEditClick(scope.row, scope.$index)" />
+              </div>
+              <el-input v-else v-model="editData.sortIndex" size="mini" style="width:60px;" type="number"
+                @blur="onNumberBlur(scope.row, scope.$index)" placeholder="序号" ref="numberInput" />
+            </template>
+          </el-table-column>
           <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
-              >
-
-              <el-button
-                v-if="!disabledPlatformId(form.platformId)"
-                type="text"
-                icon="el-icon-caret-top"
-                @click="getChangeSort(scope.$index, scope.$index - 1)"
-                :disabled="scope.$index <= 0"
-              />
-
-              <el-button
-                v-if="!disabledPlatformId(form.platformId)"
-                type="text"
-                icon="el-icon-caret-bottom"
-                @click="getChangeSort(scope.$index, scope.$index + 1)"
-                :disabled="scope.$index > form.programList.length - 2"
-              />
+              <el-button type="delete" :disabled="disabled" @click="getDelete(scope.$index)">删除</el-button>
+
+              <!-- 向上移动 -->
+              <el-button type="text" icon="el-icon-caret-top" @click="getChange(true, scope.$index, scope.$index - 1)"
+                :disabled="(scope.$index < 1 && !disabled) ||
+                  disabledPlatformId(form.platformId)
+                  " />
+
+              <!-- 向下移动 -->
+              <el-button type="text" icon="el-icon-caret-bottom"
+                @click="getChange(false, scope.$index, scope.$index + 1)" :disabled="(scope.$index > form.programList.length - 2 && !disabled) ||
+                  disabledPlatformId(form.platformId)
+                  " />
             </template>
           </el-table-column>
         </el-table>
@@ -141,66 +79,39 @@
     </el-form>
     <div class="form-btn">
       <el-button @click="cancel">取消</el-button>
-      <el-button v-if="!disabled" type="primary" @click="getSubmit"
-        >确定</el-button
-      >
+      <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
     </div>
 
     <!-- 弹窗 -->
     <el-dialog :visible.sync="dialogVisible" title="添加歌曲" width="1100px">
       <el-form inline size="mini" style="width: 100%">
         <el-form-item label="歌曲名称:">
-          <el-input
-            v-model="dialogForm.name"
-            placeholder="请输入歌曲名称"
-            clearable
-          />
+          <el-input v-model="dialogForm.name" placeholder="请输入歌曲名称" clearable />
         </el-form-item>
         <el-form-item label="歌手名称:">
-          <el-input
-            v-model="dialogForm.singerName"
-            placeholder="请输入歌手名称"
-            clearable
-          />
+          <el-input v-model="dialogForm.singerName" placeholder="请输入歌手名称" clearable />
         </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-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-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" icon="el-icon-search" @click="getSearch"
-            >搜索</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-form-item>
       </el-form>
-      <el-table :data="tableData" v-loading="loading">
+      <el-table :data="tableData" ref="multipleTable" :row-key="tableKey" v-loading="loading"
+        @selection-change="handleSelectionChange">
+        <el-table-column type="selection" align="center" key="selection" reserve-selection />
+
         <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="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="操作" align="center">
+        <!-- <el-table-column label="操作" align="center">
           <template slot-scope="scope">
             <el-button
               type="text"
@@ -214,15 +125,10 @@
               选择
             </el-button>
           </template>
-        </el-table-column>
+        </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>
@@ -238,6 +144,7 @@ payTypeMixin,
 platformMixin,
 } from "@/mixin/index";
 export default {
+  // name: "musicAlbumDetail",
   mixins: [platformMixin, onOrOffMixin, payTypeMixin, albumTypeMixin],
   components: {
     Audio,
@@ -272,6 +179,8 @@ export default {
         status: 1,
         type: 1,
       },
+      editData: {},
+      currentEditIndex: -1,
       // 校验
       rules: {
         name: [
@@ -361,6 +270,10 @@ export default {
       disabled: false,
       // 是否已选
       disabledChecked: false,
+      ///被选中数据是否加载完
+      isLoad: false,
+      ///是否可以调整顺序
+      canOrder: true,
     };
   },
   mounted() {
@@ -375,6 +288,135 @@ export default {
     }
   },
   methods: {
+    tableKey(row) {
+      return row.id;
+    },
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+
+      let newValue = Number(this.editData.sortIndex);
+      const maxLen = this.form.programList.length;
+
+      if (isNaN(newValue) || newValue === null || newValue === undefined) {
+        this.currentEditIndex = -1;
+        console.log('序号未修改:', newValue);
+        return;
+      }
+      if (newValue < 1) {
+        this.$message.warning('序号必须大于1');
+        this.currentEditIndex = -1;
+
+        return;
+      }
+      if (newValue > maxLen) {
+        // 超出就是最后一位
+        newValue = maxLen
+      }
+
+      if (newValue === -1 || newValue === '') {
+        // 新值为空时处理
+        this.currentEditIndex = -1;
+        console.log('序号未修改:', newValue);
+        return
+      }
+      console.log('序号修改:', newValue, '当前索引:', index, this.currentEditIndex);
+
+      // 计算目标下标
+      const targetIndex = newValue - 1;
+      if (targetIndex === index) {
+        this.currentEditIndex = -1;
+        return;
+      }
+      // 交换两个元素
+      // ...existing code...
+      const movingItem = this.form.programList.splice(index, 1)[0];
+      this.form.programList.splice(targetIndex, 0, movingItem);
+      this.currentEditIndex = -1;
+      this.$message.success("操作成功!");
+
+
+    },
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      if (!this.canOrder) {
+        console.log('编辑功能已禁用', this.disabled, this.canOrder);
+        return;
+      }
+      this.editData = {
+        sortIndex: row.index,
+      };
+      this.currentEditIndex = index;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+      });
+
+    },
+    handleSelectionChange(val) {
+      if (this.isLoad) {
+        if (this.form.programList.length == 0) {
+          this.form.programList = JSON.parse(JSON.stringify(val));
+        } else {
+          ///查找dialogTableData里面有的
+          var tempDialogHas = [];
+          for (var i = 0; i < this.tableData.length; i++) {
+            for (var j = 0; j < val.length; j++) {
+              if (this.tableData[i].id === val[j].id) {
+                tempDialogHas.push(this.tableData[i]);
+                break;
+              }
+            }
+          }
+
+          ///查找dialogTableData里面没有的
+          var tempDialogNot = [];
+          if (tempDialogHas.length == 0) {
+            tempDialogNot = JSON.parse(JSON.stringify(this.tableData));
+          } else {
+            for (var i = 0; i < this.tableData.length; i++) {
+              var has = false;
+              for (var j = 0; j < tempDialogHas.length; j++) {
+                if (this.tableData[i].id === tempDialogHas[j].id) {
+                  has = true;
+                  break;
+                }
+              }
+              if (!has) {
+                tempDialogNot.push(this.tableData[i]);
+              }
+            }
+          }
+
+          ///减少val没有的
+          if (tempDialogNot.length > 0) {
+            for (var i = 0; i < tempDialogNot.length; i++) {
+              for (var j = 0; j < this.form.programList.length; j++) {
+                if (tempDialogNot[i].id === this.form.programList[j].id) {
+                  this.form.programList.splice(j, 1);
+                  break;
+                }
+              }
+            }
+          }
+
+          ///添加adminPodCastProgramDetailResp没有的
+          for (var i = 0; i < val.length; i++) {
+            var isHas = false;
+            for (var j = 0; j < this.form.programList.length; j++) {
+              if (val[i].id === this.form.programList[j].id) {
+                isHas = true;
+                break;
+              }
+            }
+            if (!isHas) {
+              this.form.programList.push(val[i]);
+            }
+          }
+        }
+        this.form.programList = this.form.programList.filter((i) => i);
+        this.$message.success("操作成功!");
+      }
+    },
+
     //是否展示排序
     // isShowSort() {
     //   if (this.form) {
@@ -386,27 +428,17 @@ export default {
     // },
 
     // 排序
-    getChangeSort(row, sort) {
-      const rowBean = this.form.programList[row];
-      const sortBean = this.form.programList[sort];
-      this.form.programList[row] = sortBean;
-      this.form.programList[sort] = rowBean;
+    getChange(top, index, laterIndex) {
+      var row = this.form.programList[index];
+      var laterRow = this.form.programList[laterIndex];
+      if (top) {
+        this.form.programList[index] = laterRow;
+        this.form.programList[laterIndex] = row;
+      } else {
+        this.form.programList[laterIndex] = row;
+        this.form.programList[index] = laterRow;
+      }
       this.form.programList = this.form.programList.filter((i) => i);
-
-      // let arr = [];
-      // const formTemp = this.form;
-      // formTemp.programList.map((i) => {
-      //   arr.push(i.id);
-      // });
-      // formTemp.programList = arr;
-
-      // submit(formTemp).then((res) => {
-      //   if (res.code === 0) {
-      //     let title = "修改成功!";
-      //     this.$message.success(`${title}`);
-      //     this.getDetail();
-      //   }
-      // });
     },
 
     // 详情
@@ -415,10 +447,15 @@ export default {
       detail(this.form.id).then((res) => {
         if (res.code === 0) {
           this.form = res.data;
+          ///qq音乐和喜马拉雅
+          if (this.form.platformId == 6 || this.form.platformId == 12) {
+            this.canOrder = false;
+          }
           this.form_loading = false;
         }
       });
     },
+
     // 上传
     upload(e, key) {
       this.form[key] = e.file;
@@ -441,6 +478,27 @@ export default {
           this.tableData = res.data.records;
           this.total = res.data.total;
           this.loading = false;
+
+          this.isLoad = false;
+          this.$refs.multipleTable.clearSelection();
+          if (this.form.programList.length > 0) {
+            var temp = [];
+            for (var i = 0; i < this.tableData.length; i++) {
+              for (var j = 0; j < this.form.programList.length; j++) {
+                if (this.form.programList[j].id === this.tableData[i].id) {
+                  temp.push(this.tableData[i]);
+                  break;
+                }
+              }
+            }
+
+            if (temp.length > 0) {
+              temp.forEach((item) => {
+                this.$refs.multipleTable.toggleRowSelection(item, true);
+              });
+            }
+          }
+          this.isLoad = true;
         }
       });
     },
@@ -495,13 +553,17 @@ export default {
           let title = this.form.id ? "编辑成功!" : "新增成功!";
           submit(this.form).then((res) => {
             if (res.code === 0) {
-              this.$message.success(`${title}`);
-              if (!this.form.id) {
-                this.cancel();
-              } else {
-                this.getDetail();
-              }
+              this.$message.success(title);
+              this.cancel();
             }
+            // if (res.code === 0) {
+            //   this.$message.success(`${title}`);
+            //   if (!this.form.id) {
+            //     this.cancel();
+            //   } else {
+            //     this.getDetail();
+            //   }
+            // }
           });
         } else {
           return false;
@@ -511,7 +573,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/music/album");
+      this.$tab.closeOpenPage("/music/musicAlbum");
     },
 
     // 字典翻译

+ 39 - 156
src/views/music/album/index.vue

@@ -10,213 +10,95 @@
         <el-input v-model="form.name" placeholder="请输入专辑名称" clearable />
       </el-form-item>
       <el-form-item label="歌手名称:">
-        <el-input
-          v-model="form.singerName"
-          placeholder="请输入歌手名称"
-          clearable
-        />
+        <el-input v-model="form.singerName" 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-select v-model="form.platformId" placeholder="请选择资源平台" clearable>
+          <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
       <el-form-item label="专辑类型:">
-        <el-select
-          v-model="form.albumType"
-          placeholder="请选择专辑类型"
-          clearable
-        >
-          <el-option
-            v-for="item in albumTypeOptions"
-            :key="item.value"
-            :value="item.value"
-            :label="item.label"
-          />
+        <el-select v-model="form.albumType" placeholder="请选择专辑类型" clearable>
+          <el-option v-for="item in albumTypeOptions" :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"
-            :key="item.value"
-            :value="item.value"
-            :label="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-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>
-        <el-button type="primary" icon="el-icon-search" @click="getSearch"
-          >搜索</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"
-          plain
-          icon="el-icon-plus"
-          @click="getDetail()"
-          v-hasPermi="['music:album:add']"
-          >新增</el-button
-        >
-        <el-button
-          type="primary"
-          :disabled="obj.id === ''"
-          @click="getChange(obj, 1)"
-          v-hasPermi="['music:album:up']"
-          >批量上架</el-button
-        >
-        <el-button
-          type="primary"
-          :disabled="obj.id === ''"
-          @click="getChange(obj, 2)"
-          v-hasPermi="['music:album:down']"
-          >批量下架</el-button
-        >
+        <el-button type="primary" plain icon="el-icon-plus" @click="getDetail()"
+          v-hasPermi="['music:album:add']">新增</el-button>
+        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 1)"
+          v-hasPermi="['music:album:up']">批量上架</el-button>
+        <el-button type="primary" :disabled="obj.id === ''" @click="getChange(obj, 2)"
+          v-hasPermi="['music:album:down']">批量下架</el-button>
       </el-form-item>
     </el-form>
     <!-- 列表 -->
-    <el-table
-      :data="tableData"
-      v-loading="loading"
-      @selection-change="handleSelect"
-    >
+    <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="专辑名称"
-        prop="name"
-        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">
           <el-image v-if="scope.row.coverUrl" :src="scope.row.coverUrl" />
         </template>
       </el-table-column>
-      <el-table-column
-        label="专辑类型"
-        prop="albumType"
-        align="center"
-        :formatter="typeFormatter"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        label="歌手名称"
-        prop="singerName"
-        align="center"
-        show-overflow-tooltip
-      />
-      <el-table-column
-        label="付费类型"
-        prop="payType"
-        align="center"
-        :formatter="payTypeFormatter"
-      />
+      <el-table-column label="专辑类型" prop="albumType" align="center" :formatter="typeFormatter" show-overflow-tooltip />
+      <el-table-column label="歌手名称" prop="singerName" align="center" show-overflow-tooltip />
+      <el-table-column label="付费类型" prop="payType" align="center" :formatter="payTypeFormatter" />
       <el-table-column label="歌曲数量" prop="programCount" align="center" />
-      <el-table-column
-        label="资源平台"
-        prop="platformId"
-        align="center"
-        :formatter="platformFormatter"
-      />
-      <el-table-column
-        label="当前状态"
-        prop="status"
-        align="center"
-        :formatter="statusFormatter"
-      />
+      <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
+      <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+
       <el-table-column label="更新时间" prop="updateTime" align="center">
         <template slot-scope="scope">
           <span>{{
             parseTime(scope.row.updateTime, "{y}-{m}-{d} {h}:{i}:{s}")
-          }}</span>
+            }}</span>
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
-          <el-button type="text" @click="getDetail(scope.row.id, true)"
-            >查看</el-button
-          >
+          <el-button 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:album:edit']"
-              style="margin-left: 10px"
-            >
+            <el-button type="text" @click="getDetail(scope.row.id)" v-hasPermi="['music:album:edit']"
+              style="margin-left: 10px">
               编辑
             </el-button>
-            <el-button
-              type="text"
-              @click="getChange(scope.row, 1)"
-              v-hasPermi="['music:album:up']"
-              >上架
+            <el-button type="text" @click="getChange(scope.row, 1)" v-hasPermi="['music:album:up']">上架
             </el-button>
-            <el-button
-              type="delete"
-              @click="getDelete(scope.row)"
-              v-hasPermi="['music:album:delete']"
-              >删除
+            <el-button type="delete" @click="getDelete(scope.row)" v-hasPermi="['music:album:delete']">删除
             </el-button>
           </span>
-          <el-button
-            v-else
-            type="text"
-            @click="getChange(scope.row, 2)"
-            v-hasPermi="['music:album:down']"
-            >下架
+          <el-button v-else type="text" @click="getChange(scope.row, 2)" v-hasPermi="['music:album:down']">下架
           </el-button>
         </template>
       </el-table-column>
     </el-table>
-    <pagination
-      v-show="total > 0"
-      :total="total"
-      :page.sync="form.pageNum"
-      :limit.sync="form.pageSize"
-      @pagination="getList"
-    />
   </div>
 </template>
 
 <script>
 import { change, list, remove } from "@/api/music/menu";
 import {
-albumTypeMixin,
-onOrOffMixin,
-payTypeMixin,
-platformMixin,
+  albumTypeMixin,
+  onOrOffMixin,
+  payTypeMixin,
+  platformMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "MusicAlbum",
   mixins: [platformMixin, onOrOffMixin, payTypeMixin, albumTypeMixin],
   data() {
     return {
@@ -232,6 +114,7 @@ export default {
       total: 0,
       // 列表
       tableData: [],
+
       // 批量上下架
       obj: {
         id: "",
@@ -303,7 +186,7 @@ export default {
             }
           });
         })
-        .catch(() => {});
+        .catch(() => { });
     },
 
     // 删除
@@ -322,7 +205,7 @@ export default {
               }
             });
           })
-          .catch(() => {});
+          .catch(() => { });
       });
     },
 

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

@@ -26,9 +26,10 @@
 </template>
 
 <script>
-import { submit, detail } from '@/api/music/anchor'
+import { detail, submit } from '@/api/music/anchor'
 import { platformMixin } from '@/mixin/index'
 export default {
+  // name:"musicAnchorDetail",
   mixins: [platformMixin],
   data() {
     return {
@@ -99,7 +100,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage('/music/anchor')
+      this.$tab.closeOpenPage('/music/musicAnchor')
     }
   }
 }

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

@@ -121,6 +121,7 @@ import { change, list, remove } from "@/api/music/anchor";
 import { onOrOffMixin, platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicAnchor",
   mixins: [platformMixin, onOrOffMixin],
   data() {
     return {

+ 282 - 231
src/views/music/blog/detail.vue

@@ -1,175 +1,86 @@
-<!-- 博客专辑 详情 -->
+<!-- 音频管理 播客专辑详情 -->
 <template>
   <div class="app-container">
-    <el-form
-      class="form"
-      :model="form"
-      ref="form"
-      :rules="rules"
-      label-width="100px"
-      :disabled="disabled"
-    >
+    <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="请输入播客名称" />
       </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">
-        <el-select
-          v-model="form.categoryIds"
-          multiple
-          placeholder="请选择播客分类"
-        >
-          <el-option
-            v-for="item in blogClassOptions"
-            :key="item.value"
-            :value="item.value"
-            :label="item.label"
-          />
+        <el-select v-model="form.categoryIds" multiple placeholder="请选择播客分类">
+          <el-option v-for="item in blogClassOptions" :key="item.value" :value="item.value" :label="item.label" />
         </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-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="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-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-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-form-item>
       <el-form-item label="播客封面" prop="thumb">
-        <Upload
-          listType="picture-card"
-          :url="form.thumb"
-          @upload="upload"
-          :disabled="disabled"
-        />
+        <Upload listType="picture-card" :url="form.thumb" @upload="upload" :disabled="disabled" />
       </el-form-item>
       <el-form-item label="关联节目:" prop="adminPodCastProgramDetailResp">
         <el-button type="primary" @click="getDialog">关联节目</el-button>
-        <el-button @click="getDelete" :disabled="ids.length > 0 ? false : true"
-          >解除关联</el-button
-        >
+        <el-button @click="getDelete" :disabled="ids.length > 0 ? false : true">解除关联</el-button>
       </el-form-item>
+
       <el-form-item style="width: 100%">
-        <el-table
-          :data="form.adminPodCastProgramDetailResp"
-          @selection-change="handleSelect"
-        >
+        <el-table :data="form.adminPodCastProgramDetailResp" @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="节目名称"
-            prop="name"
-            align="center"
-            show-overflow-tooltip
-          />
-          <el-table-column
-            label="资源平台"
-            prop="platformId"
-            align="center"
-            :formatter="platformFormatter"
-          />
-          <el-table-column
-            label="当前状态"
-            prop="status"
-            align="center"
-            :formatter="statusFormatter"
-          />
-
-          <el-table-column
-            v-if="!disabledPlatformId(form.platformId)"
-            label="操作"
-            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="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">
-              <Audio :src="scope.row.progaramUrl" />
-
-              <el-button
-                type="text"
-                icon="el-icon-caret-top"
-                @click="getChangeSort(scope.$index, scope.$index - 1)"
-                :disabled="scope.$index <= 0"
-              />
-
-              <el-button
-                type="text"
-                icon="el-icon-caret-bottom"
-                @click="getChangeSort(scope.$index, scope.$index + 1)"
-                :disabled="
-                  scope.$index > form.adminPodCastProgramDetailResp.length - 2
-                "
-              />
+              <div v-if="currentEditIndex !== scope.$index">
+                <span :style="{ marginRight: (canOrder) ? '0px' : '8px' }">
+                  {{ (dialogForm.pageNum - 1) * dialogForm.pageSize + scope.$index + 1 }}
+                </span>
+                <svg-icon v-if="canOrder" icon-class="edit" @click.native="handleEditClick(scope.row, scope.$index)" />
+              </div>
+              <el-input v-else v-model="editData.sortIndex" size="mini" style="width:60px;" type="number"
+                @blur="onNumberBlur(scope.row, scope.$index)" placeholder="序号" ref="numberInput" />
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center">
+            <template slot-scope="scope">
+              <!-- 向上移动 -->
+              <el-button type="text" icon="el-icon-caret-top" @click="getChange(true, scope.$index, scope.$index - 1)"
+                :disabled="(scope.$index < 1 && !disabled) ||
+                  disabledPlatformId(form.platformId)
+                  " />
+
+              <!-- 向下移动 -->
+              <el-button type="text" icon="el-icon-caret-bottom"
+                @click="getChange(false, scope.$index, scope.$index + 1)" :disabled="(scope.$index >
+                  form.adminPodCastProgramDetailResp.length - 2 &&
+                  !disabled) ||
+                  disabledPlatformId(form.platformId)
+                  " />
             </template>
           </el-table-column>
         </el-table>
@@ -177,91 +88,46 @@
     </el-form>
     <div class="form-btn">
       <el-button @click="cancel">取消</el-button>
-      <el-button v-if="!disabled" type="primary" @click="getSubmit"
-        >确定</el-button
-      >
+      <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
     </div>
 
     <!-- 弹窗 -->
     <el-dialog :visible.sync="dialogVisible" title="关联节目" width="1200px">
       <el-form inline size="mini" style="width: 100%">
         <el-form-item label="节目ID:">
-          <el-input
-            v-model="dialogForm.id"
-            placeholder="请输入节目ID"
-            clearable
-          />
+          <el-input v-model="dialogForm.id" placeholder="请输入节目ID" clearable />
         </el-form-item>
         <el-form-item label="节目名称:">
-          <el-input
-            v-model="dialogForm.name"
-            placeholder="请输入节目名称"
-            clearable
-          />
+          <el-input v-model="dialogForm.name" placeholder="请输入节目名称" clearable />
         </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-select v-model="dialogForm.isFree" placeholder="请选择付费类型" clearable>
+            <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-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-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" icon="el-icon-search" @click="getSearch"
-            >搜索</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-form-item>
       </el-form>
-      <el-table :data="dialogTableData" v-loading="loading">
+      <el-table :data="dialogTableData" ref="multipleTable" :row-key="tableKey" v-loading="loading"
+        @selection-change="handleSelectionChange">
+        <el-table-column type="selection" align="center" key="selection" reserve-selection />
+
         <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="platformId"
-          align="center"
-          :formatter="platformFormatter"
-        />
-        <el-table-column
-          label="付费类型"
-          prop="isFree"
-          align="center"
-          :formatter="freeFormatter"
-        />
-        <el-table-column
-          label="当前状态"
-          prop="status"
-          align="center"
-          :formatter="statusFormatter"
-        />
-        <el-table-column label="操作" align="center">
+        <el-table-column label="节目名称" prop="name" align="center" show-overflow-tooltip />
+        <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
+        <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
+        <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
+
+        <!-- <el-table-column label="操作" align="center">
           <template slot-scope="scope">
             <el-button
               type="text"
@@ -277,15 +143,10 @@
               选择
             </el-button>
           </template>
-        </el-table-column>
+        </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>
@@ -301,6 +162,7 @@ payTypeMixin,
 platformMixin,
 } from "@/mixin/index";
 export default {
+  // name: "musicBlogDetail",
   mixins: [
     blogClassMixin,
     platformMixin,
@@ -331,6 +193,8 @@ export default {
     return {
       // 遮罩层
       loading: false,
+      editData: {},
+      currentEditIndex: -1,
       // 表单
       form: {
         adminPodCastProgramDetailResp: [],
@@ -424,9 +288,14 @@ export default {
       ids: [],
       // 是否已选
       disabledChecked: false,
+      ///被选中数据是否加载完
+      isLoad: false,
+      ///是否可以调整顺序
+      canOrder: true,
     };
   },
   mounted() {
+    console.log("博客专辑mounted");
     // 获取资源平台
     this.getPlatform({
       audioType: 8,
@@ -438,25 +307,110 @@ export default {
     }
   },
   methods: {
+    // 删除已选歌曲
+    getDeletePlus(index) {
+      this.form.adminPodCastProgramDetailResp.splice(index, 1);
+      this.form.adminPodCastProgramDetailResp =
+        this.form.adminPodCastProgramDetailResp.filter((i) => i);
+    },
+
     // 排序
-    getChangeSort(row, sort) {
-      const rowBean = this.form.adminPodCastProgramDetailResp[row];
-      const sortBean = this.form.adminPodCastProgramDetailResp[sort];
-      this.form.adminPodCastProgramDetailResp[row] = sortBean;
-      this.form.adminPodCastProgramDetailResp[sort] = rowBean;
+    getChange(top, index, laterIndex) {
+      var row = this.form.adminPodCastProgramDetailResp[index];
+      var laterRow = this.form.adminPodCastProgramDetailResp[laterIndex];
+      if (top) {
+        this.form.adminPodCastProgramDetailResp[index] = laterRow;
+        this.form.adminPodCastProgramDetailResp[laterIndex] = row;
+      } else {
+        this.form.adminPodCastProgramDetailResp[laterIndex] = row;
+        this.form.adminPodCastProgramDetailResp[index] = laterRow;
+      }
       this.form.adminPodCastProgramDetailResp =
         this.form.adminPodCastProgramDetailResp.filter((i) => i);
-      // this.form.podcastProgramIds = [];
-      // this.form.adminPodCastProgramDetailResp.map((i) => {
-      //   this.form.podcastProgramIds.push(i.id);
-      // });
-      // submit(this.form).then((res) => {
-      //   if (res.code === 0) {
-      //     let title = "修改成功!";
-      //     this.$message.success(`${title}`);
-      //     this.getDetail();
-      //   }
-      // });
+    },
+
+    tableKey(row) {
+      return row.id;
+    },
+
+    handleSelectionChange(val) {
+      if (this.isLoad) {
+        if (this.form.adminPodCastProgramDetailResp.length == 0) {
+          this.form.adminPodCastProgramDetailResp = JSON.parse(
+            JSON.stringify(val)
+          );
+        } else {
+          ///查找dialogTableData里面有的
+          var tempDialogHas = [];
+          for (var i = 0; i < this.dialogTableData.length; i++) {
+            for (var j = 0; j < val.length; j++) {
+              if (this.dialogTableData[i].id === val[j].id) {
+                tempDialogHas.push(this.dialogTableData[i]);
+                break;
+              }
+            }
+          }
+
+          ///查找dialogTableData里面没有的
+          var tempDialogNot = [];
+          if (tempDialogHas.length == 0) {
+            tempDialogNot = JSON.parse(JSON.stringify(this.dialogTableData));
+          } else {
+            for (var i = 0; i < this.dialogTableData.length; i++) {
+              var has = false;
+              for (var j = 0; j < tempDialogHas.length; j++) {
+                if (this.dialogTableData[i].id === tempDialogHas[j].id) {
+                  has = true;
+                  break;
+                }
+              }
+              if (!has) {
+                tempDialogNot.push(this.dialogTableData[i]);
+              }
+            }
+          }
+
+          ///减少val没有的
+          if (tempDialogNot.length > 0) {
+            for (var i = 0; i < tempDialogNot.length; i++) {
+              for (
+                var j = 0;
+                j < this.form.adminPodCastProgramDetailResp.length;
+                j++
+              ) {
+                if (
+                  tempDialogNot[i].id ===
+                  this.form.adminPodCastProgramDetailResp[j].id
+                ) {
+                  this.form.adminPodCastProgramDetailResp.splice(j, 1);
+                  break;
+                }
+              }
+            }
+          }
+
+          ///添加adminPodCastProgramDetailResp没有的
+          for (var i = 0; i < val.length; i++) {
+            var isHas = false;
+            for (
+              var j = 0;
+              j < this.form.adminPodCastProgramDetailResp.length;
+              j++
+            ) {
+              if (val[i].id === this.form.adminPodCastProgramDetailResp[j].id) {
+                isHas = true;
+                break;
+              }
+            }
+            if (!isHas) {
+              this.form.adminPodCastProgramDetailResp.push(val[i]);
+            }
+          }
+        }
+        this.form.adminPodCastProgramDetailResp =
+          this.form.adminPodCastProgramDetailResp.filter((i) => i);
+        this.$message.success("操作成功!");
+      }
     },
 
     // 详情
@@ -464,6 +418,10 @@ export default {
       detail(this.form.id).then((res) => {
         if (res.code === 0) {
           this.form = res.data;
+          ///qq音乐和喜马拉雅
+          if (this.form.platformId == 6 || this.form.platformId == 12) {
+            this.canOrder = false;
+          }
           this.anchorOptions = [];
           res.data.adminPrdCasterResp.map((i) => {
             this.anchorOptions.push({
@@ -517,6 +475,34 @@ export default {
           this.dialogTableData = res.data.records;
           this.total = res.data.total;
           this.loading = false;
+
+          this.isLoad = false;
+          this.$refs.multipleTable.clearSelection();
+          if (this.form.adminPodCastProgramDetailResp.length > 0) {
+            var temp = [];
+            for (var i = 0; i < this.dialogTableData.length; i++) {
+              for (
+                var j = 0;
+                j < this.form.adminPodCastProgramDetailResp.length;
+                j++
+              ) {
+                if (
+                  this.form.adminPodCastProgramDetailResp[j].id ===
+                  this.dialogTableData[i].id
+                ) {
+                  temp.push(this.dialogTableData[i]);
+                  break;
+                }
+              }
+            }
+
+            if (temp.length > 0) {
+              temp.forEach((item) => {
+                this.$refs.multipleTable.toggleRowSelection(item, true);
+              });
+            }
+          }
+          this.isLoad = true;
         }
       });
     },
@@ -577,7 +563,13 @@ export default {
           this.form.adminPodCastProgramDetailResp.map((i) => {
             this.form.podcastProgramIds.push(i.id);
           });
+
           submit(this.form).then((res) => {
+            // if (res.code === 0) {
+            //   this.$message.success(title);
+            //   this.cancel();
+            // }
+
             if (res.code === 0) {
               this.$message.success(`${title}`);
               if (this.form.id) {
@@ -604,9 +596,68 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/music/blog");
+      this.$tab.closeOpenPage("/music/musicBlog");
+    },
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+
+      let newValue = Number(this.editData.sortIndex);
+      const maxLen = this.form.adminPodCastProgramDetailResp.length;
+
+      if (isNaN(newValue) || newValue === null || newValue === undefined) {
+        this.currentEditIndex = -1;
+        console.log('序号未修改:', newValue);
+        return;
+      }
+      if (newValue < 1) {
+        this.$message.warning('序号必须大于1');
+        this.currentEditIndex = -1;
+
+        return;
+      }
+      if (newValue > maxLen) {
+        // 超出就是最后一位
+        newValue = maxLen
+      }
+
+      if (newValue === -1 || newValue === '') {
+        // 新值为空时处理
+        this.currentEditIndex = -1;
+        console.log('序号未修改:', newValue);
+        return
+      }
+      console.log('序号修改:', newValue, '当前索引:', index, this.currentEditIndex);
+
+      // 计算目标下标
+      const targetIndex = newValue - 1;
+      if (targetIndex === index) {
+        this.currentEditIndex = -1;
+        return;
+      }
+      // 交换两个元素
+      // ...existing code...
+      const movingItem = this.form.adminPodCastProgramDetailResp.splice(index, 1)[0];
+      this.form.adminPodCastProgramDetailResp.splice(targetIndex, 0, movingItem);
+      this.currentEditIndex = -1;
+      this.$message.success("操作成功!");
+
+
     },
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      if (!this.canOrder) {
+        console.log('编辑功能已禁用', this.disabled, this.canOrder);
+        return;
+      }
+      this.editData = {
+        sortIndex: row.index,
+      };
+      this.currentEditIndex = index;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+      });
 
+    },
     // 字典翻译
     platformFormatter(row) {
       return this.selectDictLabel(this.platformOptions, row.platformId);

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

@@ -220,6 +220,7 @@ platformMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicBlog",
   mixins: [payTypeMixin, onOrOffMixin, platformMixin, blogClassMixin],
   data() {
     return {

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

@@ -74,6 +74,7 @@
 import { change, detail, list, submit } from "@/api/music/blogclass";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MuiscBlogClass",
   data() {
     return {
       // 遮罩层

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

@@ -253,6 +253,7 @@ import { detail, list, submit } from "@/api/music/choiceness";
 import { addressMixin, contentMixin, onOrOffMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  // name:"musicChoicenessDetail",
   mixins: [addressMixin, contentMixin, onOrOffMixin],
   data() {
     return {
@@ -414,7 +415,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/music/choiceness");
+      this.$tab.closeOpenPage("/music/musicChoiceness");
     },
 
     // 提交

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

@@ -119,6 +119,7 @@ import { change, list, remove } from "@/api/music/choiceness";
 import { onOrOffMixin, platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicChoiceness",
   mixins: [onOrOffMixin, platformMixin],
   data() {
     return {

+ 137 - 68
src/views/music/list/detail.vue

@@ -1,50 +1,95 @@
 <template>
   <div class="app-container">
-    <el-form :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
+    <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="请输入歌曲名称" />
       </el-form-item>
       <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-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-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-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="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>
           <template slot="suffix">
-            <Upload listType="audio" :size="100" @upload="upload($event, 'progaramUrl')" />
+            <Upload
+              listType="audio"
+              :size="100"
+              @upload="upload($event, 'progaramUrl')"
+            />
           </template>
         </el-input>
-        <div style="color:#909399">单个上传音频文件不超过100MB</div>
+        <div style="color: #909399">单个上传音频文件不超过100MB</div>
       </el-form-item>
     </el-form>
     <div class="form-btn">
       <el-button @click="cancel">取消</el-button>
-      <el-button type="primary" @click="getSubmit" v-if="!disabled">确定</el-button>
+      <el-button type="primary" @click="getSubmit" v-if="!disabled"
+        >确定</el-button
+      >
     </div>
   </div>
 </template>
 
 <script>
-import { submit, detail } from '@/api/music/list'
-import { selectSinger } from '@/api/music/singer'
-import { platformMixin, languageMixin } from '@/mixin/index'
+import { detail, submit } from "@/api/music/list";
+import { selectSinger } from "@/api/music/singer";
+import { languageMixin, platformMixin } from "@/mixin/index";
 export default {
+  // name:"musicListDetail",
   mixins: [platformMixin, languageMixin],
   data() {
     return {
@@ -53,88 +98,112 @@ export default {
       // 表单
       form: {
         status: 1,
-        realName: ''
+        realName: "",
       },
       // 是否只读
       disabled: false,
       // 校验
       rules: {
-        name: [{
-          required: true, message: '请输入歌曲名称', trigger: 'blur'
-        }],
-        singerId: [{
-          required: true, message: '请输入歌手名称', trigger: 'blur'
-        }],
-        lanuage: [{
-          required: true, message: '请选择歌曲语言', trigger: 'blur'
-        }],
-        platformId: [{
-          required: true, message: '请选择资源平台', trigger: 'change'
-        }],
-        thumbUrl: [{
-          required: true, message: '请上传音频封面', trigger: 'change'
-        }],
-        realName: [{
-          required: true, message: '请上传音频文件', trigger: 'blur'
-        }]
-      }
+        name: [
+          {
+            required: true,
+            message: "请输入歌曲名称",
+            trigger: "blur",
+          },
+        ],
+        singerId: [
+          {
+            required: true,
+            message: "请输入歌手名称",
+            trigger: "blur",
+          },
+        ],
+        lanuage: [
+          {
+            required: true,
+            message: "请选择歌曲语言",
+            trigger: "blur",
+          },
+        ],
+        platformId: [
+          {
+            required: true,
+            message: "请选择资源平台",
+            trigger: "change",
+          },
+        ],
+        thumbUrl: [
+          {
+            required: true,
+            message: "请上传音频封面",
+            trigger: "change",
+          },
+        ],
+        realName: [
+          {
+            required: true,
+            message: "请上传音频文件",
+            trigger: "blur",
+          },
+        ],
+      },
     };
   },
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 11
-    })
+      audioType: 11,
+    });
     if (this.$route.query.id) {
-      this.form.id = this.$route.query.id
-      this.disabled = Boolean(this.$route.query.disabled)
-      this.getList()
+      this.form.id = this.$route.query.id;
+      this.disabled = Boolean(this.$route.query.disabled);
+      this.getList();
     }
   },
   methods: {
     // 详情
     getList() {
-      detail(this.form.id).then(res => {
+      detail(this.form.id).then((res) => {
         if (res.code === 0) {
-          this.form = res.data
-          this.form.singerId = res.data.singerId.split(',')
-          res.data.singerResp.map(i => {
+          this.form = res.data;
+          this.form.singerId = res.data.singerId.split(",");
+          res.data.singerResp.map((i) => {
             this.singerOptions.push({
               value: i.singerId,
-              label: i.singerName
-            })
-          })
+              label: i.singerName,
+            });
+          });
         }
-      })
+      });
     },
 
     // 查询歌手
     getSelect(e) {
       if (e) {
         setTimeout(() => {
-          this.singerOptions = []
-          selectSinger(e).then(res => {
+          this.singerOptions = [];
+          selectSinger(e).then((res) => {
             if (res.code === 0) {
-              res.data.map(i => {
+              res.data.map((i) => {
                 this.singerOptions.push({
                   value: i.id,
-                  label: i.name
-                })
-              })
+                  label: i.name,
+                });
+              });
             }
-          }, 500)
-        })
+          }, 500);
+        });
       }
     },
 
     // 上传
     upload(e, key) {
-      if (key === 'thumbUrl') {
-        this.form.thumbUrl = e.file
+      if (key === "thumbUrl") {
+        this.form.thumbUrl = e.file;
       } else {
-        this.form.progaramUrl = e.file.url
-        this.form.playTime = e.file.time
-        this.form.realName = e.file.realName
+        this.form.progaramUrl = e.file.url;
+        this.form.playTime = e.file.time;
+        this.form.realName = e.file.realName;
       }
     },
 
@@ -142,17 +211,17 @@ export default {
     getSubmit() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          this.form.singerId = this.form.singerId.join(',')
-          submit(this.form).then(res => {
+          this.form.singerId = this.form.singerId.join(",");
+          submit(this.form).then((res) => {
             if (res.code === 0) {
-              this.$message.success('提交成功!')
-              this.cancel()
+              this.$message.success("提交成功!");
+              this.cancel();
             }
-          })
+          });
         } else {
-          return false
+          return false;
         }
-      })
+      });
     },
 
     // 取消

+ 83 - 8
src/views/music/list/index.vue

@@ -1,4 +1,4 @@
-<!-- 歌曲 -->
+<!--音频管理 歌曲 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -67,13 +67,13 @@
           v-hasPermi="['music:list:down']"
           >批量下架</el-button
         >
-        <Upload
-          listType="mp3"
-          multiple
-          name="multipartFiles"
-          @upload="getList()"
-          style="margin-left: 10px"
-          >批量上传</Upload
+
+        <!-- v-if="form.platformId == ''" -->
+        <el-button
+          type="primary"
+          size="mini"
+          @click="getDialog()"
+          >批量上传</el-button
         >
       </el-form-item>
     </el-form>
@@ -172,25 +172,79 @@
       :limit.sync="form.pageSize"
       @pagination="getList"
     />
+
+    <el-dialog
+      :visible.sync="dialogVisible"
+      :title="classTitle"
+      width="500px"
+      :before-close="getInputClose"
+    >
+      <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>
+
+      <div slot="footer">
+        <el-button @click="getClose">取消</el-button>
+        <!-- platformId="form.platformId" -->
+        <!-- <Upload
+          v-else
+          listType="mp3"
+          multiple
+          :platformId="form.platformId"
+          name="multipartFiles"
+          @upload="getList()"
+          style="margin-left: 10px"
+          >批量上传</Upload
+        > -->
+        <Upload
+          type="primary"
+          @click="getSubmit"
+          listType="mp3"
+          multiple
+          :platformId="this.form.platformId"
+          name="multipartFiles"
+          style="margin-left: 10px"
+          @upload="uploadSucceed()"
+          >批量上传</Upload
+        >
+      </div>
+    </el-dialog>
   </div>
 </template>
 
+
 <script>
 import { change, list, remove } from "@/api/music/list";
 import Audio from "@/components/Audio/index.vue";
 import { onOrOffMixin, platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicList",
   mixins: [platformMixin, onOrOffMixin],
   components: {
     Audio,
   },
+
   data() {
     return {
+      classTitle: "选择资源平台",
+      // 弹窗
+      dialogVisible: false,
       // 遮罩层
       loading: false,
       // 表单
       form: {
+        platformId: "",
         pageNum: 1,
         pageSize: 10,
       },
@@ -215,6 +269,27 @@ export default {
     this.getList();
   },
   methods: {
+    uploadSucceed(e) {
+      this.dialogVisible = false;
+      this.getList();
+    },
+
+    getInputClose() {
+      this.dialogVisible = false;
+    },
+
+    getClose() {
+      this.dialogVisible = false;
+    },
+
+    getSubmit() {
+      this.dialogVisible = false;
+    },
+
+    async getDialog() {
+      this.dialogVisible = true;
+    },
+
     // 列表
     getList() {
       this.loading = true;

+ 481 - 131
src/views/music/menu/detail.vue

@@ -1,135 +1,293 @@
+
+<!-- 音频管理 歌单详情 -->
 <template>
   <div class="app-container">
-    <el-form class="form" :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
+    <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="请输入歌单名称" />
       </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="avatarNickName">
-        <el-input v-model="form.avatarNickName" placeholder="请输入歌单创建者名称" />
+        <el-input
+          v-model="form.avatarNickName"
+          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-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">
         <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-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-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-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" />
+        <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" />
+        <Upload
+          listType="picture-card"
+          :url="form.avatarNickHead"
+          @upload="upload($event, 'avatarNickHead')"
+          :disabled="disabled"
+        />
       </el-form-item>
-      <el-form-item label="歌曲列表:" style="width: 100%;">
-        <el-button type="primary" icon="el-icon-plus" @click="getDialog">添加歌曲</el-button>
+      <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">
           <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="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="当前状态"
+            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>
+              <el-button type="delete"   :disabled="disabled" @click="getDelete(scope.$index)"
+                >删除</el-button>
+                
+            <!-- 向上移动 -->
+            <el-button
+              type="text"
+              icon="el-icon-caret-top"
+              @click="getChange(true, scope.$index,scope.$index - 1)"
+              :disabled="(scope.$index < 1&& !disabled)||disabledPlatformId(form.platformId)"
+            />
+
+            <!-- 向下移动 -->
+            <el-button
+              type="text"
+              icon="el-icon-caret-bottom"
+              @click="getChange(false,scope.$index, scope.$index + 1)"
+              :disabled="(scope.$index > form.programList.length-2&& !disabled)||disabledPlatformId(form.platformId)"
+            />
+
             </template>
           </el-table-column>
+
         </el-table>
       </el-form-item>
     </el-form>
     <div class="form-btn">
       <el-button @click="cancel">取消</el-button>
-      <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
+      <el-button v-if="!disabled" type="primary" @click="getSubmit"
+        >确定</el-button
+      >
     </div>
 
     <!-- 弹窗 -->
+    <!-- @change="handleCheckedTreeNodeAll($event, 'menu')" -->
     <el-dialog :visible.sync="dialogVisible" title="添加歌曲" width="1100px">
       <el-form inline size="mini" style="width: 100%">
         <el-form-item label="歌曲Id:">
-          <el-input v-model="dialogForm.id" placeholder="请输入歌曲Id" clearable />
+          <el-input
+            v-model="dialogForm.id"
+            placeholder="请输入歌曲Id"
+            clearable
+          />
         </el-form-item>
         <el-form-item label="歌曲名称:">
-          <el-input v-model="dialogForm.name" placeholder="请输入歌曲名称" clearable />
+          <el-input
+            v-model="dialogForm.name"
+            placeholder="请输入歌曲名称"
+            clearable
+          />
         </el-form-item>
         <el-form-item label="歌手名称:">
-          <el-input v-model="dialogForm.singerName" placeholder="请输入歌手名称" clearable />
+          <el-input
+            v-model="dialogForm.singerName"
+            placeholder="请输入歌手名称"
+            clearable
+          />
         </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-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-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</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-form-item>
       </el-form>
-      <el-table :data="tableData" v-loading="loading">
-        <el-table-column label="歌曲Id" prop="id" align="center" show-overflow-tooltip />
-        <el-table-column label="歌曲名称" 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="操作" align="center">
-          <template slot-scope="scope">
-            <el-button type="text" @click="getChecked(scope.row)" :disabled="disabledList(scope.row)">
-              选择
-            </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" />
-    </el-dialog>
+
+        <el-table :data="tableData" 
+        ref="multipleTable"
+        :row-key="tableKey"
+        v-loading="loading" 
+        @selection-change="handleSelectionChange">
+
+          <el-table-column
+          type="selection"
+          align="center"
+          key="selection"
+          reserve-selection
+        />
+
+          <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" />
+
+          <!-- <el-table-column label="操作" align="center">
+            <template slot-scope="scope">
+              <el-button
+                type="text"
+                @click="getChecked(scope.row)"
+                :disabled="disabledList(scope.row)"
+              >
+                选择
+              </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"
+        /></p
+    ></el-dialog>
   </div>
 </template>
 
 <script>
-import { submit, detail } from '@/api/music/menu'
-import { list } from '@/api/music/list'
-import { platformMixin, onOrOffMixin, payTypeMixin } from '@/mixin/index'
-import Audio from '@/components/Audio/index.vue'
+import { list } from "@/api/music/list";
+import { detail, submit } from "@/api/music/menu";
+import Audio from "@/components/Audio/index.vue";
+import { onOrOffMixin, payTypeMixin, platformMixin } from "@/mixin/index";
 export default {
+  // name:"musicMenuDetail",
   mixins: [platformMixin, onOrOffMixin, payTypeMixin],
   components: {
-    Audio
+    Audio,
   },
   data() {
     // 判断原价是否大于折扣价
     var checkPrice = (rule, value, callback) => {
       if (!value) {
-        callback(new Error('请输入原价'))
+        callback(new Error("请输入原价"));
       } else {
         if (this.form.discount && value <= this.form.discount) {
-          callback(new Error('原价必须大于折扣价'))
+          callback(new Error("原价必须大于折扣价"));
         }
-        callback()
+        callback();
       }
-    }
+    };
     // 判断折扣价是否小于原价
     var checkDiscount = (rule, value, callback) => {
       if (this.form.price && value >= this.form.price) {
-        callback(new Error('折扣价必须小于原价'))
+        callback(new Error("折扣价必须小于原价"));
       } else {
-        callback()
+        callback();
       }
-    }
+    };
     return {
       // 遮罩层
       loading: false,
@@ -138,37 +296,73 @@ export default {
         programList: [], // 歌曲列表
         status: 1,
         type: 2,
-        payType: 1
+        payType: 1,
       },
+
       // 校验
       rules: {
-        name: [{
-          required: true, message: '请输入歌单名称', trigger: 'blur'
-        }],
-        description: [{
-          required: true, message: '请输入歌单介绍', trigger: 'blur'
-        }],
-        avatarNickName: [{
-          required: true, message: '请输入歌单创建者名称', trigger: 'blur'
-        }],
-        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'
-        }],
-        avatarNickHead: [{
-          required: true, message: '请上传创建者头像', trigger: 'change'
-        }]
+        name: [
+          {
+            required: true,
+            message: "请输入歌单名称",
+            trigger: "blur",
+          },
+        ],
+        description: [
+          {
+            required: true,
+            message: "请输入歌单介绍",
+            trigger: "blur",
+          },
+        ],
+        avatarNickName: [
+          {
+            required: true,
+            message: "请输入歌单创建者名称",
+            trigger: "blur",
+          },
+        ],
+        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",
+          },
+        ],
+        avatarNickHead: [
+          {
+            required: true,
+            message: "请上传创建者头像",
+            trigger: "change",
+          },
+        ],
       },
       // 弹窗
       dialogVisible: false,
@@ -177,8 +371,9 @@ export default {
         pageNum: 1,
         pageSize: 10,
         status: 1,
-        platformId: null
+        platformId: null,
       },
+
       // 总数据
       total: 0,
       // 弹窗列表
@@ -186,58 +381,201 @@ export default {
       // 只读
       disabled: false,
       // 是否已选
-      disabledChecked: false
-    }
+      disabledChecked: false,
+      ///被选中数据是否加载完
+      isLoad: false,
+      ///是否可以调整顺序
+      canOrder: true,
+    };
   },
   mounted() {
     // 获取资源平台
     this.getPlatform({
-      audioType: 10
-    })
+      audioType: 10,
+    });
     if (this.$route.query.id) {
-      this.form.id = this.$route.query.id
-      this.disabled = Boolean(this.$route.query.disabled)
-      this.getDetail()
+      this.form.id = this.$route.query.id;
+      this.disabled = Boolean(this.$route.query.disabled);
+      this.getDetail();
     }
   },
   methods: {
+    // 排序
+    getChange(top, index, laterIndex) {
+      var row = this.form.programList[index];
+      var laterRow = this.form.programList[laterIndex];
+      if (top) {
+        this.form.programList[index] = laterRow;
+        this.form.programList[laterIndex] = row;
+      } else {
+        this.form.programList[laterIndex] = row;
+        this.form.programList[index] = laterRow;
+      }
+      this.form.programList = this.form.programList.filter((i) => i);
+    },
+
+    tableKey(row) {
+      return row.id;
+    },
+
+    handleSelectionChange(val) {
+      // if (this.isLoad) {
+      //   this.form.programList = JSON.parse(JSON.stringify(val));
+      //   this.form.programList = this.form.programList.filter((i) => i);
+      //   this.$message.success("操作成功!");
+      // }
+
+      if (this.isLoad) {
+        if (this.form.programList.length == 0) {
+          this.form.programList = JSON.parse(JSON.stringify(val));
+        } else {
+          ///查找dialogTableData里面有的
+          var tempDialogHas = [];
+          for (var i = 0; i < this.tableData.length; i++) {
+            for (var j = 0; j < val.length; j++) {
+              if (this.tableData[i].id === val[j].id) {
+                tempDialogHas.push(this.tableData[i]);
+                break;
+              }
+            }
+          }
+
+          ///查找dialogTableData里面没有的
+          var tempDialogNot = [];
+          if (tempDialogHas.length == 0) {
+            tempDialogNot = JSON.parse(JSON.stringify(this.tableData));
+          } else {
+            for (var i = 0; i < this.tableData.length; i++) {
+              var has = false;
+              for (var j = 0; j < tempDialogHas.length; j++) {
+                if (this.tableData[i].id === tempDialogHas[j].id) {
+                  has = true;
+                  break;
+                }
+              }
+              if (!has) {
+                tempDialogNot.push(this.tableData[i]);
+              }
+            }
+          }
+
+          ///减少val没有的
+          if (tempDialogNot.length > 0) {
+            for (var i = 0; i < tempDialogNot.length; i++) {
+              for (var j = 0; j < this.form.programList.length; j++) {
+                if (tempDialogNot[i].id === this.form.programList[j].id) {
+                  this.form.programList.splice(j, 1);
+                  break;
+                }
+              }
+            }
+          }
+
+          ///添加adminPodCastProgramDetailResp没有的
+          for (var i = 0; i < val.length; i++) {
+            var isHas = false;
+            for (var j = 0; j < this.form.programList.length; j++) {
+              if (val[i].id === this.form.programList[j].id) {
+                isHas = true;
+                break;
+              }
+            }
+            if (!isHas) {
+              this.form.programList.push(val[i]);
+            }
+          }
+        }
+        this.form.programList = this.form.programList.filter((i) => i);
+        this.$message.success("操作成功!");
+      }
+    },
+
     // 详情
+    // platformId:7 HIFIVE音加加
     getDetail() {
-      detail(this.form.id).then(res => {
+      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 = res.data;
+          ///qq音乐和喜马拉雅
+          if (this.form.platformId == 6 || this.form.platformId == 12) {
+            this.canOrder = false;
+          }
+          this.form.programList =
+            res.data.programList === null ? [] : res.data.programList;
         }
-      })
+      });
     },
     // 上传
     upload(e, key) {
-      this.form[key] = e.file
+      this.form[key] = e.file;
     },
 
     // 添加歌曲
     getDialog() {
-      this.dialogVisible = true
-      this.dialogForm.platformId = this.platformOptions.filter(i => !i.joinType.includes('1'))[0].value
-      this.getList()
+      this.dialogVisible = true;
+      this.dialogForm.platformId = this.platformOptions.filter(
+        (i) => !i.joinType.includes("1")
+      )[0].value;
+      this.getList();
     },
 
     // 列表
     getList() {
-      this.loading = true
-      list(this.dialogForm).then(res => {
+      this.loading = true;
+      list(this.dialogForm).then((res) => {
         if (res.code === 0) {
-          this.tableData = res.data.records
-          this.total = res.data.total
-          this.loading = false
+          this.tableData = res.data.records;
+          this.total = res.data.total;
+          this.loading = false;
+
+          // this.isLoad = false;
+          // if (this.form.programList.length > 0) {
+          //   var temp = [];
+          //   for (var i = 0; i < this.tableData.length; i++) {
+          //     for (var j = 0; j < this.form.programList.length; j++) {
+          //       if (this.form.programList[j].id === this.tableData[i].id) {
+          //         temp.push(this.tableData[i]);
+          //         break;
+          //       }
+          //     }
+          //   }
+
+          //   if (temp.length > 0) {
+          //     temp.forEach((item) => {
+          //       this.$refs.multipleTable.toggleRowSelection(item, true);
+          //     });
+          //   }
+          // }
+          // this.isLoad = true;
+
+          this.isLoad = false;
+          this.$refs.multipleTable.clearSelection();
+          if (this.form.programList.length > 0) {
+            var temp = [];
+            for (var i = 0; i < this.tableData.length; i++) {
+              for (var j = 0; j < this.form.programList.length; j++) {
+                if (this.form.programList[j].id === this.tableData[i].id) {
+                  temp.push(this.tableData[i]);
+                  break;
+                }
+              }
+            }
+
+            if (temp.length > 0) {
+              temp.forEach((item) => {
+                this.$refs.multipleTable.toggleRowSelection(item, true);
+              });
+            }
+          }
+          this.isLoad = true;
         }
-      })
+      });
     },
 
     // 搜索
     getSearch() {
-      this.dialogForm.pageNum = 1
-      this.getList()
+      this.dialogForm.pageNum = 1;
+      this.getList();
     },
 
     // 重置
@@ -246,9 +584,9 @@ export default {
         pageNum: 1,
         pageSize: 10,
         status: 1,
-        platformId: this.platformOptions[0].value
-      }
-      this.getList()
+        platformId: this.platformOptions[0].value,
+      };
+      this.getList();
     },
 
     // 选择
@@ -259,35 +597,35 @@ export default {
         singerName: row.singerName,
         playTime: row.playTime,
         status: row.status,
-        progaramUrl: row.progaramUrl
-      })
-      this.$message.success('添加成功!')
+        progaramUrl: row.progaramUrl,
+      });
+      this.$message.success("添加成功!");
     },
 
     // 删除已选歌曲
     getDelete(index) {
-      this.form.programList.splice(index, 1)
+      this.form.programList.splice(index, 1);
     },
 
     // 确定
     getSubmit() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          let arr = []
-          this.form.programList.map(i => {
-            arr.push(i.id)
-          })
-          this.form.programList = arr
-          submit(this.form).then(res => {
+          let arr = [];
+          this.form.programList.map((i) => {
+            arr.push(i.id);
+          });
+          this.form.programList = arr;
+          submit(this.form).then((res) => {
             if (res.code === 0) {
-              this.$message.success(`提交成功!`)
-              this.cancel()
+              this.$message.success(`提交成功!`);
+              this.cancel();
             }
-          })
+          });
         } else {
-          return false
+          return false;
         }
-      })
+      });
     },
 
     // 取消
@@ -297,17 +635,29 @@ export default {
 
     // 字典翻译
     statusFormatter(row) {
-      return this.selectDictLabel(this.onOrOffOptions, row.status)
+      return this.selectDictLabel(this.onOrOffOptions, row.status);
+    },
+
+    // 已有的歌曲不可重复选择
+    disabledTableData(row) {
+      if (this.tableData.length > 0) {
+        return this.tableData.findIndex((i) => i.id === row.id) === -1
+          ? false
+          : true;
+      }
     },
 
     // 已有的歌曲不可重复选择
     disabledList(row) {
       if (this.form.programList.length > 0) {
-        return this.form.programList.findIndex(i => i.id === row.id) === -1 ? false : true
+        return this.form.programList.findIndex((i) => i.id === row.id) === -1
+          ? false
+          : true;
       }
-    }
-  }
-}
+      return false;
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>

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

@@ -189,6 +189,7 @@ import { change, list, remove } from "@/api/music/menu";
 import { onOrOffMixin, payTypeMixin, platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicMenu",
   mixins: [platformMixin, onOrOffMixin, payTypeMixin],
   data() {
     return {

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

@@ -1,3 +1,5 @@
+ <!-- 音频管理 异常监控 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -72,6 +74,7 @@
 import { platformMixin, audioMixin } from '@/mixin/index'
 import { list, detail } from '@/api/music/monitor'
 export default {
+  name:"MusicMonitor",
   mixins: [platformMixin, audioMixin],
   data() {
     return {

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

@@ -112,6 +112,7 @@ import { detail, list, remove, submit } from "@/api/music/platform";
 import { audioMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicPlatform",
   mixins: [audioMixin],
   data() {
     return {

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

@@ -55,10 +55,11 @@
 </template>
 
 <script>
-import { submit, detail } from '@/api/music/program'
-import { platformMixin, isFreeMixin } from '@/mixin/index'
+import { detail, submit } from '@/api/music/program';
 import Dialog from '@/components/Dialog';
+import { isFreeMixin, platformMixin } from '@/mixin/index';
 export default {
+  // name:"musicProgramDetail",
   mixins: [platformMixin, isFreeMixin],
   components: { Dialog },
   data() {
@@ -185,7 +186,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/music/program");
+      this.$tab.closeOpenPage("/music/musicProgram");
     },
   },
 };

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

@@ -178,6 +178,7 @@ import Audio from "@/components/Audio/index.vue";
 import { isFreeMixin, onOrOffMixin, platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicProgram",
   mixins: [platformMixin, onOrOffMixin, isFreeMixin],
   components: {
     Audio,

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

@@ -48,9 +48,10 @@
 </template>
 
 <script>
-import { submit, detail } from '@/api/music/radio'
-import { platformMixin, addressMixin, mapMixin, contentMixin } from '@/mixin/index'
+import { detail, submit } from '@/api/music/radio';
+import { addressMixin, contentMixin, mapMixin, platformMixin } from '@/mixin/index';
 export default {
+  // name:"musicRadioDetail",
   mixins: [platformMixin, addressMixin, mapMixin, contentMixin],
   data() {
     return {
@@ -145,7 +146,7 @@ export default {
     },
     // 取消
     cancel() {
-      this.$tab.closeOpenPage('/music/radio')
+      this.$tab.closeOpenPage('/music/musicRadio')
     }
   }
 };

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

@@ -210,6 +210,7 @@ platformMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicRadio",
   mixins: [platformMixin, onOrOffMixin, addressMixin, contentMixin, mapMixin],
   components: {
     Audio,

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

@@ -93,6 +93,7 @@ import { detail, list, remove, submit } from "@/api/music/radioclass";
 import { platformMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicRadioClass",
   mixins: [platformMixin],
   data() {
     return {

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

@@ -38,8 +38,9 @@
 
 <script>
 import { detail, submit } from '@/api/music/singer'
-import { sexMixin, regionMixin, platformMixin } from '@/mixin/index'
+import { platformMixin, regionMixin, sexMixin } from '@/mixin/index'
 export default {
+  // name:"musicSingerDetail",
   mixins: [sexMixin, regionMixin, platformMixin],
   data() {
     return {
@@ -115,7 +116,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/music/singer");
+      this.$tab.closeOpenPage("/music/musicSinger");
     }
   }
 }

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

@@ -168,6 +168,7 @@ sexMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"MusicSinger",
   mixins: [platformMixin, sexMixin, regionMixin, onOrOffMixin],
   data() {
     return {

+ 3 - 0
src/views/ohplay/content/index.vue

@@ -1,3 +1,5 @@
+<!-- 猫舍管理 内容列表 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -177,6 +179,7 @@
 import { list, detail, showOrHide, recommend, commentShowOrHide, } from '@/api/ohplay/content'
 import { classifyMixin, typeMixin } from '../mixin/index'
 export default {
+  name:"OhplayContent",
   mixins: [classifyMixin, typeMixin],
   data() {
     return {

+ 3 - 0
src/views/ohplay/operation/index.vue

@@ -1,3 +1,5 @@
+<!-- 猫舍管理 运营管理 -->
+
 <template>
   <div class="app-container">
     <div style="width: 400px">
@@ -83,6 +85,7 @@
 import { create, edit, list, remove } from "@/api/ohplay/operation";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OhplayOperation",
   data() {
     return {
       img: [

+ 3 - 0
src/views/ohplay/programa/index.vue

@@ -1,3 +1,5 @@
+<!-- 猫舍管理 栏目管理 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -51,6 +53,7 @@
 <script>
 import { list, create, edit, detail } from '@/api/ohplay/programa'
 export default {
+  name:"OhplayPrograma",
   data() {
     return {
       // 遮罩层

+ 3 - 0
src/views/ohplay/recommend/index.vue

@@ -1,3 +1,5 @@
+  <!-- 猫舍管理 内容推荐 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -146,6 +148,7 @@ import { list, remove } from '@/api/ohplay/recommend'
 import { detail, showOrHide, commentShowOrHide } from '@/api/ohplay/content'
 import { classifyMixin, typeMixin } from '../mixin/index'
 export default {
+  name:"OhplayRecommend",
   mixins: [classifyMixin, typeMixin],
   data() {
     return {

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

@@ -175,6 +175,7 @@
 import { detail, goodList, submit } from "@/api/operation/activity";
 import { devMixin, serviceTimeMixin } from "@/mixin/index";
 export default {
+  // name:"operationActivityDetail",
   mixins: [serviceTimeMixin, devMixin],
 
   data() {
@@ -361,7 +362,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/activity");
+      this.$tab.closeOpenPage("/operation/operationActivity");
     },
 
     // 确定
@@ -408,4 +409,4 @@ export default {
     width: 100%;
   }
 }
-</style>
+</style>

+ 3 - 3
src/views/operation/activity/index.vue

@@ -203,7 +203,7 @@
         </el-form-item>
       </el-form>
       <div slot="footer">
-        <el-button @click="getDialogClose">取消</el-button>
+        <el-button @click="getDialog()">取消</el-button>
         <el-button type="primary" @click="getDialogSubmit">确定</el-button>
       </div>
     </el-dialog>
@@ -220,6 +220,7 @@ import {
 import { currentMixin, devMixin, disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationActivity",
   mixins: [devMixin, currentMixin, disabledMixin],
   data() {
     return {
@@ -272,7 +273,6 @@ export default {
     // 提交分类表单
     getDialogSubmit() {
       var iccid = this.dialogData.iccid;
-      console.log("sdafdsfwerqrwqr==00==" + iccid);
       if (iccid == null || iccid == "") {
         this.$message.success("ICCID号不能为空");
         return;
@@ -283,13 +283,13 @@ export default {
         this.$message.success("关联活动ID不能为空");
         return;
       }
+
       var deviceId = this.dialogData.deviceId;
       if (deviceId == null || deviceId == "") {
         this.$message.success("设备型号不能为空");
         return;
       }
 
-      
       var param = {
         iccid: iccid,
         activityId: activityId,

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

@@ -21,9 +21,10 @@
 </template>
 
 <script>
+import { detail, submit } from '@/api/operation/agreement';
 import Editor from "@/components/Editor/index";
-import { submit, detail } from '@/api/operation/agreement'
 export default {
+  // name:"operationAgreementDetail",
   components: {
     Editor
   },
@@ -105,7 +106,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage('/operation/agreement')
+      this.$tab.closeOpenPage('/operation/operationAgreement')
     },
     // 提交
     getSubmit() {

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

@@ -56,6 +56,7 @@
 import { list, remove } from "@/api/operation/agreement";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationAgreement",
   data() {
     return {
       // 遮罩层

+ 110 - 1
src/views/operation/channel/detail.vue

@@ -105,6 +105,44 @@
             align="center"
             :formatter="statusFormatter"
           />
+
+          <!-- ///排序 -->
+
+          <el-table-column label="序号" align="center">
+            <template slot-scope="scope">
+              <div v-if="editData.currentEditIndex !== scope.$index">
+                <span style="margin-right: 8px">
+                  {{ scope.row.indexNum }}
+                  <!-- {{ scope.$index + 1 }} -->
+                  <!-- {{ scope.row.sort || "" }} -->
+                </span>
+
+                <svg-icon
+                  v-if="!disabled && !isRead"
+                  icon-class="edit"
+                  @click.native="handleEditClick(scope.row, scope.$index)"
+                />
+              </div>
+
+              <!-- ref="numberInput" -->
+              <!-- :ref="(el) => (inputRefs[scope.$index] = el)" -->
+              <el-input
+                v-else
+                v-model="scope.row.indexNum"
+                size="mini"
+                style="width: 60px"
+                type="number"
+                @blur="onNumberBlur(scope.row, scope.$index)"
+                @input="handleInput"
+                @keyup.enter.native="onNumberBlurEnter(scope.row, scope.$index)"
+                placeholder="序号"
+                ref="numberInput"
+              />
+            </template>
+          </el-table-column>
+
+          <!-- ///排序 -->
+
           <el-table-column label="操作" align="center">
             <template slot-scope="scope">
               <el-button type="delete" @click="getDelete(scope.row)"
@@ -149,12 +187,17 @@ import { channelDetail, edit } from "@/api/operation/channel";
 import Dialog from "@/components/Dialog/index.vue";
 import { disabledMixin, isFreeMixin, platformMixin } from "@/mixin/index";
 export default {
+  // name: "operationChannelDetail",
   mixins: [platformMixin, isFreeMixin, disabledMixin],
   components: {
     Dialog,
   },
   data() {
     return {
+      editData: {
+        currentEditIndex: -1,
+        currentEditSort: 1,
+      },
       // 遮罩层
       loading: false,
       // 弹窗
@@ -180,12 +223,72 @@ export default {
   },
 
   methods: {
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      if (this.disabled || this.isRead) {
+        return;
+      }
+
+      this.editData.currentEditIndex = index;
+      this.editData.currentEditSort = row.indexNum;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+        this.$refs.numberInput.select();
+      });
+    },
+
+    handleInput(value) {
+      this.form.list[this.editData.currentEditIndex].indexNum = value;
+      this.form.list = this.form.list.filter((i) => i);
+    },
+
+    onNumberBlurEnter(row, index) {
+      this.editData.currentEditIndex = -1;
+    },
+
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+      var newSort = row.indexNum;
+
+      if (newSort === "") {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号不能为空");
+        return;
+      }
+
+      if (newSort <= 0) {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号必须大于0");
+        return;
+      }
+
+      if (newSort === this.editData.currentEditSort) {
+        this.editData.currentEditIndex = -1;
+        return;
+      }
+
+      ///删除第index个元素
+      this.form.list.splice(index, 1);
+      this.form.list.splice(newSort - 1, 0, row);
+
+      for (var i = 0; i < this.form.list.length; i++) {
+        this.form.list[i].indexNum = i + 1;
+      }
+      this.form.list = this.form.list.filter((i) => i);
+      this.editData.currentEditIndex = -1;
+    },
+
     // 排序
     getChangeSort(row, sort) {
       const rowBean = this.form.list[row];
       const sortBean = this.form.list[sort];
       this.form.list[row] = sortBean;
       this.form.list[sort] = rowBean;
+
+      for (var i = 0; i < this.form.list.length; i++) {
+        this.form.list[i].indexNum = i + 1;
+      }
+
       this.form.list = this.form.list.filter((i) => i);
 
       // this.form.audioList = [];
@@ -210,6 +313,12 @@ export default {
       }).then((res) => {
         if (res.code === 0) {
           this.form = res.data;
+          if (this.form.list) {
+            for (var i = 0; i < this.form.list.length; i++) {
+              this.form.list[i].indexNum = i + 1;
+            }
+            this.form.list = this.form.list.filter((i) => i);
+          }
         }
       });
     },
@@ -258,7 +367,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/channel");
+      this.$tab.closeOpenPage("/operation/operationChannel");
     },
 
     // 除了2频道都不可以选猫王精选电台

+ 83 - 3
src/views/operation/channel/index.vue

@@ -1,4 +1,5 @@
-<!-- 定制频道-->
+<!-- 运营管理 定制频道-->
+
 <template>
   <div class="app-container">
     <!-- 新增 -->
@@ -28,6 +29,7 @@
         :formatter="devFormatter"
         show-overflow-tooltip
       />
+
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
           <el-button
@@ -174,9 +176,13 @@ page,
 } from "@/api/operation/channel";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
-  name: "Channel",
+  name: "OperationChannel",
   data() {
     return {
+      editData: {
+        currentEditIndex: -1,
+        currentEditSort: 1,
+      },
       // 遮罩层
       loading: false,
       dialog_loading: false,
@@ -229,7 +235,11 @@ export default {
       this.loading = true;
       page(this.form).then((res) => {
         if (res.code === 0) {
-          this.tableData = res.data;
+          var data = res.data;
+          for (var i = 0; i < data.length; i++) {
+            data[i].indexNum = i + 1;
+          }
+          this.tableData = data;
           this.loading = false;
         }
       });
@@ -344,6 +354,76 @@ export default {
       }
     },
 
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      this.editData.currentEditIndex = index;
+      this.editData.currentEditSort = row.indexNum;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+      });
+    },
+
+    onNumberBlurEnter(row, index) {
+      this.editData.currentEditIndex = -1;
+    },
+
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+      var newSort = row.indexNum;
+
+      if (newSort === "") {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号不能为空");
+        return;
+      }
+
+      if (newSort <= 0) {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号必须大于0");
+        return;
+      }
+
+      if (newSort === this.editData.currentEditSort) {
+        this.editData.currentEditIndex = -1;
+        return;
+      }
+
+      ///删除第index个元素
+
+      this.tableData.splice(index, 1);
+      this.tableData.splice(newSort - 1, 0, row);
+
+      for (var i = 0; i < this.tableData.length; i++) {
+        this.tableData[i].indexNum = i + 1;
+      }
+      this.editData.currentEditIndex = -1;
+
+      // 检查序号是否重复
+      // const isDuplicate = this.tableData.some(
+      //   (item, i) => i !== index && item.sortIndex === newSort
+      // );
+
+      // if (isDuplicate) {
+      //   this.$message.warning("序号已存在");
+      // } else {
+      //   // 更新到tableData
+      //   this.$set(this.tableData, index, {
+      //     ...row,
+      //     sortIndex: newSort,
+      //   });
+      //   console.log(
+      //     "序号修改成功:",
+      //     newSort,
+      //     "row.sortIndex",
+      //     row.sortIndex,
+      //     "this.tableData",
+      //     this.tableData[index].sortIndex
+      //   );
+      // 隐藏编辑框
+      //   this.editData.currentEditIndex = -1;
+      // }
+    },
+
     // 排序
     getChange(id, sort) {
       change({

+ 108 - 1
src/views/operation/channels/detail.vue

@@ -103,6 +103,41 @@
             align="center"
             :formatter="statusFormatter"
           />
+
+          <!-- ///排序 -->
+
+          <el-table-column label="序号" align="center">
+            <template slot-scope="scope">
+              <div v-if="editData.currentEditIndex !== scope.$index">
+                <span style="margin-right: 8px">
+                  {{ scope.row.indexNum }}
+                  <!-- {{ scope.$index + 1 }} -->
+                  <!-- {{ scope.row.sort || "" }} -->
+                </span>
+                <svg-icon
+                  v-if="!isRead"
+                  icon-class="edit"
+                  @click.native="handleEditClick(scope.row, scope.$index)"
+                />
+              </div>
+
+              <el-input
+                v-else
+                v-model="scope.row.indexNum"
+                size="mini"
+                style="width: 60px"
+                type="number"
+                @blur="onNumberBlur(scope.row, scope.$index)"
+                @input="handleInput"f s s s s
+                @keyup.enter.native="onNumberBlurEnter(scope.row, scope.$index)"
+                placeholder="序号"
+                ref="numberInput"
+              />
+            </template>
+          </el-table-column>
+
+          <!-- ///排序 -->
+
           <el-table-column label="操作" align="center">
             <template slot-scope="scope">
               <el-button type="delete" @click="getDelete(scope.row)"
@@ -148,12 +183,17 @@ import { channelDetail, channeledit } from "@/api/operation/channels";
 import Dialog from "@/components/Dialog/index.vue";
 import { disabledMixin, isFreeMixin, platformMixin } from "@/mixin/index";
 export default {
+  // name: "operationChannelsDetail",
   mixins: [platformMixin, isFreeMixin, disabledMixin],
   components: {
     Dialog,
   },
   data() {
     return {
+      editData: {
+        currentEditIndex: -1,
+        currentEditSort: 1,
+      },
       // 遮罩层
       loading: false,
       // 弹窗
@@ -173,13 +213,74 @@ export default {
     this.getDetail();
     this.getPlatform({});
   },
+
   methods: {
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      if (this.isRead) {
+        return;
+      }
+
+      this.editData.currentEditIndex = index;
+      this.editData.currentEditSort = row.indexNum;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+        this.$refs.numberInput.select();
+      });
+    },
+
+    handleInput(value) {
+      this.form.list[this.editData.currentEditIndex].indexNum = value;
+      this.form.list = this.form.list.filter((i) => i);
+    },
+
+    onNumberBlurEnter(row, index) {
+      this.editData.currentEditIndex = -1;
+    },
+
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+      var newSort = row.indexNum;
+
+      if (newSort === "") {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号不能为空");
+        return;
+      }
+
+      if (newSort <= 0) {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号必须大于0");
+        return;
+      }
+
+      if (newSort === this.editData.currentEditSort) {
+        this.editData.currentEditIndex = -1;
+        return;
+      }
+
+      ///删除第index个元素
+      this.form.list.splice(index, 1);
+      this.form.list.splice(newSort - 1, 0, row);
+
+      for (var i = 0; i < this.form.list.length; i++) {
+        this.form.list[i].indexNum = i + 1;
+      }
+      this.form.list = this.form.list.filter((i) => i);
+      this.editData.currentEditIndex = -1;
+    },
+
     // 排序
     getChangeSort(row, sort) {
       const rowBean = this.form.list[row];
       const sortBean = this.form.list[sort];
       this.form.list[row] = sortBean;
       this.form.list[sort] = rowBean;
+
+      for (var i = 0; i < this.form.list.length; i++) {
+        this.form.list[i].indexNum = i + 1;
+      }
+
       this.form.list = this.form.list.filter((i) => i);
 
       // this.form.audioList = [];
@@ -206,6 +307,12 @@ export default {
       }).then((res) => {
         if (res.code === 0) {
           this.form = res.data;
+          if (this.form.list) {
+            for (var i = 0; i < this.form.list.length; i++) {
+              this.form.list[i].indexNum = i + 1;
+            }
+            this.form.list = this.form.list.filter((i) => i);
+          }
         }
       });
     },
@@ -254,7 +361,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/channels");
+      this.$tab.closeOpenPage("/operation/operationChannels");
     },
 
     // 字典翻译

+ 92 - 1
src/views/operation/channels/index.vue

@@ -23,6 +23,9 @@
           </span>
         </template>
       </el-table-column>
+
+      <!-- <el-table-column label="序号" align="center" prop="sort" /> -->
+
       <el-table-column label="操作" align="center">
         <template slot-scope="scope">
           <el-button type="text" @click="getDialog(scope.row, true)"
@@ -289,8 +292,13 @@ submit,
 
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "OperationChannels",
   data() {
     return {
+      editData: {
+        currentEditIndex: -1,
+        currentEditSort: 1,
+      },
       // 遮罩层
       loading: false,
       // 列表
@@ -360,7 +368,11 @@ export default {
       this.loading = true;
       list().then((res) => {
         if (res.code === 0) {
-          this.tableData = res.data;
+          var data = res.data;
+          for (var i = 0; i < data.length; i++) {
+            data[i].indexNum = i + 1;
+          }
+          this.tableData = data;
           this.loading = false;
         }
       });
@@ -381,6 +393,84 @@ export default {
       });
     },
 
+    // 点击编辑图标显示输入框
+    handleEditClick(row, index) {
+      this.editData.currentEditIndex = index;
+      this.editData.currentEditSort = row.indexNum;
+      this.$nextTick(() => {
+        this.$refs.numberInput.focus();
+      });
+    },
+
+    onNumberBlurEnter(row, index) {
+      this.editData.currentEditIndex = -1;
+    },
+
+    // 输入框失去焦点时隐藏
+    onNumberBlur(row, index) {
+      var newSort = row.indexNum;
+
+      if (newSort === "") {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号不能为空");
+        return;
+      }
+
+      if (newSort <= 0) {
+        row.indexNum = this.editData.currentEditSort;
+        this.$message.warning("序号必须大于0");
+        return;
+      }
+
+      if (newSort === this.editData.currentEditSort) {
+        this.editData.currentEditIndex = -1;
+        return;
+      }
+
+      ///删除第index个元素
+
+      this.tableData.splice(index, 1);
+      this.tableData.splice(newSort - 1, 0, row);
+
+      for (var i = 0; i < this.tableData.length; i++) {
+        this.tableData[i].indexNum = i + 1;
+      }
+      this.editData.currentEditIndex = -1;
+
+      // channeledit(this.tableData).then((res) => {
+      //   console.log("编辑成功:", JSON.stringify(res));
+      //   if (res.code === 0) {
+      //     this.$message.success("编辑成功!");
+      //     this.getList();
+      //   }
+      // });
+
+      // 检查序号是否重复
+      // const isDuplicate = this.tableData.some(
+      //   (item, i) => i !== index && item.sortIndex === newSort
+      // );
+
+      // if (isDuplicate) {
+      //   this.$message.warning("序号已存在");
+      // } else {
+      //   // 更新到tableData
+      //   this.$set(this.tableData, index, {
+      //     ...row,
+      //     sortIndex: newSort,
+      //   });
+      //   console.log(
+      //     "序号修改成功:",
+      //     newSort,
+      //     "row.sortIndex",
+      //     row.sortIndex,
+      //     "this.tableData",
+      //     this.tableData[index].sortIndex
+      //   );
+      // 隐藏编辑框
+      //   this.editData.currentEditIndex = -1;
+      // }
+    },
+
     // 弹窗
     async getDialog(row, boolean) {
       this.dialogVisible = true;
@@ -525,6 +615,7 @@ export default {
 
     // 12频道详情
     getRouter(e, boolean) {
+      this.dialogVisible = false;
       this.$router.push({
         path: `/operation/channels/detail`,
         query: {

+ 2 - 1
src/views/operation/dialog/index.vue

@@ -1,4 +1,4 @@
-<!-- 爱听弹窗 -->
+<!-- 运营管理 爱听弹窗 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -150,6 +150,7 @@ import { change, detail, devList, list, submit } from "@/api/operation/dialog";
 import { disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationDialog",
   mixins: [disabledMixin],
   data() {
     return {

+ 198 - 0
src/views/operation/explain/detail.vue

@@ -0,0 +1,198 @@
+<!-- 活动管理 说明书管理详情 -->
+<template>
+  <div class="app-container">
+    <el-form :model="form" ref="form" :rules="rules" label-width="110px">
+      <el-form-item label="说明书名称:" prop="name">
+        <el-input
+          v-model="form.name"
+          placeholder="请输入协议名称"
+          :disabled="disabled"
+        />
+      </el-form-item>
+
+      <el-form-item label="设备分类:" prop="categoryName">
+        <el-select
+          v-model="form.categoryName"
+          placeholder="请选择设备分类"
+          :disabled="disabled"
+        >
+          <el-option
+            v-for="item in categoryOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.label"
+          />
+        </el-select>
+      </el-form-item>
+
+      <!-- justify="space-between" -->
+      <el-form-item
+        v-if="form.state != 0 && codeText != ''"
+        label="二维码图片:"
+      >
+        <el-row type="flex">
+          <vue-qr :text="codeText" :size="150" />
+          <el-button
+            type="text"
+            v-clipboard:copy="codeText"
+            v-clipboard:success="copySuccess"
+            :disabled="false"
+            >复制链接</el-button
+          >
+        </el-row>
+      </el-form-item>
+
+      <el-form
+        :model="form"
+        ref="form"
+        :rules="rules"
+        label-width="110px"
+        :disabled="disabled"
+      >
+        <el-form-item label="说明书文件:" prop="fileUrl">
+          <el-row type="flex" justify="space-between">
+            <el-col :span="16">
+              <el-input
+                v-model="form.fileUrl"
+                placeholder="请输入或上传下载路径"
+              />
+            </el-col>
+            <el-col :span="6">
+              <Upload @upload="upload" style="float: right" />
+            </el-col>
+          </el-row>
+        </el-form-item>
+      </el-form>
+    </el-form>
+
+    <div class="form-btn">
+      <el-button @click="cancel">取消</el-button>
+      <el-button v-if="!disabled" type="primary" @click="getSubmit"
+        >确定
+      </el-button>
+    </div>
+  </div>
+</template>
+
+
+<script>
+import { add, detail, edit } from "@/api/operation/explain";
+import { devCategoryMixin, devTypeMixin } from "@/mixin/index";
+
+import VueQr from "vue-qr";
+
+export default {
+  // name:"operationExplainDetail",
+  components: {
+    VueQr,
+  },
+  mixins: [devTypeMixin, devCategoryMixin],
+  data() {
+    return {
+      codeText: "",
+      // 表单
+      form: {
+        state: 0,
+        fileUrl: "",
+      },
+      // 只读
+      disabled: false,
+      // 是否强制
+      typeOptions: [
+        {
+          value: 0,
+          label: "否",
+        },
+        {
+          value: 1,
+          label: "是",
+        },
+      ],
+      // 校验
+      rules: {
+        name: [{ required: true, message: "请输入协议名称", trigger: "blur" }],
+        categoryName: [
+          { required: true, message: "请选择设备类型", trigger: "change" },
+        ],
+        fileUrl: [
+          { required: true, message: "请上传下载路径", trigger: "blur" },
+        ],
+      },
+    };
+  },
+
+  mounted() {
+    this.form.id = this.$route.query.id;
+    this.form.state = this.$route.query.state;
+    this.disabled = Boolean(this.$route.query.boolean == 1);
+    this.getCateGory(1);
+    this.getDetail();
+  },
+
+  methods: {
+    // 详情
+    getDetail() {
+      if (this.form.state != 0) {
+        detail(this.form.id).then((res) => {
+          if (res.code === 0) {
+            this.form = res.data;
+
+            this.codeText =
+              this.form.copyUrl + "pages/explain/index?id=" + this.form.id;
+          }
+        });
+      }
+    },
+
+    // 复制成功
+    copySuccess() {
+      this.$message.success("复制成功!");
+    },
+
+    // 上传
+    upload(e) {
+      this.form.fileUrl = e.file;
+    },
+
+    // 取消
+    cancel() {
+      this.$tab.closeOpenPage("/operation/operationExplain");
+      // this.$router.go(-1);
+    },
+
+    // 确定
+    getSubmit() {
+      if (this.categoryOptions) {
+        for (var i = 0; i < this.categoryOptions.length; i++) {
+          if (this.form.categoryName === this.categoryOptions[i].label) {
+            this.form.categoryId = this.categoryOptions[i].value;
+            break;
+          }
+        }
+      }
+
+      if (this.$route.query.state == 0) {
+        add(this.form).then((res) => {
+          if (res.code === 0) {
+            this.$message.success("添加成功!");
+            this.cancel();
+          }
+        });
+      } else {
+        edit(this.form).then((res) => {
+          if (res.code === 0) {
+            this.$message.success("修改成功!");
+            this.cancel();
+          }
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-form {
+  width: 500px;
+}
+</style>

+ 143 - 0
src/views/operation/explain/index.vue

@@ -0,0 +1,143 @@
+<!-- 运营管理 说明书管理 -->
+<template>
+  <div class="app-container">
+    <!-- 搜索 -->
+    <el-form inline size="mini">
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          plain
+          @click="getDetail(0, 0, 0)"
+          v-hasPermi="['operation:explain:add']"
+          >新增</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <el-table-column label="序号" align="center" type="index" />
+      <el-table-column
+        label="说明书名称"
+        align="center"
+        prop="name"
+        show-overflow-tooltip
+      />
+
+      <el-table-column label="设备分类" prop="categoryName" align="center" />
+
+      <el-table-column label="更新时间" align="center" prop="updateTimeStr" />
+      <el-table-column label="创建时间" align="center" prop="createTimeStr" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <el-button
+            type="text"
+            @click="getDetail(1, 1, scope.row.id)"
+            v-hasPermi="['operation:explain:check']"
+            >查看</el-button
+          >
+
+          <span style="margin: 0 10px">
+            <el-button
+              type="text"
+              @click="getDetail(0, 2, scope.row.id)"
+              v-hasPermi="['operation:explain:edit']"
+              >编辑</el-button
+            >
+
+            <el-button
+              type="delete"
+              @click="getDelete(scope.row)"
+              v-hasPermi="['operation:explain:delete']"
+              >删除</el-button
+            >
+          </span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="form.pageNum"
+      :limit.sync="form.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { deletes, list } from "@/api/operation/explain";
+import { currentMixin, devMixin, disabledMixin } from "@/mixin/index";
+import { dialogCallBack } from "@/utils/DialogUtil";
+export default {
+  name:"OperationExplain",
+  mixins: [devMixin, currentMixin, disabledMixin],
+  data() {
+    return {
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总数据
+      total: 0,
+      // 列表
+      tableData: [],
+    };
+  },
+
+  watch: {},
+  mounted() {
+    this.getList();
+  },
+
+  methods: {
+    addData() {},
+    // 列表
+    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;
+        }
+      });
+    },
+
+    // 说明书管理详情
+    getDetail(boolean, state, id) {
+      this.$router.push({
+        path: `/operation/explain/detail`,
+        query: {
+          id: id,
+          boolean: boolean,
+          state: state,
+        },
+      });
+    },
+
+    // 删除
+    getDelete(row) {
+      var that = this;
+      dialogCallBack(that, function () {
+        that
+          .$confirm(`是否删除${row.name}?`, "提示:", {
+            type: "warning",
+          })
+          .then(() => {
+            deletes(row.id, 2).then((res) => {
+              if (res.code === 0) {
+                that.$message.success("删除成功!");
+                that.getList();
+              }
+            });
+          });
+      });
+    },
+  },
+};
+</script>

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

@@ -33,6 +33,7 @@
 <script>
 import { detail, submit } from '@/api/operation/feedbacklist'
 export default {
+  // name:"operationFeedbacklistDetail",
   data() {
     return {
       // 表单
@@ -70,7 +71,7 @@ export default {
 
     // 取消
     close() {
-      this.$tab.closeOpenPage("/operation/feedback/feedbacklist");
+      this.$tab.closeOpenPage("/operation/feedback/operationFeedbacklist");
     },
 
     // 提交

+ 2 - 0
src/views/operation/feedbacklist/index.vue

@@ -1,3 +1,4 @@
+<!-- 运营管理 反馈列表 -->
 <template>
   <div class='app-container'>
     <!-- 搜索 -->
@@ -56,6 +57,7 @@
 <script>
 import { list, typeList } from '@/api/operation/feedbacklist'
 export default {
+  name:"OperationFeedbacklist",
   data() {
     return {
       // 遮罩层

+ 1 - 0
src/views/operation/feedbacktype/index.vue

@@ -88,6 +88,7 @@
 import { detail, list, remove, submit } from "@/api/operation/feedbacktype";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationFeedbackType",
   data() {
     return {
       // 遮罩层

+ 2 - 1
src/views/operation/map/detail.vue

@@ -58,6 +58,7 @@
 import { detail, submit } from "@/api/operation/map";
 import { mapMixin } from "@/mixin/index";
 export default {
+  // name:"operationMapDetail",
   mixins: [mapMixin],
   data() {
     return {
@@ -144,7 +145,7 @@ export default {
     },
 
     cancel() {
-      this.$tab.closeOpenPage("/operation/map");
+      this.$tab.closeOpenPage("/operation/operationMap");
     },
 
     // 提交

+ 1 - 0
src/views/operation/map/index.vue

@@ -129,6 +129,7 @@ import { change, list, remove } from "@/api/operation/map";
 import { mapMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationMap",
   mixins: [mapMixin],
   data() {
     return {

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

@@ -105,6 +105,7 @@
 import { detail, list, remove, submit } from "@/api/operation/module";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationModule",
   data() {
     return {
       // 遮罩层

+ 302 - 0
src/views/operation/piano/index.vue

@@ -0,0 +1,302 @@
+<!-- 运营管理 上传壁纸 -->
+<template>
+  <div class="app-container">
+    <!-- 搜索 -->
+    <el-form inline size="mini">
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          plain
+          @click="getDialog(0, null)"
+          v-hasPermi="['operation:piano:add']"
+          >新增</el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <!-- 列表 -->
+    <el-table :data="tableData" v-loading="loading">
+      <!-- <el-table-column
+        label="排序"
+        align="center"
+        type="index"
+        show-overflow-tooltip
+      /> -->
+
+      <el-table-column label="排序" align="center" width="200px" prop="sort" />
+
+      <el-table-column label="图片" align="center" width="100px">
+        <template slot-scope="scope">
+          <el-image :src="scope.row.pic" />
+        </template>
+      </el-table-column>
+
+      <el-table-column label="创建时间" align="center" prop="createTimeStr" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="scope">
+          <span style="margin: 0 10px">
+            <el-button
+              type="text"
+              @click="getDialog(1, scope.row)"
+              v-hasPermi="['operation:piano:edit']"
+              >编辑</el-button
+            >
+
+            <el-button
+              type="delete"
+              @click="getDelete(scope.row)"
+              v-hasPermi="['operation:piano:delete']"
+              >删除</el-button
+            >
+          </span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 弹窗 -->
+    <el-dialog
+      :visible.sync="dialogVisible"
+      :title="dialogTitle"
+      width="500px"
+      :before-close="getDialogClose"
+    >
+      <el-form
+        :model="dialogData"
+        ref="dialogData"
+        :rules="rules"
+        label-width="auto"
+      >
+        <!-- listType="picture-rbg" -->
+        <el-form-item label="上传:" prop="pic">
+          <Upload
+            listType="picture-card"
+            listTypes="picture-rgb"
+            name="file"
+            width="480"
+            height="480"
+            :url="dialogData.pic"
+            @upload="uploadCode($event, 'pic')"
+          />
+        </el-form-item>
+
+        <el-form-item label="排序:" prop="sort">
+          <el-input-number v-model="dialogData.sort" :min="1" />
+        </el-form-item>
+
+        <el-form-item label="应用类型:" prop="applicationType">
+          <input type="checkbox" v-model="isChecked1" /> 小程序
+          <input
+            type="checkbox"
+            style="margin-left: 30px"
+            v-model="isChecked2"
+          />
+          APP
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer">
+        <el-button @click="getDialogClose">取消</el-button>
+        <!-- <el-button @click="getDialogClose">取消</el-button> -->
+        <el-button type="primary" @click="getDialogSubmit">确定</el-button>
+      </div>
+    </el-dialog>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="form.pageNum"
+      :limit.sync="form.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { add, deletes, edit, list } from "@/api/operation/piano";
+import { currentMixin, devMixin, disabledMixin } from "@/mixin/index";
+import { dialogCallBack } from "@/utils/DialogUtil";
+export default {
+  name:"OperationPiano",
+  mixins: [devMixin, currentMixin, disabledMixin],
+  data() {
+    return {
+      isChecked1: false,
+      isChecked2: false,
+
+      // 遮罩层
+      loading: false,
+      // 表单
+      form: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总数据
+      total: 0,
+      // 列表
+      tableData: [],
+      // 弹窗
+      dialogVisible: false,
+      dialogTitle: "新增",
+      picTemp: "",
+      dialogData: {
+        sort: 1,
+      },
+      ///弹窗类型
+      dialogStatus: 0,
+
+      // 表单验证
+      rules: {
+        pic: [{ required: true, message: "请上传图片", trigger: "change" }],
+        sort: [{ required: true, message: "请选择排序", trigger: "blur" }],
+        applicationType: [
+          { required: true, message: "请选择应用类型", trigger: "blur" },
+        ],
+      },
+    };
+  },
+
+  watch: {},
+  mounted() {
+    this.getList();
+  },
+
+  methods: {
+    addData() {},
+    // 列表
+    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;
+        }
+      });
+    },
+
+    // 弹窗
+    async getDialog(status, row) {
+      this.dialogVisible = true;
+      this.dialogStatus = status;
+      ///新增
+      if (status == 0) {
+        this.dialogData = { sort: 1 };
+      }
+      ///编辑
+      else {
+        this.dialogData = row;
+        this.picTemp = this.dialogData.pic;
+        var applicationType = this.dialogData.applicationType;
+        this.isChecked1 = false;
+        this.isChecked2 = false;
+        if (applicationType != null && applicationType != "") {
+          applicationType = applicationType.replace(/[\[\]]/g, "");
+          // 使用split按逗号分割字符串
+          let result = applicationType.split(",");
+          if (result != null && result != "" && result.length > 0) {
+            if (result.length == 2) {
+              this.isChecked1 = true;
+              this.isChecked2 = true;
+            } else {
+              if (result[0] == "0") {
+                this.isChecked1 = true;
+              } else {
+                this.isChecked2 = true;
+              }
+            }
+          } else {
+            if (applicationType == 0) {
+              this.isChecked1 = true;
+            } else if (applicationType == 1) {
+              this.isChecked2 = true;
+            }
+          }
+        }
+      }
+    },
+
+    // 删除
+    getDelete(row) {
+      var that = this;
+      dialogCallBack(that, function () {
+        that
+          .$confirm(`是否删除?`, "提示:", {
+            type: "warning",
+          })
+          .then(() => {
+            deletes(row.id, 2).then((res) => {
+              if (res.code === 0) {
+                that.$message.success("删除成功!");
+                that.getList();
+              }
+            });
+          });
+      });
+    },
+    // 取消
+    getDialogClose() {
+      this.dialogVisible = false;
+      this.dialogData = { sort: 1 };
+      // this.$refs.dialogData.resetFields();
+    },
+
+    // 上传
+    uploadCode(e) {
+      this.picTemp = e.file;
+      if (e != null && e.file != "") {
+        this.dialogData.pic = e.file;
+      }
+    },
+
+    // 提交分类表单
+    getDialogSubmit() {
+      var that = this;
+      var pic = this.picTemp;
+      // var pic = that.dialogData.pic;
+      if (pic == null || pic == "") {
+        that.$message.success("请上传图片");
+        return;
+      }
+
+      var sort = that.dialogData.sort;
+      if (sort == null || sort == "") {
+        that.$message.success("请选择排序");
+        return;
+      }
+
+      if (!that.isChecked1 && !that.isChecked2) {
+        that.$message.success("请选择应用类型");
+        return;
+      }
+
+      if (that.isChecked1 && that.isChecked2) {
+        that.dialogData.applicationType = "[0,1]";
+      } else if (that.isChecked2) {
+        that.dialogData.applicationType = "[1]";
+      } else {
+        that.dialogData.applicationType = "[0]";
+      }
+
+      ///新增
+      if (that.dialogStatus == 0) {
+        add(that.dialogData).then((res) => {
+          if (res.code === 0) {
+            that.$message.success("添加成功!");
+            that.getDialogClose();
+            that.getList();
+          }
+        });
+      } else {
+        edit(that.dialogData).then((res) => {
+          if (res.code === 0) {
+            that.$message.success("修改成功!");
+            that.getDialogClose();
+            that.getList();
+          }
+        });
+      }
+    },
+  },
+};
+</script>

Разница между файлами не показана из-за своего большого размера
+ 565 - 276
src/views/operation/recommend/detail.vue


+ 3 - 0
src/views/operation/recommend/index.vue

@@ -232,6 +232,7 @@
           align="center"
           show-overflow-tooltip
         />
+
         <el-table-column label="操作" align="center">
           <template slot-scope="scope">
             <el-button type="text" @click="getDetail(scope.row, true)"
@@ -264,6 +265,7 @@ typeList,
 } from "@/api/operation/recommend";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name: "OperationRecommend",
   data() {
     return {
       // 遮罩层
@@ -425,6 +427,7 @@ export default {
 
     // 详情页
     getDetail(row, boolean) {
+      this.dialogVisible_list = false;
       this.$router.push({
         path: `/operation/homePage/recommend/detail`,
         query:

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

@@ -71,9 +71,10 @@
 </template>
 
 <script>
-import { detail, edit, detailList, change, menuDetail, editMenu } from '@/api/operation/scene'
+import { change, detail, detailList, edit, editMenu, menuDetail } from '@/api/operation/scene'
 import { disabledMixin } from '@/mixin/index'
 export default {
+  // name:"operationSceneDetail",
   mixins: [disabledMixin],
   data() {
     return {
@@ -133,7 +134,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage('/operation/scene')
+      this.$tab.closeOpenPage('/operation/operationScene')
     },
 
     // 专区列表

+ 2 - 1
src/views/operation/scene/index.vue

@@ -1,4 +1,4 @@
-<!-- 场景专区 -->
+<!-- 运营管理 场景专区 -->
 <template>
   <div class="app-container">
     <!-- 列表 -->
@@ -60,6 +60,7 @@ import { change, list } from "@/api/operation/scene";
 import { disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationScene",
   mixins: [disabledMixin],
   data() {
     return {

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

@@ -1,3 +1,5 @@
+ <!-- 运营管理 场景时间 -->
+
 <template>
   <div class="app-container">
     <el-button
@@ -95,6 +97,7 @@
 import { change, detail, list, submit } from "@/api/operation/sceneTime";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationSceneTime",
   data() {
     return {
       // 遮罩层

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

@@ -39,8 +39,9 @@
 </template>
 
 <script>
-import { submit, detail, edit, checked } from '@/api/operation/startPage'
+import { checked, detail, edit, submit } from '@/api/operation/startPage'
 export default {
+  // name:"operationStartPageDetail",
   data() {
     return {
       // 表单
@@ -202,7 +203,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/startPage");
+      this.$tab.closeOpenPage("/operation/operationStartPage");
     },
   },
 }

+ 1 - 0
src/views/operation/startPage/index.vue

@@ -102,6 +102,7 @@ import { page, remove } from "@/api/operation/startPage";
 import { currentMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationStartPage",
   mixins: [currentMixin],
   data() {
     return {

+ 2 - 1
src/views/operation/tag/detail.vue

@@ -72,6 +72,7 @@ import { detail, submitThree } from '@/api/operation/tag';
 import Dialog from '@/components/Dialog/index.vue';
 import { audioMixin, disabledMixin, isFreeMixin, platformMixin } from '@/mixin/index';
 export default {
+  // name:"operationTagDetail",
   components: {
     Dialog
   },
@@ -162,7 +163,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/tag");
+      this.$tab.closeOpenPage("/operation/operationTag");
     },
 
     // 确定

+ 2 - 1
src/views/operation/tag/index.vue

@@ -1,4 +1,4 @@
-<!-- 标签分类 -->
+<!-- 运营管理 标签分类 -->
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -182,6 +182,7 @@ submitSecond,
 import { disabledMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationTag",
   mixins: [disabledMixin],
   data() {
     return {

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

@@ -247,6 +247,7 @@ import { list } from "@/api/operation/channel";
 import { detail, devices, submit } from "@/api/operation/waken";
 import { disabledMixin, isFreeMixin, platformMixin } from "@/mixin/index";
 export default {
+  // name:"operationWakenDetail",
   mixins: [platformMixin, isFreeMixin, disabledMixin],
   data() {
     return {
@@ -470,7 +471,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/operation/waken");
+      this.$tab.closeOpenPage("/operation/operationWaken");
     },
 
     // 提交

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

@@ -59,6 +59,7 @@
 import { devices, list, remove } from "@/api/operation/waken";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"OperationWaken",
   data() {
     return {
       // 遮罩层

+ 205 - 0
src/views/operation/wxbanner/detail.vue

@@ -0,0 +1,205 @@
+<template>
+    <div class="app-container">
+        <el-form :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
+            <el-form-item label="跳转方式:" prop="forwardType">
+                <el-select v-model="form.forwardType" placeholder="请选择跳转方式">
+                    <el-option v-for="item in typeOptions" :key="item.value" :label="item.label"
+                        :value="Number(item.value)" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="跳转地址:" prop="forwardUrl">
+                <el-input v-model="form.forwardUrl" placeholder="请输入跳转地址" />
+            </el-form-item>
+            <el-form-item label="图片:" prop="pic">
+                <Upload list-type="picture-card" :url="form.pic" @upload="handleUpload" :disabled="disabled"
+                    :width="686" :height="264" />
+            </el-form-item>
+
+            <el-form-item label="标签排序:" prop="sort">
+                <el-input-number v-model="form.sort" :min="0" />
+            </el-form-item>
+            <el-form-item label="当前状态:" prop="status">
+                <el-select v-model="form.status" placeholder="请选择当前状态">
+                    <el-option v-for="item in statusList" :key="item.value" :label="item.label"
+                        :value="Number(item.value)" />
+                </el-select>
+            </el-form-item>
+
+        </el-form>
+        <div class="form-btn">
+            <el-button @click="cancel">取消</el-button>
+            <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { add, detail, edit } from "@/api/operation/wxbanner";
+import { mapMixin } from "@/mixin/index";
+export default {
+    // name:"operationWXBannerDetail",
+    mixins: [mapMixin],
+    data() {
+        return {
+            // 表单
+            form: {
+                id: "",
+                pic: "",
+                name: "",
+                status: 0,
+                sort: 0,
+                forwardUrl: "",
+                forwardType: 0,
+                // updateTime: 0,
+                // updateTimeStr: "",
+                // createTime: 0,
+                // createTimeStr: ""
+            },
+
+            // 校验
+            rules: {
+                forwardType: [{
+                    required: true, message: '请选择跳转方式', trigger: 'change'
+                }],
+                forwardUrl: [{
+                    required: true, message: '请输入跳转地址', trigger: 'change'
+                }],
+                pic: [
+                    {
+                        required: true,
+                        message: "请上传轮播图的图片",
+                        trigger: "change",
+                    },
+                ],
+
+                status: [
+                    {
+                        required: true,
+                        message: "请选择状态",
+                        trigger: "blur",
+                    },
+                ],
+                sort: [
+                    {
+                        required: true,
+                        message: "请输入序号",
+                        trigger: "blur",
+                    },
+                ],
+
+            },
+            // 跳转类型
+            typeOptions: [{
+                value: 0,
+                label: 'H5内链'
+            }, {
+                value: 1,
+                label: 'H5外链'
+            }],
+            // 状态 0-上架  1-下架  2-删除
+            statusList: [{
+                value: 0,
+                label: '上架'
+            }, {
+                value: 1,
+                label: '下架'
+            }],
+            // 只读
+            disabled: false,
+        };
+    },
+    mounted() {
+        var intId = parseInt(this.$route.query.id, 10);
+        if (intId > 0) {
+            this.form.id = this.$route.query.id;
+            this.getDetail();
+        }
+        // this.form.status = this.$route.query.status;
+        this.disabled = this.$route.query.boolean != "0";
+
+
+    },
+    methods: {
+        // 详情
+        getDetail() {
+            detail(this.$route.query.id).then((res) => {
+                if (res.code === 0) {
+                    console.log("详情==" + JSON.stringify(res.data));
+                    this.form = res.data;
+                    // this.$set(this.form, "cascader", [res.data.province]);
+                    // if (res.data.city) {
+                    //     this.form.cascader[1] = res.data.city;
+                    // }
+                    // if (res.data.area) {
+                    //     this.form.cascader[2] = res.data.area;
+                    // }
+                }
+            });
+        },
+
+        // 上传
+        handleUpload(e) {
+            // {"size":56549,
+            // "file":"https://music-play.oss-cn-shenzhen.aliyuncs.com/device/20250218114746668665898.png",
+            // "platformId":null}
+            console.log(JSON.stringify(e))
+            this.form.pic = e.file;
+        },
+
+        cancel() {
+            this.$tab.closeOpenPage("/operation/operationWXBanner");
+        },
+
+        // 提交
+        getSubmit() {
+            this.$refs.form.validate((valid) => {
+
+                if (valid) {
+                    // this.form.sort = this.$refs.form.sort;
+                    // this.form.status = this.$refs.form.status;
+                    // this.form.forwardType = this.$refs.form.forwardType;
+                    // this.form.name = this.form.name;
+                    // console.log("提交信息:" + JSON.stringify(this.$refs.form))
+                    console.log("提交信息:" + JSON.stringify(this.form))
+                    if (this.$route.query.state == "0") {
+                        add(this.form).then((res) => {
+                            if (res.code === 0) {
+                                this.$message.success("提交成功!");
+                                this.cancel();
+                            } else {
+                                this.$message.error("提交失败!");
+                            }
+                        });
+                    } else {
+                        edit(this.form).then((res) => {
+                            if (res.code === 0) {
+                                this.$message.success("提交成功!");
+                                this.cancel();
+                            } else {
+                                this.$message.error("提交失败!");
+                            }
+                        });
+                    }
+
+                } else {
+                    return false;
+                }
+            });
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-form {
+    .el-form-item {
+        width: 500px;
+    }
+}
+
+::v-deep .el-dialog__wrapper {
+    .el-dialog__body {
+        padding: 0;
+    }
+}
+</style>

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

@@ -0,0 +1,165 @@
+<!-- 运营管理 微信轮播图banner -->
+<template>
+    <div class="app-container">
+        <!-- 搜索 -->
+        <el-form inline size="mini">
+            <el-form-item label="上下架状态:" prop="forwardType">
+                <el-select v-model="form.status" placeholder="请选择状态" @change="handleStatusChange">
+                    <el-option v-for="item in statusList" :key="item.value" :label="item.label"
+                        :value="Number(item.value)" />
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary" icon="el-icon-plus" plain @click="getDetail(0, 0, 0)"
+                    v-hasPermi="['operation:wxbanner:add']">新增</el-button>
+            </el-form-item>
+        </el-form>
+        <!-- 列表 -->
+        <el-table :data="tableData" v-loading="loading">
+            <el-table-column label="序号" align="center" type="index" />
+            <!-- <el-table-column label="跳转方式" align="center" prop="forwardType" show-overflow-tooltip /> -->
+            <el-table-column label="跳转方式" align="center">
+                <template slot-scope="scope">
+                    {{ getTypeText(scope.row.forwardType) }}
+                </template>
+            </el-table-column>
+            <!-- <el-table-column label="当前状态" prop="status" align="center" /> -->
+            <el-table-column label="状态" align="center">
+                <template slot-scope="scope">
+                    {{ getStatusText(scope.row.status) }}
+                </template>
+            </el-table-column>
+            <el-table-column label="更新时间" align="center" prop="updateTimeStr" />
+            <el-table-column label="创建时间" align="center" prop="createTimeStr" />
+            <el-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                    <el-button type="text" @click="getDetail(1, 1, scope.row.id)"
+                        v-hasPermi="['operation:wxbannber:check']">查看</el-button>
+
+                    <span style="margin: 0 10px">
+                        <el-button type="text" @click="getDetail(0, 2, scope.row.id)"
+                            v-hasPermi="['operation:wxbannber:edit']">编辑</el-button>
+
+                        <el-button type="delete" @click="getDelete(scope.row, scope.$index)"
+                            v-hasPermi="['operation:wxbannber:delete']">删除</el-button>
+                    </span>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <pagination v-show="total > 0" :total="total" :page.sync="form.pageNum" :limit.sync="form.pageSize"
+            @pagination="getList" />
+    </div>
+</template>
+
+<script>
+import { deletes, list } from "@/api/operation/wxbanner";
+import { currentMixin, devMixin, disabledMixin } from "@/mixin/index";
+import { dialogCallBack } from "@/utils/DialogUtil";
+export default {
+    name:"OperationWXBanner",
+    mixins: [devMixin, currentMixin, disabledMixin],
+    data() {
+        return {
+            // 遮罩层
+            loading: false,
+            // 表单
+            form: {
+                pageNum: 1,
+                pageSize: 10,
+                status: -1,
+            },
+            // 状态 0-上架  1-下架  2-删除  -1全部
+            statusList: [{
+                value: -1,
+                label: '全部'
+            }, {
+                value: 0,
+                label: '上架'
+            }, {
+                value: 1,
+                label: '下架'
+            }],
+            // 总数据
+            total: 0,
+            // 列表
+            tableData: [],
+        };
+    },
+
+    watch: {},
+    mounted() {
+        this.getList();
+    },
+
+    methods: {
+        addData() { },
+        handleStatusChange(value) {
+            this.form.status = value;
+            this.getList();
+        },
+        getStatusText(status) {
+            const statusMap = {
+                0: '上架',
+                1: '下架',
+            };
+            return statusMap[status] || '未知状态';
+        }, getTypeText(type) {
+            const statusMap = {
+                0: 'H5内链',
+                1: 'H5外链',
+            };
+            return statusMap[type] || '未知连接';
+        },
+        // 列表
+        getList() {
+            this.loading = true;
+            console.log("轮播图列表参数==" + JSON.stringify(this.form));
+
+            list(this.form).then((res) => {
+                if (res.code === 0) {
+                    console.log("轮播图列表==" + JSON.stringify(res));
+                    this.tableData = res.data.records;
+                    this.total = res.data.total;
+                    this.loading = false;
+                }
+            });
+        },
+
+        // 轮播图详情
+        getDetail(boolean, state, id) {
+            this.$router.push({
+                path: `/operation/wxbanner/detail`,
+                query: {
+                    id: id,
+                    boolean: boolean,
+                    state: state,
+                },
+            });
+        },
+
+        // 删除
+        getDelete(row, index) {
+            var that = this;
+            dialogCallBack(that, function () {
+                that
+                    .$confirm(`是否删除`, "提示:", {
+                        type: "warning",
+                    })
+                    .then(() => {
+                        console.log("打印:" + JSON.stringify(row));
+                        const id = String(row.id);
+                        deletes(id).then((res) => {
+                            if (res.code === 0) {
+                                that.$message.success("删除成功!");
+                                that.getList();
+                            } else {
+                                console.log("打印2:" + res);
+                            }
+                        });
+                    });
+            });
+        },
+    },
+};
+</script>

+ 20 - 10
src/views/order/list/index.vue

@@ -1,4 +1,5 @@
-<!-- 流量订单 -->
+<!-- 订单管理 商品订单 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -268,14 +269,8 @@
         />
       </span>
       <!-- 商品订单 或 会员订单 -->
-      <el-table-column
-        v-if="['1', '4'].includes(form.searchType)"
-        label="资源平台"
-        prop="platformId"
-        key="platformId"
-        align="center"
-        :formatter="platformIdFormatter"
-      />
+      <!-- <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"
@@ -359,10 +354,15 @@
         <el-table-column label="任务名称" prop="jobName" align="center" />
         <el-table-column label="任务类型" prop="jobType" align="center" />
         <el-table-column label="导出时间" prop="updateTime" align="center" />
+        <el-table-column label="状态" align="center" :formatter="getStatus" />
         <el-table-column label="操作人" prop="useName" align="center" />
+
         <el-table-column label="操作" align="center">
           <template slot-scope="scope">
-            <el-button type="text" @click="getDownLoad(scope.row)"
+            <el-button
+              type="text"
+              @click="getDownLoad(scope.row)"
+              :disabled="scope.row.status == 2 ? false : true"
               >下载</el-button
             >
           </template>
@@ -389,6 +389,7 @@ serviceTimeMixin,
 systemMixin,
 } from "@/mixin/index";
 export default {
+  name: "OrderList1",
   mixins: [payTypeMixin, systemMixin, serviceTimeMixin, platformMixin],
   data() {
     return {
@@ -512,12 +513,21 @@ export default {
     );
   },
   methods: {
+    getStatus(row) {
+      return row.status == 1 ? "已创建" : row.status == 2 ? "成功" : "失败";
+    },
+
     // 列表
     getList() {
       this.loading = true;
       list(this.form).then((res) => {
         if (res.code === 0) {
           this.tableData = res.data.records;
+          this.tableData.forEach((item) => {
+            if (item.platformId === 0) {
+              item.platformId = null;
+            }
+          });
           this.total = res.data.total;
           this.loading = false;
         }

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

@@ -113,9 +113,10 @@
 </template>
 
 <script>
-import { add, edit, update, appEdit, updateAdd, updatePage, historyPage, shelves } from "@/api/project/list";
+import { add, appEdit, edit, historyPage, shelves, update, updateAdd, updatePage } from "@/api/project/list";
 import Editor from "@/components/Editor";
 export default {
+  // name:"projectListDetail",
   components: {
     Editor,
   },

+ 3 - 0
src/views/project/list/index.vue

@@ -1,3 +1,5 @@
+  <!-- 项目管理 项目列表 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -45,6 +47,7 @@
 <script>
 import { page, edit } from "@/api/project/list";
 export default {
+  name:"ProjectList",
   data() {
     return {
       // 遮罩层

+ 2 - 1
src/views/push/dialog/detail.vue

@@ -57,8 +57,9 @@
 </template>
 
 <script>
-import { submit, detail } from '@/api/push/dialog'
+import { detail, submit } from '@/api/push/dialog'
 export default {
+  // name:"pushDialogDetail",
   data() {
     return {
       // 表单

+ 3 - 1
src/views/push/dialog/index.vue

@@ -1,4 +1,5 @@
- <!-- 推送弹窗 -->
+ <!-- 推送管理 推送弹窗 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -134,6 +135,7 @@ import { list, remove } from "@/api/push/dialog";
 import { currentMixin } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"PushDialog",
   mixins: [currentMixin],
   data() {
     return {

+ 3 - 0
src/views/push/message/index.vue

@@ -1,3 +1,5 @@
+<!-- 推送管理 消息推送 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -95,6 +97,7 @@
 <script>
 import { list, create, detail, edit } from '@/api/push/message'
 export default {
+  name:"PushMessage",
   data() {
     return {
       form: {

+ 3 - 1
src/views/push/update/detail.vue

@@ -21,6 +21,7 @@
           <el-option v-for="item in systemOptions" :key="item.value" :value="item.value" :label="item.label" />
         </el-select>
       </el-form-item>
+      
       <el-form-item label="下载路径:" prop="downUrl">
         <el-row type="flex" justify="space-between">
           <el-col :span="16">
@@ -43,6 +44,7 @@
 import { detail, submit } from '@/api/push/update'
 import { systemMixin } from '@/mixin'
 export default {
+  // name:"pushUpdateDetail",
   mixins: [systemMixin],
   data() {
     var checkVersion = (rule, value, callback) => {
@@ -106,7 +108,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage("/push/update");
+      this.$tab.closeOpenPage("/push/pushUpdate");
     },
 
     // 确定

+ 3 - 1
src/views/push/update/index.vue

@@ -1,5 +1,6 @@
 
-<!-- App升级 -->
+<!-- 推送管理 App升级 -->
+
 <template>
   <div class="app-container">
     <!-- 搜索 -->
@@ -104,6 +105,7 @@ import { list, remove } from "@/api/push/update";
 import { systemMixin } from "@/mixin";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"PushUpdate",
   mixins: [systemMixin],
   data() {
     return {

+ 3 - 2
src/views/registration/content/detail.vue

@@ -82,8 +82,9 @@
 <script>
 import { radioList } from '@/api/operation/recommend'
 import { create, detail, edit } from '@/api/registration/content'
-import { platformMixin, audioMixin, isFreeMixin, coverMixin } from '@/mixin/index'
+import { audioMixin, coverMixin, isFreeMixin, platformMixin } from '@/mixin/index'
 export default {
+  // name:"registrationContentDetail",
   mixins: [platformMixin, audioMixin, isFreeMixin, coverMixin],
   data() {
     return {
@@ -222,7 +223,7 @@ export default {
 
     // 取消
     cancel() {
-      this.$tab.closeOpenPage('/registration/contentConfig')
+      this.$tab.closeOpenPage('/registration/registrationContent')
     },
 
     // 确定

+ 1 - 0
src/views/registration/content/index.vue

@@ -161,6 +161,7 @@ platformMixin,
 } from "@/mixin/index";
 import { dialogCallBack } from "@/utils/DialogUtil";
 export default {
+  name:"RegistrationContent",
   mixins: [platformMixin, audioMixin, disabledMixin, currentMixin],
   data() {
     return {

+ 0 - 0
src/views/registration/exchange/detail.vue


Некоторые файлы не были показаны из-за большого количества измененных файлов