special.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. {extend name="public/container" /}
  2. {block name="head_top"}
  3. <link rel="stylesheet" href="//g.alicdn.com/de/prismplayer/2.9.21/skins/default/aliplayer-min.css">
  4. <script src="//g.alicdn.com/de/prismplayer/2.9.21/aliplayer-min.js"></script>
  5. <style>
  6. .xl-chrome-ext-bar {
  7. display: none;
  8. }
  9. .prism-player .prism-cc-btn,
  10. .prism-player .prism-setting-list .prism-setting-cc,
  11. .prism-player .prism-setting-list .prism-setting-audio,
  12. .prism-player .prism-setting-list .prism-setting-quality {
  13. display: none;
  14. }
  15. .layui-col-md12 img {
  16. max-width: 100%;
  17. max-height: 500px;
  18. vertical-align: top;
  19. }
  20. .layui-form-item img~img {
  21. margin-left: 10px;
  22. }
  23. .layui-form-radioed.layui-radio-disbaled>i {
  24. color: #0092DC !important;
  25. }
  26. .layui-disabled,
  27. .layui-disabled:hover {
  28. color: #333 !important;
  29. cursor: auto !important;
  30. }
  31. .layui-form-radioed.layui-disabled,
  32. .layui-form-radioed.layui-disabled:hover {
  33. color: #0092DC !important;
  34. }
  35. .rich-text {
  36. min-height: 100px;
  37. padding: 4px 7px;
  38. border: 1px solid #dddee1;
  39. }
  40. </style>
  41. {/block}
  42. {block name="content"}
  43. <div v-cloak id="app" class="layui-fluid">
  44. <div class="layui-card">
  45. <div class="layui-card-body">
  46. <div class="layui-form">
  47. <div class="layui-tab layui-tab-brief" lay-filter="tab">
  48. <ul class="layui-tab-title">
  49. <li v-for="(item, index) in tabTitle" :key="item.value" :class="{ 'layui-this': !index }">{{ item.title }}</li>
  50. </ul>
  51. <div class="layui-tab-content">
  52. <div class="layui-tab-item layui-show">
  53. <div class="layui-form-item">
  54. <label class="layui-form-label">专题名称:</label>
  55. <div class="layui-input-block">
  56. <input :value="special.title" disabled type="text" class="layui-input">
  57. </div>
  58. </div>
  59. <div class="layui-form-item">
  60. <label class="layui-form-label">专题简介:</label>
  61. <div class="layui-input-block">
  62. <textarea disabled class="layui-textarea">{{ special.abstract }}</textarea>
  63. </div>
  64. </div>
  65. <div class="layui-form-item">
  66. <label class="layui-form-label">专题类型:</label>
  67. <div class="layui-input-block">
  68. <input :value="type" disabled type="text" class="layui-input">
  69. </div>
  70. </div>
  71. <div class="layui-form-item">
  72. <label class="layui-form-label">专题标签:</label>
  73. <div class="layui-input-block">
  74. <button v-for="(item, index) in special.label" :key="index" type="button" class="layui-btn layui-btn-normal layui-btn-sm">{{item}}</button>
  75. </div>
  76. </div>
  77. <div class="layui-form-item">
  78. <label class="layui-form-label">专题排序:</label>
  79. <div class="layui-input-inline">
  80. <input :value="special.sort" disabled type="text" class="layui-input">
  81. </div>
  82. </div>
  83. <div class="layui-form-item">
  84. <label class="layui-form-label">专题封面:</label>
  85. <div class="layui-input-block">
  86. <img width="60" height="60" :src="special.image" @click="look(special.image)">
  87. </div>
  88. </div>
  89. <div class="layui-form-item">
  90. <label class="layui-form-label">推广海报:</label>
  91. <div class="layui-input-block">
  92. <img width="60" height="60" :src="special.poster_image" @click="look(special.poster_image)">
  93. </div>
  94. </div>
  95. <!-- <div class="layui-form-item">
  96. <label class="layui-form-label">客服二维码:</label>
  97. <div class="layui-input-block">
  98. <img width="60" height="60" :src="special.service_code" @click="look(special.service_code)">
  99. </div>
  100. </div> -->
  101. <div v-if="!special.is_light" class="layui-form-item">
  102. <label class="layui-form-label">专题Banner:</label>
  103. <div class="layui-input-block">
  104. <img v-for="(item, index) in special.banner" width="60" height="60" :src="item.pic" @click="look(special.banner, index)">
  105. </div>
  106. </div>
  107. <div v-if="special.type === 4" class="layui-form-item">
  108. <label class="layui-form-label">直播时间:</label>
  109. <div class="layui-input-inline">
  110. <input :value="liveInfo.start_play_time" disabled type="text" class="layui-input">
  111. </div>
  112. </div>
  113. <div v-if="special.type === 4" class="layui-form-item">
  114. <label class="layui-form-label">直播时长:</label>
  115. <div class="layui-input-inline">
  116. <input :value="liveInfo.start_play_time" disabled type="text" class="layui-input">
  117. </div>
  118. </div>
  119. <div v-if="special.type === 4" class="layui-form-item">
  120. <label class="layui-form-label">开播提醒:</label>
  121. <div class="layui-input-block">
  122. <input type="radio" name="is_remind" disabled value="1" title="是" :checked="liveInfo.is_remind == 1">
  123. <input type="radio" name="is_remind" disabled value="0" title="否" :checked="liveInfo.is_remind == 0">
  124. </div>
  125. </div>
  126. <div v-if="special.type === 4 && liveInfo.is_remind" class="layui-form-item">
  127. <label class="layui-form-label">提醒时间:</label>
  128. <div class="layui-input-inline">
  129. <input :value="liveInfo.remind_time" disabled type="text" class="layui-input">
  130. </div>
  131. </div>
  132. <div v-if="special.type === 4" class="layui-form-item">
  133. <label class="layui-form-label">直播录制:</label>
  134. <div class="layui-input-block">
  135. <input type="radio" name="is_recording" disabled value="1" title="是" :checked="liveInfo.is_recording == 1">
  136. <input type="radio" name="is_recording" disabled value="0" title="否" :checked="liveInfo.is_recording == 0">
  137. </div>
  138. </div>
  139. <div class="layui-form-item">
  140. <label class="layui-form-label">仅会员可见:</label>
  141. <div class="layui-input-block">
  142. <input type="radio" name="is_mer_visible" disabled value="1" title="是" :checked="special.is_mer_visible == 1">
  143. <input type="radio" name="is_mer_visible" disabled value="0" title="否" :checked="special.is_mer_visible == 0">
  144. </div>
  145. </div>
  146. <div class="layui-form-item">
  147. <label class="layui-form-label">有效期:</label>
  148. <div class="layui-input-inline">
  149. <input :value="special.validity" disabled type="text" class="layui-input">
  150. </div>
  151. <div class="layui-form-mid layui-word-aux">天</div>
  152. </div>
  153. <div class="layui-form-item">
  154. <label class="layui-form-label">付费方式:</label>
  155. <div class="layui-input-block">
  156. <input type="radio" name="pay_type" disabled value="0" title="免费" :checked="special.pay_type == 0">
  157. <input type="radio" name="pay_type" disabled value="1" title="付费" :checked="special.pay_type == 1">
  158. <input type="radio" name="pay_type" disabled value="2" title="加密" :checked="special.pay_type == 2">
  159. </div>
  160. </div>
  161. <div v-if="special.pay_type" class="layui-form-item">
  162. <label class="layui-form-label">购买金额:</label>
  163. <div class="layui-input-inline">
  164. <input :value="special.money" disabled type="text" class="layui-input">
  165. </div>
  166. </div>
  167. <!-- <div class="layui-form-item">
  168. <label class="layui-form-label">会员付费方式:</label>
  169. <div class="layui-input-block">
  170. <input type="radio" name="member_pay_type" disabled value="0" title="免费" :checked="special.member_pay_type == 0">
  171. <input type="radio" name="member_pay_type" disabled value="1" title="付费" :checked="special.member_pay_type == 1">
  172. </div>
  173. </div>
  174. <div v-if="special.member_pay_type" class="layui-form-item">
  175. <label class="layui-form-label">会员购买金额:</label>
  176. <div class="layui-input-inline">
  177. <input :value="special.member_money" disabled type="text" class="layui-input">
  178. </div>
  179. </div>
  180. <div v-if="special.pay_type" class="layui-form-item">
  181. <label class="layui-form-label">单独分销:</label>
  182. <div class="layui-input-block">
  183. <input type="radio" name="is_alone" disabled value="1" title="开启" :checked="special.is_alone == 1">
  184. <input type="radio" name="is_alone" disabled value="0" title="关闭" :checked="special.is_alone == 0">
  185. </div>
  186. </div>
  187. <div v-if="special.pay_type && special.is_alone" class="layui-form-item">
  188. <label class="layui-form-label">一级返佣比例:</label>
  189. <div class="layui-input-inline">
  190. <input :value="special.brokerage_ratio" disabled type="text" class="layui-input">
  191. </div>
  192. </div>
  193. <div v-if="special.pay_type && special.is_alone" class="layui-form-item">
  194. <label class="layui-form-label">二级返佣比例:</label>
  195. <div class="layui-input-inline">
  196. <input :value="special.brokerage_two" disabled type="text" class="layui-input">
  197. </div>
  198. </div>
  199. <div v-if="special.pay_type" class="layui-form-item">
  200. <label class="layui-form-label">拼团状态:</label>
  201. <div class="layui-input-block">
  202. <input type="radio" name="is_pink" disabled value="1" title="开启" :checked="special.is_pink == 1">
  203. <input type="radio" name="is_pink" disabled value="0" title="关闭" :checked="special.is_pink == 0">
  204. </div>
  205. </div>
  206. <div v-if="special.pay_type && special.is_pink" class="layui-form-item">
  207. <label class="layui-form-label">拼团金额:</label>
  208. <div class="layui-input-inline">
  209. <input :value="special.pink_money" disabled type="text" class="layui-input">
  210. </div>
  211. </div>
  212. <div v-if="special.pay_type && special.is_pink" class="layui-form-item">
  213. <label class="layui-form-label">拼团人数:</label>
  214. <div class="layui-input-inline">
  215. <input :value="special.pink_number" disabled type="text" class="layui-input">
  216. </div>
  217. </div>
  218. <div v-if="special.is_pink" class="layui-form-item">
  219. <label class="layui-form-label">拼团开始时间:</label>
  220. <div class="layui-input-inline">
  221. <input :value="special.pink_strar_time" disabled type="text" class="layui-input">
  222. </div>
  223. </div>
  224. <div v-if="special.is_pink" class="layui-form-item">
  225. <label class="layui-form-label">拼团结束时间:</label>
  226. <div class="layui-input-inline">
  227. <input :value="special.pink_end_time" disabled type="text" class="layui-input">
  228. </div>
  229. </div>
  230. <div v-if="special.is_pink" class="layui-form-item">
  231. <label class="layui-form-label">拼团时间:</label>
  232. <div class="layui-input-inline">
  233. <input :value="special.pink_time" disabled type="text" class="layui-input">
  234. </div>
  235. </div>
  236. <div v-if="special.is_pink" class="layui-form-item">
  237. <label class="layui-form-label">模拟成团:</label>
  238. <div class="layui-input-inline">
  239. <input type="radio" name="is_fake_pink" disabled value="1" title="开启" :checked="special.is_fake_pink == 1">
  240. <input type="radio" name="is_fake_pink" disabled value="0" title="关闭" :checked="special.is_fake_pink == 0">
  241. </div>
  242. </div>
  243. <div v-if="special.is_pink" class="layui-form-item">
  244. <label class="layui-form-label">补齐比例:</label>
  245. <div class="layui-input-inline">
  246. <input :value="special.fake_pink_number" disabled type="text" class="layui-input">
  247. </div>
  248. </div> -->
  249. <div v-if="special.is_light" class="layui-form-item">
  250. <label class="layui-form-label">试看:</label>
  251. <div class="layui-input-inline">
  252. <input type="radio" name="is_try" disabled value="1" title="开启" :checked="special.singleProfile.is_try == 1">
  253. <input type="radio" name="is_try" disabled value="0" title="关闭" :checked="special.singleProfile.is_try == 0">
  254. </div>
  255. </div>
  256. <div v-if="special.is_light && special.light_type !== 1 && special.singleProfile.is_try" class="layui-form-item">
  257. <label class="layui-form-label">试看时长:</label>
  258. <div class="layui-input-inline">
  259. <input :value="special.singleProfile.try_time" disabled type="text" class="layui-input">
  260. </div>
  261. </div>
  262. </div>
  263. <div class="layui-tab-item">
  264. <div v-if="special.is_light" class="rich-text" v-html="special.abstract"></div>
  265. <div v-else class="rich-text" v-html="special.profile.content"></div>
  266. </div>
  267. <div v-if="special.is_light" class="layui-tab-item">
  268. <div class="layui-row layui-col-space15">
  269. <div v-if="special.light_type === 1 && special.singleProfile.is_try" class="layui-col-md12" v-html="special.singleProfile.try_content"></div>
  270. <div v-if="special.light_type === 1" class="layui-col-md12" v-html="special.singleProfile.content"></div>
  271. <div v-else class="layui-col-md12">
  272. <div id="J_prismPlayer"></div>
  273. </div>
  274. </div>
  275. </div>
  276. <div v-else class="layui-tab-item">
  277. <div class="layui-row layui-col-space15">
  278. <div class="layui-col-md12">
  279. <table id="source" lay-filter="source"></table>
  280. </div>
  281. </div>
  282. </div>
  283. </div>
  284. </div>
  285. </div>
  286. <form class="layui-form" lay-filter="form" action="">
  287. <div class="layui-form-item">
  288. <label class="layui-form-label">审核状态:</label>
  289. <div class="layui-input-block">
  290. <input type="radio" name="status" value="1" title="通过" lay-filter="status">
  291. <input type="radio" name="status" value="-1" title="拒绝" lay-filter="status">
  292. </div>
  293. </div>
  294. <div v-if="status === -1" class="layui-form-item">
  295. <label class="layui-form-label">拒绝原因:</label>
  296. <div class="layui-input-block">
  297. <textarea name="fail_message" required lay-verify="required" placeholder="请输入拒绝原因" class="layui-textarea"></textarea>
  298. </div>
  299. </div>
  300. <div class="layui-form-item">
  301. <div class="layui-input-block">
  302. <button type="button" class="layui-btn layui-btn-normal" lay-submit lay-filter="*">提交</button>
  303. </div>
  304. </div>
  305. </form>
  306. </div>
  307. </div>
  308. </div>
  309. <script type="text/html" id="image">
  310. <img width="60" height="60" src="{{d.image}}" lay-event="image">
  311. </script>
  312. <script type="text/html" id="type">
  313. {{# if(d.type === 1) { }}
  314. 图文
  315. {{# } else if (d.type === 2) { }}
  316. 音频
  317. {{# } else { }}
  318. 视频
  319. {{# } }}
  320. </script>
  321. <script type="text/html" id="toolbar">
  322. <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="detail">详情</a>
  323. </script>
  324. {/block}
  325. {block name="foot"}
  326. <script src="{__ADMIN_PATH}js/layuiList.js"></script>
  327. <script>
  328. require(['vue'], function (Vue) {
  329. var special = {$special},
  330. liveInfo = {$liveInfo},
  331. form = layui.form,
  332. layer = layui.layer,
  333. parentLayer = parent.layui.layer,
  334. table = layui.table,
  335. element = layui.element,
  336. tabTitle = [
  337. {
  338. title: '信息',
  339. value: 1
  340. },
  341. {
  342. title: '详情',
  343. value: 2
  344. },
  345. {
  346. title: '素材',
  347. value: 3
  348. },
  349. {
  350. title: '内容',
  351. value: 4
  352. }
  353. ];
  354. for (var index = tabTitle.length; index--;) {
  355. if (special.type === 4) {
  356. tabTitle[index].title = '直播' + tabTitle[index].title;
  357. if (tabTitle[index].value === 3 || tabTitle[index].value === 4) {
  358. tabTitle.splice(index, 1);
  359. }
  360. } else if (special.type === 5) {
  361. tabTitle[index].title = '专栏' + tabTitle[index].title;
  362. if (tabTitle[index].value === 3 || tabTitle[index].value === 4) {
  363. tabTitle.splice(index, 1);
  364. }
  365. } else {
  366. tabTitle[index].title = '专题' + tabTitle[index].title;
  367. if (special.is_light) {
  368. if (tabTitle[index].value === 3) {
  369. tabTitle.splice(index, 1);
  370. }
  371. } else {
  372. if (tabTitle[index].value === 4) {
  373. tabTitle.splice(index, 1);
  374. }
  375. }
  376. }
  377. }
  378. new Vue({
  379. el: '#app',
  380. data: {
  381. special: special,
  382. liveInfo: liveInfo,
  383. tabTitle: tabTitle,
  384. status: 1
  385. },
  386. computed: {
  387. type: function () {
  388. switch (this.special.type) {
  389. case 1: return '图文专题';
  390. case 2: return '音频专题';
  391. case 3: return '视频专题';
  392. case 4: return '直播专题';
  393. case 5: return '专栏专题';
  394. case 6: return '轻专题';
  395. }
  396. }
  397. },
  398. mounted: function () {
  399. this.$nextTick(function () {
  400. var vm = this;
  401. this.getSourceList();
  402. form.val('form', {
  403. status: this.status
  404. });
  405. form.render();
  406. form.on('radio(status)', function (data) {
  407. vm.status = Number(data.value);
  408. });
  409. form.on('submit(*)', function (data) {
  410. vm.status === 1 ? vm.success() : vm.fail(data.field.fail_message);
  411. return false;
  412. });
  413. element.on('tab(tab)', function (data) {
  414. if (data.index === 2) {
  415. if (vm.special.type === 1 || vm.special.type === 2 || vm.special.type === 3) {
  416. table.resize('source');
  417. }
  418. } else {
  419. if (vm.special.type === 6 && vm.special.light_type !== 1 && vm.player && vm.player.getStatus() === 'playing') {
  420. vm.player.pause();
  421. }
  422. }
  423. });
  424. table.on('tool(source)', function (obj) {
  425. if (obj.event === 'detail') {
  426. layer.open({
  427. type: 2,
  428. title: obj.data.title,
  429. maxmin: true,
  430. area: ['90%', '90%'],
  431. content: layList.U({
  432. a: 'getSources',
  433. q: {
  434. id: obj.data.source_id
  435. }
  436. })
  437. });
  438. } else if (obj.event === 'image') {
  439. vm.look(obj.data.image);
  440. }
  441. });
  442. // 轻专题
  443. if (this.special.is_light) {
  444. if (this.special.light_type !== 1) {
  445. if (this.special.singleProfile.videoId) {
  446. // 点播
  447. layList.basePost(layList.U({
  448. a: 'video_upload_address_voucher'
  449. }), {
  450. FileName: '',
  451. type: 3,
  452. image: '',
  453. videoId: this.special.singleProfile.videoId
  454. }, function (res) {
  455. $.getJSON(res.msg, function (data) {
  456. vm.createPlayer(data.PlayInfoList.PlayInfo[0].PlayURL);
  457. });
  458. });
  459. } else {
  460. this.createPlayer(this.special.singleProfile.link);
  461. }
  462. }
  463. }
  464. });
  465. },
  466. methods: {
  467. // 审核通过
  468. success: function () {
  469. layList.baseGet(layList.U({
  470. a: 'succ',
  471. p: {
  472. id: this.special.id
  473. }
  474. }), function (res) {
  475. layer.msg(res.msg, {
  476. icon: 1,
  477. time: 2000
  478. }, function () {
  479. parentLayer.close(parentLayer.getFrameIndex(window.name));
  480. });
  481. });
  482. },
  483. // 审核拒绝
  484. fail: function (message) {
  485. layList.basePost(layList.U({
  486. a: 'fail',
  487. p: {
  488. id: this.special.id
  489. }
  490. }), {
  491. message: message
  492. }, function (res) {
  493. layer.msg(res.msg, {
  494. icon: 1,
  495. time: 2000
  496. }, function () {
  497. parentLayer.close(parentLayer.getFrameIndex(window.name));
  498. });
  499. });
  500. },
  501. look: function () {
  502. var data = [];
  503. if (arguments.length === 1) {
  504. data.push({
  505. src: arguments[0]
  506. });
  507. } else {
  508. arguments[0].forEach(function (item) {
  509. data.push({
  510. src: item.pic
  511. });
  512. });
  513. }
  514. layer.photos({
  515. photos: {
  516. start: arguments[1] || 0,
  517. data: data
  518. },
  519. anim: 5
  520. });
  521. },
  522. // 获得已关联的素材
  523. getSourceList: function () {
  524. table.render({
  525. elem: '#source',
  526. url: layList.U({
  527. a: 'get_source_sure_list'
  528. }),
  529. where: {
  530. id: this.special.id,
  531. order: this.special.sort_order
  532. },
  533. cols: [[
  534. {field: 'id', title: 'ID', align: 'center'},
  535. {field: 'title', title: '名称', align: 'center'},
  536. {field: 'type', title: '类型', align: 'center', templet: '#type'},
  537. {field: 'image', title: '封面', align: 'center', templet: '#image'},
  538. {field: 'sort', title: '排序', align: 'center'},
  539. {fixed: 'right', title: '操作', align: 'center', toolbar: '#toolbar'}
  540. ]],
  541. });
  542. },
  543. // 创建播放器
  544. createPlayer: function (source) {
  545. this.player = new Aliplayer({
  546. id: 'J_prismPlayer',
  547. height: '500px',
  548. autoplay: false,
  549. source: source
  550. }, function (player) {
  551. console.log('The player is created.');
  552. });
  553. }
  554. }
  555. });
  556. });
  557. </script>
  558. {/block}