add.php 62 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. {extend name="public/container"}
  2. {block name='head_top'}
  3. <style>
  4. .layui-form-item .special-label {
  5. width: 50px;
  6. float: left;
  7. height: 30px;
  8. line-height: 38px;
  9. margin-left: 10px;
  10. margin-top: 5px;
  11. border-radius: 5px;
  12. background-color: #0092DC;
  13. text-align: center;
  14. }
  15. .layui-form-item .special-label i {
  16. display: inline-block;
  17. width: 18px;
  18. height: 18px;
  19. font-size: 18px;
  20. color: #fff;
  21. }
  22. .layui-form-item .label-box {
  23. border: 1px solid;
  24. border-radius: 10px;
  25. position: relative;
  26. padding: 10px;
  27. height: 30px;
  28. color: #fff;
  29. background-color: #393D49;
  30. text-align: center;
  31. cursor: pointer;
  32. display: inline-block;
  33. line-height: 10px;
  34. }
  35. .layui-form-item .label-box p {
  36. line-height: inherit;
  37. }
  38. .edui-default .edui-for-image .edui-icon {
  39. background-position: -380px 0px;
  40. }
  41. </style>
  42. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/third-party/zeroclipboard/ZeroClipboard.js"></script>
  43. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.config.js"></script>
  44. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.all.min.js"></script>
  45. {/block}
  46. {block name="content"}
  47. <div v-cloak id="app" class="layui-fluid">
  48. <div class="layui-card">
  49. <div class="layui-card-body">
  50. <form class="layui-form" action="">
  51. <div class="layui-tab layui-tab-brief" lay-filter="tab">
  52. <ul class="layui-tab-title">
  53. <li class="layui-this" lay-id="0">基本设置</li>
  54. <li lay-id="1">直播带货</li>
  55. <li lay-id="2">直播配置</li>
  56. <li lay-id="3">价格设置</li>
  57. </ul>
  58. <div class="layui-tab-content">
  59. <div class="layui-tab-item layui-show">
  60. <div class="layui-form-item required">
  61. <label class="layui-form-label">直播名称:</label>
  62. <div class="layui-input-block">
  63. <input type="text" name="title" v-model.trim="formData.title" autocomplete="off" placeholder="请输入直播名称,100字以内" maxlength="100" class="layui-input">
  64. </div>
  65. </div>
  66. <div class="layui-form-item required">
  67. <label class="layui-form-label">课程分类:</label>
  68. <div class="layui-input-block">
  69. <select name="subject_id" v-model="formData.subject_id" lay-search="" lay-filter="subject_id" lay-verify="required">
  70. <option value="0">请选分类</option>
  71. <option v-for="item in subject_list" :value="item.id" :disabled="item.grade_id==0 ? true : false">{{item.html}}{{item.name}}</option>
  72. </select>
  73. </div>
  74. </div>
  75. <div class="layui-form-item">
  76. <label class="layui-form-label required">直播说明:</label>
  77. <div class="layui-input-block">
  78. <textarea placeholder="请输入直播说明" v-model="formData.abstract" class="layui-textarea"></textarea>
  79. </div>
  80. </div>
  81. <div class="layui-form-item">
  82. <label class="layui-form-label">自动回复:</label>
  83. <div class="layui-input-block">
  84. <textarea placeholder="用户首次进入直播间的欢迎语" v-model="formData.auto_phrase" class="layui-textarea"></textarea>
  85. </div>
  86. </div>
  87. <div class="layui-form-item">
  88. <label class="layui-form-label required">直播标签:</label>
  89. <div class="layui-input-inline">
  90. <input type="text" v-model="label" name="price_min" placeholder="最多6个字" autocomplete="off" maxlength="6" class="layui-input">
  91. </div>
  92. <button type="button" class="layui-btn layui-btn-normal" @click="addLabrl" >
  93. <i class="layui-icon layui-icon-addition"></i>
  94. </button>
  95. <div class="layui-form-mid layui-word-aux">输入标签名称后点击“+”号按钮添加;最多写入6个字;点击标签即可删除</div>
  96. </div>
  97. <div v-if="formData.label.length" class="layui-form-item">
  98. <div class="layui-input-block">
  99. <button v-for="(item,index) in formData.label" :key="index" type="button" class="layui-btn layui-btn-normal layui-btn-sm" @click="delLabel(index)">{{item}}</button>
  100. </div>
  101. </div>
  102. <div class="layui-form-item">
  103. <label class="layui-form-label required">直播封面:(710*400)</label>
  104. <div class="layui-input-block">
  105. <div class="upload-image-box" v-if="formData.image">
  106. <img :src="formData.image" alt="">
  107. <div class="mask">
  108. <p><i class="fa fa-eye" @click="look(formData.image)"></i>
  109. <i class="fa fa-trash-o" @click="delect('image')"></i>
  110. </p>
  111. </div>
  112. </div>
  113. <div class="upload-image" v-show="!formData.image" @click="upload('image')">
  114. <div class="fiexd"><i class="fa fa-plus"></i></div>
  115. <p>选择图片</p>
  116. </div>
  117. </div>
  118. </div>
  119. <div class="layui-form-item">
  120. <label class="layui-form-label required">直播Banner:(750*400)</label>
  121. <div class="layui-input-block">
  122. <div class="upload-image-box" v-if="formData.banner.length" v-for="(item,index) in formData.banner">
  123. <img :src="item.pic" alt="">
  124. <div class="mask">
  125. <p><i class="fa fa-eye" @click="look(item.pic)"></i>
  126. <i class="fa fa-trash-o" @click="delect('banner',index)"></i>
  127. </p>
  128. </div>
  129. </div>
  130. <div class="upload-image" v-show="formData.banner.length < 5" @click="upload('banner',5 - formData.banner.length)">
  131. <div class="fiexd"><i class="fa fa-plus"></i></div>
  132. <p>选择图片</p>
  133. </div>
  134. </div>
  135. </div>
  136. <div class="layui-form-item">
  137. <label class="layui-form-label required">推广海报:(600*740)</label>
  138. <div class="layui-input-block">
  139. <div class="upload-image-box" v-if="formData.poster_image">
  140. <img :src="formData.poster_image" alt="">
  141. <div class="mask">
  142. <p>
  143. <i class="fa fa-eye" @click="look(formData.poster_image)"></i>
  144. <i class="fa fa-trash-o" @click="delect('poster_image')"></i>
  145. </p>
  146. </div>
  147. </div>
  148. <div class="upload-image" v-show="!formData.poster_image" @click="upload('poster_image')">
  149. <div class="fiexd"><i class="fa fa-plus"></i></div>
  150. <p>选择图片</p>
  151. </div>
  152. </div>
  153. </div>
  154. <!-- <div class="layui-form-item">
  155. <label class="layui-form-label">客服二维码:(200*200)</label>
  156. <div class="layui-input-block">
  157. <div class="upload-image-box" v-if="formData.service_code">
  158. <img :src="formData.service_code" alt="">
  159. <div class="mask">
  160. <p>
  161. <i class="fa fa-eye" @click="look(formData.service_code)"></i>
  162. <i class="fa fa-trash-o" @click="delect('service_code')"></i>
  163. </p>
  164. </div>
  165. </div>
  166. <div class="upload-image" v-show="!formData.service_code" @click="upload('service_code')">
  167. <div class="fiexd"><i class="fa fa-plus"></i></div>
  168. <p>选择图片</p>
  169. </div>
  170. </div>
  171. </div> -->
  172. <div class="layui-form-item">
  173. <label class="layui-form-label">插入视频:</label>
  174. <div class="layui-input-block">
  175. <input type="text" name="title" v-model="link" style="width:300px;display:inline-block;margin-right: 10px;" autocomplete="off" placeholder="请输入视频链接" class="layui-input">
  176. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" @click="uploadVideo()">确认添加</button>
  177. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="ossupload">上传视频</button>
  178. </div>
  179. <input type="file" name="video" v-show="" ref="video">
  180. <div class="layui-input-block" style="width: 50%;margin-top: 20px" v-show="is_video">
  181. <div class="layui-progress" style="margin-bottom: 10px">
  182. <div class="layui-progress-bar layui-bg-blue" :style="'width:'+videoWidth+'%'"></div>
  183. </div>
  184. <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" @click="cancelUpload">取消</button>
  185. </div>
  186. <div class="layui-form-mid layui-word-aux">输入链接将视为添加视频直接添加,请确保视频链接的正确性</div>
  187. </div>
  188. <div class="layui-form-item">
  189. <label class="layui-form-label">直播简介:</label>
  190. <div class="layui-input-block">
  191. <textarea id="editor">{{formData.content}}</textarea>
  192. </div>
  193. </div>
  194. </div>
  195. <div class="layui-tab-item">
  196. <div class="layui-form-item">
  197. <label class="layui-form-label">专题推荐:</label>
  198. <div class="layui-input-block">
  199. <input type="hidden" id="check_source_tmp" name="check_source_tmp"/>
  200. <button type="button" class="layui-btn layui-btn-normal" @click='search_task'>
  201. 选择专题
  202. </button>
  203. </div>
  204. </div>
  205. <div class="layui-form-item">
  206. <label class="layui-form-label">添加专题:</label>
  207. <div class="layui-input-block">
  208. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加视频专题',3)">
  209. 添加视频专题
  210. </button>
  211. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加音频专题',2)">
  212. 添加音频专题
  213. </button>
  214. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加图文专题',1)">
  215. 添加图文专题
  216. </button>
  217. <button type="button" class="layui-btn layui-btn-normal" @click='add_single_source'>
  218. 添加轻专题
  219. </button>
  220. 如专题列表中没有,可点击此添加
  221. </div>
  222. </div>
  223. <div class="layui-form-item">
  224. <label class="layui-form-label">专题展示:</label>
  225. <div class="layui-input-block">
  226. <input type="hidden" id="check_source_sure" name="check_source_sure"/>
  227. <table class="layui-hide" id="showSourceList" lay-filter="showSourceList"></table>
  228. </div>
  229. </div>
  230. <div class="layui-form-item">
  231. <label class="layui-form-label">商品推荐:</label>
  232. <div class="layui-input-block">
  233. <input type="hidden" id="check_store_tmp" name="check_store_tmp"/>
  234. <button type="button" class="layui-btn layui-btn-normal" @click='store_task'>
  235. 选择商品
  236. </button>
  237. </div>
  238. </div>
  239. <div class="layui-form-item">
  240. <label class="layui-form-label">添加商品:</label>
  241. <div class="layui-input-block">
  242. <button type="button" class="layui-btn layui-btn-normal" @click='add_store'>
  243. 添加商品
  244. </button>
  245. 如商品列表中没有,可点击此添加
  246. </div>
  247. </div>
  248. <div class="layui-form-item">
  249. <label class="layui-form-label">商品展示:</label>
  250. <div class="layui-input-block">
  251. <input type="hidden" id="check_store_sure" name="check_store_sure"/>
  252. <table class="layui-hide" id="showStoreList" lay-filter="showStoreList"></table>
  253. </div>
  254. </div>
  255. </div>
  256. <div class="layui-tab-item">
  257. <div class="layui-form-item">
  258. <label class="layui-form-label">直播时间:</label>
  259. <div class="layui-input-inline">
  260. <input type="text" name="live_time" v-model="formData.live_time" id="live_time" class="layui-input" placeholder="开播时间">
  261. </div>
  262. </div>
  263. <div class="layui-form-item">
  264. <label class="layui-form-label">开播提醒:</label>
  265. <div class="layui-input-block">
  266. <input type="radio" name="is_remind" lay-filter="is_remind" v-model="formData.is_remind" value="1" title="是">
  267. <input type="radio" name="is_remind" lay-filter="is_remind" v-model="formData.is_remind" value="0" title="否">
  268. </div>
  269. </div>
  270. <div class="layui-form-item" v-show="formData.is_remind == 1">
  271. <label class="layui-form-label">提醒时间:</label>
  272. <div class="layui-input-inline">
  273. <input type="number" name="time" lay-verify="number" id="remind_time" v-model="formData.remind_time" autocomplete="off" class="layui-input" placeholder="单位:分钟">
  274. </div>
  275. <div class="layui-form-mid layui-word-unit">分钟</div>
  276. </div>
  277. <div class="layui-form-item">
  278. <label class="layui-form-label required">直播时长:</label>
  279. <div class="layui-input-inline">
  280. <input type="number" name="time" lay-verify="number" v-model="formData.live_duration" autocomplete="off" class="layui-input" placeholder="单位:分钟">
  281. </div>
  282. <div class="layui-form-mid layui-word-unit">分钟</div>
  283. </div>
  284. <div class="layui-form-item">
  285. <label class="layui-form-label">直播录制:</label>
  286. <div class="layui-input-block">
  287. <input type="radio" name="is_recording" lay-filter="is_recording" v-model="formData.is_recording" value="1" title="是">
  288. <input type="radio" name="is_recording" lay-filter="is_recording" v-model="formData.is_recording" value="0" title="否">
  289. </div>
  290. </div>
  291. <div class="layui-form-item">
  292. <label class="layui-form-label">直播排序:</label>
  293. <div class="layui-input-inline">
  294. <input type="number" name="sort" v-model="formData.sort" autocomplete="off" min="0" class="layui-input" v-sort>
  295. </div>
  296. </div>
  297. <div class="layui-form-item">
  298. <label class="layui-form-label">有效期:</label>
  299. <div class="layui-input-inline">
  300. <input type="number" name="validity" lay-verify="number" v-model="formData.validity" autocomplete="off" class="layui-input" min="0" max="99999">
  301. </div>
  302. <div class="layui-form-mid layui-word-unit">天</div>
  303. <div class="layui-form-mid layui-word-aux">有效期是购买后可以观看的时间,0即为不限时间</div>
  304. </div>
  305. <div class="layui-form-item">
  306. <label class="layui-form-label">仅会员可见:</label>
  307. <div class="layui-input-block">
  308. <input type="radio" name="is_mer_visible" lay-filter="is_mer_visible" v-model="formData.is_mer_visible" value="1" title="是">
  309. <input type="radio" name="is_mer_visible" lay-filter="is_mer_visible" v-model="formData.is_mer_visible" value="0" title="否">
  310. </div>
  311. </div>
  312. </div>
  313. <div class="layui-tab-item">
  314. <div class="layui-form-item">
  315. <label class="layui-form-label">付费方式:</label>
  316. <div class="layui-input-block">
  317. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="1" title="付费">
  318. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="0" title="免费">
  319. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="2" title="加密">
  320. </div>
  321. </div>
  322. <div class="layui-form-item" v-if="formData.pay_type == 2">
  323. <div class="layui-inline">
  324. <label class="layui-form-label">设置密码:</label>
  325. <div class="layui-input-inline">
  326. <input type="password" name="password" v-model="formData.password" lay-verify="password" placeholder="请输入密码" class="layui-input">
  327. </div>
  328. </div>
  329. <div class="layui-inline">
  330. <label class="layui-form-label">确认密码:</label>
  331. <div class="layui-input-inline">
  332. <input type="password" name="qr_password" v-model="formData.qr_password" placeholder="请输入密码" class="layui-input">
  333. </div>
  334. </div>
  335. </div>
  336. <div class="layui-form-item" v-show="formData.pay_type == 1">
  337. <label class="layui-form-label">购买金额:</label>
  338. <div class="layui-input-inline">
  339. <input type="number" name="money" lay-verify="number" v-model="formData.money" autocomplete="off" class="layui-input">
  340. </div>
  341. </div>
  342. <!-- <div class="layui-form-item" v-show="formData.pay_type == 1">
  343. <label class="layui-form-label" style="padding-left: 0;">会员付费方式:</label>
  344. <div class="layui-input-block">
  345. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="1" title="付费">
  346. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="0" title="免费">
  347. </div>
  348. </div>
  349. <div class="layui-form-item" v-show="formData.member_pay_type == 1">
  350. <label class="layui-form-label">会员购买金额:</label>
  351. <div class="layui-input-inline">
  352. <input type="number" name="member_money" lay-verify="number" v-model="formData.member_money" autocomplete="off" class="layui-input" min="0">
  353. </div>
  354. </div>
  355. <div class="layui-form-item" v-show="formData.pay_type == 1">
  356. <label class="layui-form-label">拼团状态:</label>
  357. <div class="layui-input-block">
  358. <input type="radio" name="is_pink" lay-filter="is_pink" v-model="formData.is_pink" value="1" title="开启">
  359. <input type="radio" name="is_pink" lay-filter="is_pink" v-model="formData.is_pink" value="0" title="关闭" checked="">
  360. </div>
  361. </div>
  362. <div class="layui-form-item" v-show="formData.is_pink">
  363. <div class="layui-inline">
  364. <label class="layui-form-label">拼团金额:</label>
  365. <div class="layui-input-inline">
  366. <input type="number" name="pink_money" v-model="formData.pink_money" autocomplete="off" class="layui-input">
  367. </div>
  368. </div>
  369. <div class="layui-inline">
  370. <label class="layui-form-label">拼团人数:</label>
  371. <div class="layui-input-inline">
  372. <input type="number" name="pink_number" v-model="formData.pink_number" autocomplete="off" class="layui-input">
  373. </div>
  374. </div>
  375. </div>
  376. <div class="layui-form-item" v-show="formData.is_pink">
  377. <div class="layui-inline">
  378. <label class="layui-form-label">开始时间:</label>
  379. <div class="layui-input-inline">
  380. <input type="text" name="pink_strar_time" v-model="formData.pink_strar_time" id="start_time" autocomplete="off" class="layui-input">
  381. </div>
  382. </div>
  383. <div class="layui-inline">
  384. <label class="layui-form-label">结束时间:</label>
  385. <div class="layui-input-inline">
  386. <input type="text" name="pink_end_time" v-model="formData.pink_end_time" id="end_time" autocomplete="off" class="layui-input">
  387. </div>
  388. </div>
  389. </div>
  390. <div class="layui-form-item" v-show="formData.is_pink">
  391. <label class="layui-form-label" style="padding-left: 0;">拼团时间:</label>
  392. <div class="layui-input-inline">
  393. <input type="number" v-model="formData.pink_time" autocomplete="off" class="layui-input">
  394. </div>
  395. <div class="layui-form-mid">小时</div>
  396. </div>
  397. <div class="layui-form-item" v-show="formData.is_pink">
  398. <label class="layui-form-label">模拟成团:</label>
  399. <div class="layui-input-block">
  400. <input type="radio" name="is_fake_pink" lay-filter="is_fake_pink" v-model="formData.is_fake_pink" value="1" title="开启" checked="">
  401. <input type="radio" name="is_fake_pink" lay-filter="is_fake_pink" v-model="formData.is_fake_pink" value="0" title="关闭">
  402. </div>
  403. </div>
  404. <div class="layui-form-item" v-show="formData.is_pink">
  405. <label class="layui-form-label">补齐比例:</label>
  406. <div class="layui-input-inline">
  407. <input type="number" v-model="formData.fake_pink_number" autocomplete="off" class="layui-input">
  408. </div>
  409. <div class="layui-form-mid" style="color: red;">注:可设置成团的补齐比例,拼团结束前实际拼团人数达不到拼团要求时,可根据补齐比例自动添加人数,达到拼团成功的目的</div>
  410. </div> -->
  411. </div>
  412. </div>
  413. </div>
  414. <div class="layui-form-item">
  415. <div class="layui-input-block">
  416. <button type="button" class="layui-btn layui-btn-primary" @click="clone_form">取消</button>
  417. <button v-show="tabIndex" type="button" class="layui-btn layui-btn-primary" @click="tabChange(-1)">上一步</button>
  418. <button v-show="tabIndex != 3" type="button" class="layui-btn layui-btn-normal" @click="tabChange(1)">下一步</button>
  419. <button v-show="tabIndex == 3" type="button" class="layui-btn layui-btn-normal" @click="save">{$id ?'确认修改':'立即提交'}</button>
  420. </div>
  421. </div>
  422. </form>
  423. </div>
  424. </div>
  425. </div>
  426. <script type="text/javascript" src="{__ADMIN_PATH}js/layuiList.js"></script>
  427. {/block}
  428. {block name='script'}
  429. <script>
  430. var id = {$id},
  431. special = <?=isset($special) ? $special : "{}"?>,
  432. liveInfo = <?=isset($liveInfo) ? $liveInfo : "{}"?>,
  433. special_type = <?=isset($special_type) ? $special_type : 6 ?>,
  434. live_time = '<?=date('Y-m-d H:i:s', time())?>';
  435. require(['vue', 'zh-cn', 'request', 'plupload', 'aliyun-oss', 'OssUpload'], function (Vue) {
  436. new Vue({
  437. el: "#app",
  438. directives: {
  439. sort: {
  440. bind: function (el, binding, vnode) {
  441. var vm = vnode.context;
  442. el.addEventListener('change', function () {
  443. if (!this.value || this.value < 0) {
  444. vm.formData.sort = 0;
  445. } else if (this.value > 9999) {
  446. vm.formData.sort = 9999;
  447. } else {
  448. vm.formData.sort = parseInt(this.value);
  449. }
  450. });
  451. }
  452. }
  453. },
  454. data: {
  455. subject_list: [],
  456. special_list: [],
  457. lecturer_list: [],
  458. special_type: special_type,
  459. formData: {
  460. storeIds: '',
  461. subjectIds: '',
  462. phrase: special.phrase || '',
  463. label: special.label || [],
  464. abstract: special.abstract || '',
  465. title: special.title || '',
  466. subject_id: special.subject_id || 0,
  467. lecturer_id: special.lecturer_id || 0,
  468. image: special.image || '',
  469. banner: special.banner || [],
  470. poster_image: special.poster_image || '',
  471. service_code: special.service_code || '',
  472. money: special.money || 0.00,
  473. pink_money: special.pink_money || 0.00,
  474. pink_number: special.pink_number || 0,
  475. pink_strar_time: special.pink_strar_time || '',
  476. pink_end_time: special.pink_end_time || '',
  477. fake_pink_number: special.fake_pink_number || 0,
  478. sort: special.sort || 0,
  479. is_mer_visible: special.is_mer_visible || 0,
  480. is_pink: special.is_pink || 0,
  481. is_fake_pink: special.is_fake_pink || 1,
  482. fake_sales: special.fake_sales || 0,
  483. validity: special.validity || 0,
  484. browse_count: special.browse_count || 0,
  485. pink_time: special.pink_time || 0,
  486. content: special.profile ? (special.profile.content || '') : '',
  487. is_remind: liveInfo.is_remind || 0,
  488. remind_time: liveInfo.remind_time,
  489. pay_type: special.pay_type || 0,
  490. live_time: liveInfo.start_play_time || live_time,
  491. live_duration: liveInfo.live_duration || 0,
  492. auto_phrase: liveInfo.auto_phrase || '',
  493. password: liveInfo.studio_pwd || '',
  494. qr_password: liveInfo.studio_pwd || '',
  495. check_source_sure: [],
  496. check_store_sure: [],
  497. is_recording: liveInfo.is_recording || 0,
  498. member_pay_type: special.member_pay_type == 1 ? 1 : 0,
  499. member_money: special.member_money || 0.00
  500. },
  501. but_title: '上传视频',
  502. link: '',
  503. label: '',
  504. host: ossUpload.host + '/',
  505. mask: {
  506. poster_image: false,
  507. image: false,
  508. service_code: false,
  509. },
  510. ue: null,
  511. is_video: false,
  512. //上传类型
  513. mime_types: {
  514. Image: "jpg,gif,png,JPG,GIF,PNG",
  515. Video: "mp4,MP4",
  516. },
  517. videoWidth: 0,
  518. //is_live:is_live,
  519. uploader: null,
  520. tabIndex: 0
  521. },
  522. watch:{
  523. 'formData.validity':function (v) {
  524. if (v.indexOf('.')!=-1) {
  525. return layList.msg('不能输入小数');
  526. }
  527. if(v<0) return layList.msg('不能小于0');
  528. if(v>99999) return layList.msg('不能大于99999');
  529. }
  530. },
  531. methods: {
  532. //取消
  533. cancelUpload: function () {
  534. this.uploader.stop();
  535. this.is_video = false;
  536. this.videoWidth = 0;
  537. },
  538. //删除图片
  539. delect: function (key, index) {
  540. var that = this;
  541. if (index != undefined) {
  542. that.formData[key].splice(index, 1);
  543. that.$set(that.formData, key, that.formData[key]);
  544. } else {
  545. that.$set(that.formData, key, '');
  546. }
  547. },
  548. //查看图片
  549. look: function (pic) {
  550. parent.$eb.openImage(pic);
  551. },
  552. //鼠标移入事件
  553. enter: function (item) {
  554. if (item) {
  555. item.is_show = true;
  556. } else {
  557. this.mask = true;
  558. }
  559. },
  560. //鼠标移出事件
  561. leave: function (item) {
  562. if (item) {
  563. item.is_show = false;
  564. } else {
  565. this.mask = false;
  566. }
  567. },
  568. changeIMG: function (key, value, multiple) {
  569. if (multiple) {
  570. var that = this;
  571. value.map(function (v) {
  572. that.formData[key].push({pic: v, is_show: false});
  573. });
  574. this.$set(this.formData, key, this.formData[key]);
  575. } else {
  576. this.$set(this.formData, key, value);
  577. }
  578. },
  579. uploadVideo: function () {
  580. var link = this.link.trim();
  581. if (link) {
  582. if (link.indexOf('http') || link.indexOf('mp4') !== link.length - 3) {
  583. layui.layer.msg('请输入正确的视频链接', {icon: 5});
  584. } else {
  585. this.setContent(this.link);
  586. }
  587. }
  588. },
  589. setContent: function (link) {
  590. this.formData.link = link;
  591. this.ue.setContent('<div><video style="width: 100%" src="' + link + '" class="video-ue" controls="controls"><source src="' + link + '"></source></video></div><span style="color:white">.</span>', true);
  592. },
  593. //上传图片
  594. upload: function (key, count) {
  595. ossUpload.createFrame('请选择图片', {fodder: key, max_count: count === undefined ? 0 : count}, {w:800,h:550});
  596. },
  597. get_subject_list: function () {
  598. var that = this;
  599. layList.baseGet(layList.U({a: 'get_subject_list'}), function (res) {
  600. that.$set(that, 'subject_list', res.data);
  601. that.$nextTick(function () {
  602. layList.form.render('select');
  603. })
  604. });
  605. },
  606. get_special_list: function () {
  607. var that = this;
  608. layList.baseGet(layList.U({
  609. c: 'live.aliyun_live',
  610. a: 'get_special_list',
  611. p: {live_goods_list: true}
  612. }), function (res) {
  613. that.$set(that, 'special_list', res.data);
  614. });
  615. },
  616. delLabel: function (index) {
  617. this.formData.label.splice(index, 1);
  618. this.$set(this.formData, 'label', this.formData.label);
  619. },
  620. addLabrl: function () {
  621. if (this.label) {
  622. if (this.label.length > 6) return layList.msg('您输入的标签字数太长');
  623. var length = this.formData.label.length;
  624. if (length >= 2) return layList.msg('标签最多添加2个');
  625. for (var i = 0; i < length; i++) {
  626. if (this.formData.label[i] == this.label) return layList.msg('请勿重复添加');
  627. }
  628. this.formData.label.push(this.label);
  629. this.$set(this.formData, 'label', this.formData.label);
  630. this.label = '';
  631. }
  632. },
  633. save: function () {
  634. var that = this, banner = new Array();
  635. that.formData.content = that.ue.getContent();
  636. if (!that.formData.title) return layList.msg('请输入直播名称');
  637. if (!that.formData.subject_id) return layList.msg('请选择课程分类');
  638. if (!that.formData.abstract) return layList.msg('请输入直播说明');
  639. if (!that.formData.label.length) return layList.msg('请输入标签');
  640. if (!that.formData.image) return layList.msg('请上传专题封面');
  641. if (!that.formData.banner.length) return layList.msg('请上传banner图,最少1张');
  642. if (!that.formData.poster_image) return layList.msg('请上传推广海报');
  643. if (that.formData.validity < 0) return layList.msg('专题有效期不能小于0');
  644. if (that.formData.validity > 99999) return layList.msg('专题有效期不能大于99999');
  645. if ((that.formData.validity+'').indexOf('.')!=-1) return layList.msg('专题有效期不能为小数');
  646. if (!that.formData.content) return layList.msg('请编辑内容在进行保存');
  647. if (that.formData.is_pink) {
  648. if (!that.formData.pink_money) return layList.msg('请填写拼团金额');
  649. if (!that.formData.pink_number) return layList.msg('请填写拼团人数');
  650. if (!that.formData.pink_strar_time) return layList.msg('请选择拼团开始时间');
  651. if (!that.formData.pink_end_time) return layList.msg('请选择拼团结束时间');
  652. if (!that.formData.pink_time) return layList.msg('请填写拼团时间');
  653. if (that.formData.is_fake_pink && !that.formData.fake_pink_number) return layList.msg('请填写补齐比例');
  654. }
  655. if (that.formData.pay_type == 2) {
  656. if (!that.formData.password) return layList.msg('请输入直播间密码');
  657. if (!that.formData.qr_password) return layList.msg('请输入直播间密码');
  658. if (that.formData.password != that.formData.qr_password) return layList.msg('两次输入的密码不一致');
  659. }
  660. if (that.formData.pay_type == 1) {
  661. if (!that.formData.money || that.formData.money == 0.00) return layList.msg('请填写购买金额');
  662. }
  663. if (that.formData.member_pay_type == 1) {
  664. if (!that.formData.member_money || that.formData.member_money == 0.00) return layList.msg('请填写会员购买金额');
  665. }
  666. if (typeof that.formData.live_duration === 'number') {
  667. if (Number(that.formData.live_duration) <= 0) {
  668. return layList.msg('直播时长不小于0');
  669. }
  670. }
  671. if (that.formData.live_duration) {
  672. if (Number(that.formData.live_duration) <= 0) {
  673. return layList.msg('直播时长不小于0');
  674. }
  675. } else {
  676. return layList.msg('请输入直播时长');
  677. }
  678. that.formData.subjectIds = JSON.stringify(that.formData.check_source_sure);
  679. that.formData.storeIds = JSON.stringify(that.formData.check_store_sure);
  680. var data={};
  681. for (var key in that.formData) {
  682. if (key !== 'check_source_sure' || key !== 'check_store_sure') {
  683. data[key] = that.formData[key]
  684. }
  685. }
  686. layList.loadFFF();
  687. layList.basePost(layList.U({
  688. a: 'save_special',
  689. q: {id: id, special_type: that.special_type}
  690. }), data, function (res) {
  691. layList.loadClear();
  692. if (parseInt(id) == 0) {
  693. layList.layer.confirm('添加成功,您要继续添加专题吗?', {
  694. btn: ['继续添加', '立即提交'] //按钮
  695. }, function (index) {
  696. layList.layer.close(index);
  697. }, function () {
  698. parent.layer.closeAll();
  699. });
  700. } else {
  701. layList.msg('修改成功', function () {
  702. parent.layer.closeAll();
  703. })
  704. }
  705. }, function (res) {
  706. layList.msg(res.msg);
  707. layList.loadClear();
  708. });
  709. },
  710. clone_form: function () {
  711. var that = this;
  712. parent.layer.closeAll();
  713. },
  714. //素材
  715. search_task: function () {
  716. var that = this;
  717. var url = "{:Url('special.special_type/special_task')}?special_id=" + id + "&special_type={$special_type}";
  718. var title = '选择专题';
  719. that.searchTask = true;
  720. layer.open({
  721. type: 2 //Page层类型
  722. , area: ['80%', '90%']
  723. , title: title
  724. , shade: 0.6 //遮罩透明度
  725. , maxmin: true //允许全屏最小化
  726. , anim: 1 //0-6的动画形式,-1不开启
  727. , content: url,
  728. btn: '确定',
  729. btnAlign: 'c', //按钮居中
  730. closeBtn: 1,
  731. yes: function () {
  732. layer.closeAll();
  733. var source_tmp = $("#check_source_tmp").val();
  734. that.source_tmp_list = JSON.parse(source_tmp);
  735. var array=that.formData.check_source_sure;
  736. that.formData.check_source_sure=array.concat(JSON.parse(source_tmp));
  737. that.formData.check_source_sure=that.duplicate_removal(that.formData.check_source_sure);
  738. that.show_source_list();
  739. }
  740. });
  741. },
  742. duplicate_removal:function(array)
  743. {
  744. var new_arr=[];
  745. var check_source_sure=[];
  746. for(var i=0;i<array.length;i++) {
  747. var items=array[i];
  748. var id=array[i].id;
  749. if($.inArray(id,new_arr)==-1) {
  750. new_arr.push(id);
  751. check_source_sure.push(items);
  752. }
  753. }
  754. return check_source_sure;
  755. },
  756. add_source:function(title,special_type){
  757. var url="{:Url('special.special_type/add')}?special_type="+special_type;
  758. layer.open({
  759. type: 2 //Page层类型
  760. ,area: ['90%', '95%']
  761. ,title: title
  762. ,shade: 0.6 //遮罩透明度
  763. ,maxmin: true //允许全屏最小化
  764. ,anim: 1 //0-6的动画形式,-1不开启
  765. ,content: url
  766. ,end:function () {
  767. layer.closeAll();
  768. }
  769. });
  770. },
  771. add_single_source:function(){
  772. var that=this;
  773. var url="{:Url('special.special_type/single_add')}?special_type=6";
  774. var title='添加图文专题';
  775. layer.open({
  776. type: 2 //Page层类型
  777. ,area: ['90%', '95%']
  778. ,title: title
  779. ,shade: 0.6 //遮罩透明度
  780. ,maxmin: true //允许全屏最小化
  781. ,anim: 1 //0-6的动画形式,-1不开启
  782. ,content: url
  783. ,end:function () {
  784. layer.closeAll();
  785. }
  786. });
  787. },
  788. add_store:function(){
  789. var url="{:Url('store.store_product/create')}";
  790. var title='添加实体商品';
  791. layer.open({
  792. type: 2 //Page层类型
  793. ,area: ['90%', '95%']
  794. ,title: title
  795. ,shade: 0.6 //遮罩透明度
  796. ,maxmin: true //允许全屏最小化
  797. ,anim: 1 //0-6的动画形式,-1不开启
  798. ,content: url
  799. ,end:function () {
  800. layer.closeAll();
  801. }
  802. });
  803. },
  804. show_source_list: function () {
  805. var that = this;
  806. var table = layui.table, form = layui.form;
  807. table.render({
  808. elem: '#showSourceList',
  809. id: 'idTest',
  810. cols: [[
  811. {field: 'id', title: '编号', align: 'center',width:60},
  812. {field: 'title', title: '课程',align: 'center'},
  813. {field: 'sort', title: '排序',edit:'sort',align: 'center'},
  814. {
  815. field: 'image',
  816. title: '封面',
  817. templet: '<div><img src="{{ d.image }}" style="width: 80px;height: 40px;"></div>',
  818. align: 'center'
  819. },
  820. {field: 'is_mer_visible', title: '仅会员可见',align: 'center',templet:function(d){
  821. var is_checked = d.is_mer_visible == 1 ? "checked" : "";
  822. return "<input type='checkbox' disabled name='is_mer_visible' lay-skin='switch' value='"+d.id+"' lay-text='是|否' "+is_checked+">";
  823. }},
  824. {field: 'right', title: '状态', align: 'center', templet:function(d){
  825. return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon">&#xe640;</i> 移除</a>';
  826. }}
  827. ]],
  828. data: (Object.keys(that.formData.check_source_sure).length > 0) ? that.formData.check_source_sure : [],
  829. page: {
  830. theme: '#0092DC'
  831. }
  832. });
  833. //监听单元格编辑
  834. table.on('edit(showSourceList)', function(obj){
  835. var id=obj.data.id,values=obj.value;
  836. switch (obj.field) {
  837. case 'sort':
  838. if (that.formData.check_source_sure) {
  839. $.each(that.formData.check_source_sure, function(index, value){
  840. if(value.id == id){
  841. that.formData.check_source_sure[index].sort = values;
  842. }
  843. })
  844. }
  845. break;
  846. }
  847. });
  848. //监听素材是否删除
  849. table.on('tool(showSourceList)', function(obj){
  850. var data = obj.data;
  851. if(obj.event === 'del'){
  852. if (that.formData.check_source_sure) {
  853. for(var i=0;i<that.formData.check_source_sure.length;i++){
  854. if(that.formData.check_source_sure[i].id==data.id){
  855. that.formData.check_source_sure.splice(i,1);
  856. }
  857. }
  858. that.formData.check_source_sure=that.formData.check_source_sure;
  859. that.show_source_list();
  860. }
  861. }
  862. });
  863. },
  864. //商品
  865. store_task: function () {
  866. var that = this;
  867. var url = "{:Url('special.special_type/store_task')}?special_id=" + id;
  868. var title = '选择商品';
  869. that.searchTask = true;
  870. layer.open({
  871. type: 2 //Page层类型
  872. , area: ['80%', '90%']
  873. , title: title
  874. , shade: 0.6 //遮罩透明度
  875. , maxmin: true //允许全屏最小化
  876. , anim: 1 //0-6的动画形式,-1不开启
  877. , content: url,
  878. btn: '确定',
  879. btnAlign: 'c', //按钮居中
  880. closeBtn: 1,
  881. yes: function () {
  882. layer.closeAll();
  883. var source_tmp = $("#check_store_tmp").val();
  884. var array=that.formData.check_store_sure;
  885. that.formData.check_store_sure=array.concat(JSON.parse(source_tmp));
  886. that.formData.check_store_sure=that.duplicate_removal(that.formData.check_store_sure);
  887. that.show_store_list();
  888. }
  889. });
  890. },
  891. show_store_list: function () {
  892. var that = this;
  893. var table = layui.table, form = layui.form;
  894. table.render({
  895. elem: '#showStoreList',
  896. id: 'idTests',
  897. cols: [[
  898. {field: 'id', title: '编号', align: 'center',width:60},
  899. {field: 'store_name', title: '商品名称',align: 'center'},
  900. {field: 'sort', title: '排序',edit:'sort',align: 'center'},
  901. {
  902. field: 'image',
  903. title: '封面',
  904. templet: '<div><img src="{{ d.image }}" style="width: 80px;height: 40px;"></div>',
  905. align: 'center'
  906. },
  907. {field: 'price', title: '价格', align: 'center'},
  908. {field: 'sales', title: '销量', align: 'center'},
  909. {field: 'right', title: '状态', align: 'center', templet:function(d){
  910. return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon">&#xe640;</i> 移除</a>';
  911. }}
  912. ]],
  913. data: (Object.keys(that.formData.check_store_sure).length > 0) ? that.formData.check_store_sure : [],
  914. page: {
  915. theme: '#0092DC'
  916. }
  917. });
  918. //监听单元格编辑
  919. table.on('edit(showStoreList)', function(obj){
  920. var id=obj.data.id,values=obj.value;
  921. switch (obj.field) {
  922. case 'sort':
  923. if (that.formData.check_store_sure) {
  924. $.each(that.formData.check_store_sure, function(index, value){
  925. if(value.id == id){
  926. that.formData.check_store_sure[index].sort = values;
  927. }
  928. })
  929. }
  930. break;
  931. }
  932. });
  933. //监听素材是否删除
  934. table.on('tool(showStoreList)', function(obj){
  935. var data = obj.data;
  936. if(obj.event === 'del'){
  937. if (that.formData.check_store_sure) {
  938. for (var i = 0; i < that.formData.check_store_sure.length; i++) {
  939. if (that.formData.check_store_sure[i].id == data.id) {
  940. that.formData.check_store_sure.splice(i, 1);
  941. }
  942. }
  943. that.formData.check_store_sure = that.formData.check_store_sure;
  944. that.show_store_list();
  945. }
  946. }
  947. });
  948. },
  949. get_check_source_sure:function () {
  950. var that = this;
  951. layList.baseGet(layList.U({a: 'get_check_source_sure',q: {id: id, special_type:"{$special_type}"}}), function (res) {
  952. that.formData.check_source_sure=res.data.sourceCheckList;
  953. that.formData.check_store_sure=res.data.storeCheckList;
  954. that.show_source_list();
  955. that.show_store_list();
  956. });
  957. },
  958. // 上一步、下一步
  959. tabChange: function (value) {
  960. layui.element.tabChange('tab', (this.tabIndex || 0) + value);
  961. }
  962. },
  963. mounted: function () {
  964. var that = this;
  965. window.changeIMG = that.changeIMG;
  966. //实例化form
  967. layList.date({
  968. elem: '#live_time', type: 'datetime', done: function (value) {
  969. that.formData.live_time = value;
  970. }
  971. });
  972. layList.date({
  973. elem: '#start_time', type: 'datetime', done: function (value) {
  974. that.formData.pink_strar_time = value;
  975. }
  976. });
  977. layList.date({
  978. elem: '#end_time', type: 'datetime', done: function (value) {
  979. that.formData.pink_end_time = value;
  980. }
  981. });
  982. //选择图片
  983. function changeIMG(index, pic) {
  984. $(".image_img").css('background-image', "url(" + pic + ")");
  985. $(".active").css('background-image', "url(" + pic + ")");
  986. $('#image_input').val(pic);
  987. }
  988. //选择图片插入到编辑器中
  989. window.insertEditor = function (list) {
  990. that.ue.execCommand('insertimage', list);
  991. };
  992. this.$nextTick(function () {
  993. layList.form.render();
  994. layui.element.on('tab(tab)', function (data) {
  995. layui.table.resize('idTests');
  996. layui.table.resize('idTest');
  997. that.tabIndex = data.index;
  998. });
  999. //实例化编辑器
  1000. UE.registerUI('选择图片', function (editor, uiName) {
  1001. var btn = new UE.ui.Button({
  1002. name: uiName,
  1003. title: uiName,
  1004. cssRules: 'background-position: -380px 0;',
  1005. onclick: function() {
  1006. ossUpload.createFrame(uiName, { fodder: editor.key }, { w: 800, h: 550 });
  1007. }
  1008. });
  1009. return btn;
  1010. });
  1011. that.ue = UE.getEditor('editor');
  1012. });
  1013. //获取科目
  1014. that.get_subject_list();
  1015. that.get_check_source_sure();
  1016. //图片上传和视频上传
  1017. layList.form.on('radio(is_pink)', function (data) {
  1018. that.formData.is_pink = parseInt(data.value);
  1019. });
  1020. layList.form.on('radio(is_remind)', function (data) {
  1021. that.formData.is_remind = parseInt(data.value);
  1022. });
  1023. layList.form.on('radio(is_recording)', function (data) {
  1024. that.formData.is_recording = parseInt(data.value);
  1025. });
  1026. layList.form.on('radio(is_mer_visible)', function (data) {
  1027. that.formData.is_mer_visible = parseInt(data.value);
  1028. });
  1029. layList.form.on('radio(pay_type)', function (data) {
  1030. that.formData.pay_type = parseInt(data.value);
  1031. if (that.formData.pay_type != 1) {
  1032. that.formData.is_pink = 0;
  1033. that.formData.member_pay_type = 0;
  1034. that.formData.member_money = 0;
  1035. };
  1036. that.$nextTick(function () {
  1037. layList.form.render('radio');
  1038. });
  1039. });
  1040. layList.form.on('radio(member_pay_type)', function (data) {
  1041. that.formData.member_pay_type = parseInt(data.value);
  1042. if (that.formData.member_pay_type != 1) {
  1043. that.formData.member_money = 0;
  1044. };
  1045. that.$nextTick(function () {
  1046. layList.form.render('radio');
  1047. });
  1048. });
  1049. layList.select('subject_id', function (obj) {
  1050. that.formData.subject_id = obj.value;
  1051. });
  1052. layList.form.on('radio(is_fake_pink)', function (data) {
  1053. that.formData.is_fake_pink = parseInt(data.value);
  1054. });
  1055. that.$nextTick(function () {
  1056. that.uploader = ossUpload.upload({
  1057. id: 'ossupload',
  1058. mime_types: [
  1059. {title: "Mp4 files", extensions: "mp4"}
  1060. ],
  1061. FilesAddedSuccess: function () {
  1062. that.is_video = true;
  1063. },
  1064. uploadIng: function (file) {
  1065. that.videoWidth = file.percent;
  1066. },
  1067. success: function (res) {
  1068. layList.msg('上传成功');
  1069. that.videoWidth = 0;
  1070. that.is_video = false;
  1071. that.setContent(res.url);
  1072. },
  1073. fail: function (err) {
  1074. that.videoWidth = 0;
  1075. that.is_video = false;
  1076. layList.msg(err);
  1077. }
  1078. })
  1079. });
  1080. }
  1081. })
  1082. })
  1083. </script>
  1084. {/block}