add.php 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  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. <!-- 基本设置 -->
  60. <div class="layui-tab-item layui-show">
  61. <div class="layui-form-item required">
  62. <label class="layui-form-label">专栏名称:</label>
  63. <div class="layui-input-block">
  64. <input type="text" name="title" v-model.trim="formData.title" autocomplete="off" placeholder="请输入专栏名称" maxlength="30" class="layui-input">
  65. </div>
  66. </div>
  67. <div class="layui-form-item required">
  68. <label class="layui-form-label">课程分类:</label>
  69. <div class="layui-input-block">
  70. <select name="subject_id" v-model="formData.subject_id" lay-search="" lay-filter="subject_id">
  71. <option value="0">请选分类</option>
  72. <option v-for="item in subject_list" :value="item.id" :disabled="item.grade_id==0 ? true : false">{{item.html}}{{item.name}}</option>
  73. </select>
  74. </div>
  75. </div>
  76. <div class="layui-form-item required">
  77. <label class="layui-form-label">专栏简介:</label>
  78. <div class="layui-input-block">
  79. <textarea placeholder="请输入专栏简介" v-model="formData.abstract" class="layui-textarea"></textarea>
  80. </div>
  81. </div>
  82. <div class="layui-form-item required">
  83. <label class="layui-form-label">专栏标签:</label>
  84. <div class="layui-input-inline">
  85. <input type="text" v-model="label" name="price_min" placeholder="最多6个字" autocomplete="off" maxlength="6" class="layui-input">
  86. </div>
  87. <div class="layui-input-inline" style="width: auto;">
  88. <button type="button" class="layui-btn layui-btn-normal" @click="addLabrl" >
  89. <i class="layui-icon">&#xe654;</i>
  90. </button>
  91. </div>
  92. <div class="layui-form-mid layui-word-aux">输入标签名称后点击”+“号按钮添加;最多写入6个字;点击标签即可删除</div>
  93. </div>
  94. <div v-if="formData.label.length" class="layui-form-item">
  95. <div class="layui-input-block">
  96. <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>
  97. </div>
  98. </div>
  99. <div class="layui-form-item required">
  100. <label class="layui-form-label">专栏封面:(250*140)</label>
  101. <div class="layui-input-block">
  102. <div class="upload-image-box" v-if="formData.image">
  103. <img :src="formData.image" alt="">
  104. <div class="mask">
  105. <p><i class="fa fa-eye" @click="look(formData.image)"></i>
  106. <i class="fa fa-trash-o" @click="delect('image')"></i></p>
  107. </div>
  108. </div>
  109. <div class="upload-image" v-show="!formData.image" @click="upload('image')">
  110. <div class="fiexd"><i class="fa fa-plus"></i></div>
  111. <p>选择图片</p>
  112. </div>
  113. </div>
  114. </div>
  115. <div class="layui-form-item required">
  116. <label class="layui-form-label">专栏Banner:(750*420)</label>
  117. <div class="layui-input-block">
  118. <div class="upload-image-box" v-if="formData.banner.length" v-for="(item,index) in formData.banner">
  119. <img :src="item.pic" alt="">
  120. <div class="mask">
  121. <p><i class="fa fa-eye" @click="look(item.pic)"></i>
  122. <i class="fa fa-trash-o" @click="delect('banner',index)"></i>
  123. </p>
  124. </div>
  125. </div>
  126. <div class="upload-image" v-show="formData.banner.length < 5" @click="upload('banner',5 - formData.banner.length)">
  127. <div class="fiexd"><i class="fa fa-plus"></i></div>
  128. <p>选择图片</p>
  129. </div>
  130. </div>
  131. </div>
  132. <div class="layui-form-item required">
  133. <label class="layui-form-label">推广海报:(600*740)</label>
  134. <div class="layui-input-block">
  135. <div class="upload-image-box" v-if="formData.poster_image">
  136. <img :src="formData.poster_image" alt="">
  137. <div class="mask">
  138. <p><i class="fa fa-eye" @click="look(formData.poster_image)"></i>
  139. <i class="fa fa-trash-o" @click="delect('poster_image')"></i>
  140. </p>
  141. </div>
  142. </div>
  143. <div class="upload-image" v-show="!formData.poster_image" @click="upload('poster_image')">
  144. <div class="fiexd"><i class="fa fa-plus"></i></div>
  145. <p>选择图片</p>
  146. </div>
  147. </div>
  148. </div>
  149. <!-- <div class="layui-form-item">
  150. <label class="layui-form-label">客服二维码:(200*200)</label>
  151. <div class="layui-input-block">
  152. <div class="upload-image-box" v-if="formData.service_code">
  153. <img :src="formData.service_code" alt="">
  154. <div class="mask">
  155. <p>
  156. <i class="fa fa-eye" @click="look(formData.service_code)"></i>
  157. <i class="fa fa-trash-o" @click="delect('service_code')"></i>
  158. </p>
  159. </div>
  160. </div>
  161. <div class="upload-image" v-show="!formData.service_code" @click="upload('service_code')">
  162. <div class="fiexd"><i class="fa fa-plus"></i></div>
  163. <p>选择图片</p>
  164. </div>
  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="text" name="title" v-model="link" style="width:50%;display:inline-block;margin-right: 10px;" autocomplete="off" placeholder="请输入视频链接" class="layui-input">
  171. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" @click="uploadVideo()">确认添加
  172. </button>
  173. <button type="button" class="layui-btn layui-btn-sm layui-btn-normal" id="ossupload">上传视频
  174. </button>
  175. </div>
  176. <input type="file" name="video" v-show="" ref="video">
  177. <div class="layui-input-block" style="width: 50%;margin-top: 20px" v-show="is_video">
  178. <div class="layui-progress" style="margin-bottom: 10px">
  179. <div class="layui-progress-bar layui-bg-blue" :style="'width:'+videoWidth+'%'"></div>
  180. </div>
  181. <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" @click="cancelUpload">取消</button>
  182. </div>
  183. <div class="layui-form-mid layui-word-aux">输入链接将视为添加视频直接添加,请确保视频链接的正确性</div>
  184. </div>
  185. <div class="layui-form-item required">
  186. <label class="layui-form-label">专栏详情:</label>
  187. <div class="layui-input-block">
  188. <textarea id="editor">{{formData.content}}</textarea>
  189. </div>
  190. </div>
  191. </div>
  192. <div class="layui-tab-item">
  193. <div class="layui-form-item">
  194. <label class="layui-form-label">有效期(天):</label>
  195. <div class="layui-input-block">
  196. <input style="width: 300px" type="number" name="validity" lay-verify="number" v-model="formData.validity" autocomplete="off" class="layui-input" min="0" max="99999">
  197. </div>
  198. <p style="color: red;">有效期为用户购买后可以观看时间,0为时间不限;【注:专栏设置有效期后,下列选择的专题的有效期会和专栏保持一致,请谨慎设置】</p>
  199. </div>
  200. <div class="layui-form-item">
  201. <label class="layui-form-label">仅会员可见:</label>
  202. <div class="layui-input-block">
  203. <input type="radio" name="is_mer_visible" lay-filter="is_mer_visible" v-model="formData.is_mer_visible" value="1" title="是">
  204. <input type="radio" name="is_mer_visible" lay-filter="is_mer_visible" v-model="formData.is_mer_visible" value="0" title="否">
  205. </div>
  206. <p style="color: red;">注:"所有人"都可观看的专栏下不能加"仅会员"可见的专题。</p>
  207. </div>
  208. <div class="layui-form-item">
  209. <label class="layui-form-label">素材排序方式:</label>
  210. <div class="layui-input-block">
  211. <input type="radio" name="sort_order" lay-filter="sort_order" v-model="formData.sort_order" value="1" title="正序">
  212. <input type="radio" name="sort_order" lay-filter="sort_order" v-model="formData.sort_order" value="0" title="倒序">
  213. </div>
  214. </div>
  215. <div class="layui-form-item">
  216. <label class="layui-form-label">专题选择:</label>
  217. <div class="layui-input-block">
  218. <input type="hidden" id="check_source_tmp" name="check_source_tmp"/>
  219. <button type="button" class="layui-btn layui-btn-normal" @click='search_task'>
  220. 选择专题
  221. </button>
  222. <table class="layui-hide" id="List" lay-filter="List"></table>
  223. </div>
  224. </div>
  225. <div class="layui-form-item">
  226. <label class="layui-form-label">添加专题:</label>
  227. <div class="layui-input-block">
  228. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加视频专题',3)">
  229. 添加视频专题
  230. </button>
  231. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加音频专题',2)">
  232. 添加音频专题
  233. </button>
  234. <button type="button" class="layui-btn layui-btn-normal" @click="add_source('添加图文专题',1)">
  235. 添加图文专题
  236. </button>
  237. <button type="button" class="layui-btn layui-btn-normal" @click='add_single_source'>
  238. 添加轻专题
  239. </button>
  240. <div class="layui-form-mid layui-word-aux" style="float: none;display: inline-block;">如专题列表中没有,可点击此添加</div>
  241. <br/>
  242. <p style="color: red;">注:选择的专题付费方式需要和专栏专题的付费方式保持一致,如:专栏是会员免费,则选择的专题也需要设置成会员免费;若未设置则会被强制修改。</p>
  243. </div>
  244. </div>
  245. <div class="layui-form-item">
  246. <label class="layui-form-label">专题展示:</label>
  247. <div class="layui-input-block">
  248. <input type="hidden" id="check_source_sure" name="check_source_sure"/>
  249. <table class="layui-hide" id="showSourceList" lay-filter="showSourceList"></table>
  250. </div>
  251. </div>
  252. </div>
  253. <div class="layui-tab-item">
  254. <!-- <div class="layui-form-item">-->
  255. <!-- <label class="layui-form-label">专题章节:</label>-->
  256. <!-- <div class="layui-input-inline">-->
  257. <!-- <input type="number" name="sum" lay-verify="sum" v-model="formData.sum"-->
  258. <!-- autocomplete="off" class="layui-input" min="0" max="99999">-->
  259. <!-- </div>-->
  260. <!-- <div class="layui-form-mid">节</div>-->
  261. <!-- </div>-->
  262. <div class="layui-form-item">
  263. <label class="layui-form-label">专题排序:</label>
  264. <div class="layui-input-inline">
  265. <input type="number" name="sort" v-model="formData.sort" autocomplete="off" min="0"
  266. class="layui-input" v-sort>
  267. </div>
  268. </div>
  269. <div class="layui-form-item">
  270. <label class="layui-form-label">虚拟学习人数:</label>
  271. <div class="layui-input-inline">
  272. <input type="number" name="fake_sales" v-model="formData.fake_sales"
  273. autocomplete="off" min="0" class="layui-input">
  274. </div>
  275. </div>
  276. </div>
  277. <!-- 价格设置 -->
  278. <div class="layui-tab-item">
  279. <div class="layui-form-item">
  280. <label class="layui-form-label">付费方式:</label>
  281. <div class="layui-input-block">
  282. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="1" title="付费">
  283. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="0" title="免费">
  284. </div>
  285. </div>
  286. <div class="layui-form-item" v-show="formData.pay_type == 1">
  287. <label class="layui-form-label">购买金额:</label>
  288. <div class="layui-input-inline">
  289. <input type="number" name="money" lay-verify="number" v-model="formData.money" autocomplete="off" class="layui-input">
  290. </div>
  291. </div>
  292. <!-- <div class="layui-form-item" v-show="formData.pay_type == 1">
  293. <label class="layui-form-label">会员付费方式:</label>
  294. <div class="layui-input-block">
  295. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="1" title="付费">
  296. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="0" title="免费">
  297. </div>
  298. </div>
  299. <div class="layui-form-item" v-show="formData.member_pay_type == 1">
  300. <label class="layui-form-label">会员购买金额:</label>
  301. <div class="layui-input-inline">
  302. <input type="number" name="member_money" lay-verify="number" v-model="formData.member_money" autocomplete="off" class="layui-input" min="0">
  303. </div>
  304. </div>
  305. <div class="layui-form-item" v-show="formData.pay_type == 1">
  306. <label class="layui-form-label">拼团状态:</label>
  307. <div class="layui-input-block">
  308. <input type="radio" name="is_pink" lay-filter="is_pink" v-model="formData.is_pink" value="1" title="开启">
  309. <input type="radio" name="is_pink" lay-filter="is_pink" v-model="formData.is_pink" value="0" title="关闭" checked="">
  310. </div>
  311. </div>
  312. <div class="layui-form-item" v-show="formData.is_pink">
  313. <div class="layui-inline">
  314. <label class="layui-form-label">拼团金额:</label>
  315. <div class="layui-input-inline">
  316. <input type="number" name="pink_money" v-model="formData.pink_money" autocomplete="off" class="layui-input">
  317. </div>
  318. </div>
  319. <div class="layui-inline">
  320. <label class="layui-form-label">拼团人数:</label>
  321. <div class="layui-input-inline">
  322. <input type="number" name="pink_number" v-model="formData.pink_number" autocomplete="off" class="layui-input">
  323. </div>
  324. </div>
  325. </div>
  326. <div class="layui-form-item" v-show="formData.is_pink">
  327. <div class="layui-inline">
  328. <label class="layui-form-label">开始时间:</label>
  329. <div class="layui-input-inline">
  330. <input type="text" name="pink_strar_time" v-model="formData.pink_strar_time" id="start_time" autocomplete="off" class="layui-input">
  331. </div>
  332. </div>
  333. <div class="layui-inline">
  334. <label class="layui-form-label">结束时间:</label>
  335. <div class="layui-input-inline">
  336. <input type="text" name="pink_end_time" v-model="formData.pink_end_time" id="end_time" autocomplete="off" class="layui-input">
  337. </div>
  338. </div>
  339. </div>
  340. <div class="layui-form-item" v-show="formData.is_pink">
  341. <label class="layui-form-label">拼团时间:</label>
  342. <div class="layui-input-inline">
  343. <input type="number" v-model="formData.pink_time" autocomplete="off" class="layui-input">
  344. </div>
  345. <div class="layui-form-mid">小时</div>
  346. </div>
  347. <div class="layui-form-item" v-show="formData.is_pink">
  348. <label class="layui-form-label">模拟成团:</label>
  349. <div class="layui-input-block">
  350. <input type="radio" name="is_fake_pink" lay-filter="is_fake_pink" v-model="formData.is_fake_pink" value="1" title="开启" checked="">
  351. <input type="radio" name="is_fake_pink" lay-filter="is_fake_pink" v-model="formData.is_fake_pink" value="0" title="关闭">
  352. </div>
  353. </div>
  354. <div class="layui-form-item" v-show="formData.is_fake_pink && formData.is_pink">
  355. <label class="layui-form-label">补齐比例:</label>
  356. <div class="layui-input-inline">
  357. <input type="number" v-model="formData.fake_pink_number" autocomplete="off" class="layui-input">
  358. </div>
  359. <div class="layui-form-mid" style="color: red;">注:可设置成团的补齐比例,拼团结束前实际拼团人数达不到拼团要求时,可根据补齐比例自动添加人数,达到拼团成功的目的</div>
  360. </div> -->
  361. </div>
  362. </div>
  363. </div>
  364. <div class="layui-form-item">
  365. <div class="layui-input-block">
  366. <button type="button" class="layui-btn layui-btn-primary" @click="clone_form">取消</button>
  367. <button v-show="tabIndex" type="button" class="layui-btn layui-btn-primary" @click="tabChange(-1)">上一步</button>
  368. <button v-show="tabIndex != 3" type="button" class="layui-btn layui-btn-normal" @click="tabChange(1)">下一步</button>
  369. <button v-show="tabIndex == 3" type="button" class="layui-btn layui-btn-normal" @click="save">{$id ?'确认修改':'立即提交'}</button>
  370. </div>
  371. </div>
  372. </form>
  373. </div>
  374. </div>
  375. </div>
  376. <script type="text/javascript" src="{__ADMIN_PATH}js/layuiList.js"></script>
  377. {/block}
  378. {block name='script'}
  379. <script>
  380. var id = {$id},special =<?=isset($special) ? $special : "{}"?>;
  381. require(['vue','zh-cn','request','plupload','aliyun-oss','OssUpload'], function (Vue) {
  382. new Vue({
  383. el: "#app",
  384. directives: {
  385. sort: {
  386. bind: function (el, binding, vnode) {
  387. var vm = vnode.context;
  388. el.addEventListener('change', function () {
  389. if (!this.value || this.value < 0) {
  390. vm.formData.sort = 0;
  391. } else if (this.value > 9999) {
  392. vm.formData.sort = 9999;
  393. } else {
  394. vm.formData.sort = parseInt(this.value);
  395. }
  396. });
  397. }
  398. }
  399. },
  400. data: {
  401. subject_list: [],
  402. source_tmp_list: [],//用于子页父业选中素材传值的临时变量
  403. source_list: [],
  404. lecturer_list: [],
  405. formData: {
  406. subjectIds:'',
  407. phrase: special.phrase || '',
  408. label: special.label || [],
  409. abstract: special.abstract || '',
  410. title: special.title || '',
  411. subject_id: special.subject_id || 0,
  412. lecturer_id: special.lecturer_id || 0,
  413. task_id: 0,
  414. sum: special.sum || 0,
  415. image: special.image || '',
  416. banner: special.banner || [],
  417. poster_image: special.poster_image || '',
  418. service_code: special.service_code || '',
  419. money: special.money || 0.00,
  420. pink_money: special.pink_money || 0.00,
  421. pink_number: special.pink_number || 0,
  422. pink_strar_time: special.pink_strar_time || '',
  423. pink_end_time: special.pink_end_time || '',
  424. fake_pink_number: special.fake_pink_number || 0,
  425. sort: special.sort || 0,
  426. is_mer_visible: special.is_mer_visible || 0,
  427. is_pink: special.is_pink || 0,
  428. is_fake_pink: special.is_fake_pink || 1,
  429. fake_sales: special.fake_sales || 0,
  430. validity: special.validity || 0,
  431. browse_count: special.browse_count || 0,
  432. pink_time: special.pink_time || 0,
  433. content: special.profile ? (special.profile.content || '') : '',
  434. check_source_sure: [],
  435. check_store_sure: [],
  436. sort_order:special.sort_order || 0,
  437. pay_type: special.pay_type == 1 ? 1 : 0,
  438. member_pay_type: special.member_pay_type == 1 ? 1 : 0,
  439. member_money: special.member_money || 0.00,
  440. link:special.link || ''
  441. },
  442. but_title: '上传视频',
  443. link: '',
  444. label: '',
  445. host: ossUpload.host + '/',
  446. mask: {
  447. poster_image: false,
  448. image: false,
  449. service_code: false,
  450. },
  451. ue: null,
  452. is_video: false,
  453. //上传类型
  454. mime_types: {
  455. Image: "jpg,gif,png,JPG,GIF,PNG",
  456. Video: "mp4,MP4",
  457. },
  458. videoWidth: 0,
  459. uploader: null,
  460. tabIndex: 0
  461. },
  462. watch:{
  463. 'formData.validity':function (v) {
  464. if (v.indexOf('.')!=-1) {
  465. return layList.msg('不能输入小数');
  466. }
  467. if(v<0) return layList.msg('不能小于0');
  468. if(v>99999) return layList.msg('不能大于99999');
  469. }
  470. },
  471. methods: {
  472. //取消
  473. cancelUpload: function () {
  474. this.uploader.stop();
  475. this.is_video = false;
  476. this.videoWidth = 0;
  477. },
  478. //删除图片
  479. delect: function (key, index) {
  480. var that = this;
  481. if (index != undefined) {
  482. that.formData[key].splice(index, 1);
  483. that.$set(that.formData, key, that.formData[key]);
  484. } else {
  485. that.$set(that.formData, key, '');
  486. }
  487. },
  488. //查看图片
  489. look: function (pic) {
  490. parent.$eb.openImage(pic);
  491. },
  492. //鼠标移入事件
  493. enter: function (item) {
  494. if (item) {
  495. item.is_show = true;
  496. } else {
  497. this.mask = true;
  498. }
  499. },
  500. //鼠标移出事件
  501. leave: function (item) {
  502. if (item) {
  503. item.is_show = false;
  504. } else {
  505. this.mask = false;
  506. }
  507. },
  508. changeIMG: function (key, value, multiple) {
  509. if (multiple) {
  510. var that = this;
  511. value.map(function (v) {
  512. that.formData[key].push({pic: v, is_show: false});
  513. });
  514. this.$set(this.formData, key, this.formData[key]);
  515. } else {
  516. this.$set(this.formData, key, value);
  517. }
  518. },
  519. uploadVideo: function () {
  520. var link = this.link.trim();
  521. if (link) {
  522. if (link.indexOf('http') || link.indexOf('mp4') !== link.length - 3) {
  523. layui.layer.msg('请输入正确的视频链接', {icon: 5});
  524. } else {
  525. this.setContent(this.link);
  526. }
  527. }
  528. },
  529. setContent: function (link) {
  530. this.formData.link = link;
  531. 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);
  532. },
  533. //上传图片
  534. upload: function (key, count) {
  535. ossUpload.createFrame('请选择图片', {fodder: key, max_count: count === undefined ? 0 : count},{w:800,h:550});
  536. },
  537. //获取分类
  538. get_subject_list: function () {
  539. var that = this;
  540. layList.baseGet(layList.U({a: 'get_subject_list'}), function (res) {
  541. that.$set(that, 'subject_list', res.data);
  542. that.$nextTick(function () {
  543. layList.form.render('select');
  544. })
  545. });
  546. },
  547. delLabel: function (index) {
  548. this.formData.label.splice(index, 1);
  549. this.$set(this.formData, 'label', this.formData.label);
  550. },
  551. addLabrl: function () {
  552. if (this.label) {
  553. if (this.label.length > 6) return layList.msg('您输入的标签字数太长');
  554. var length = this.formData.label.length;
  555. if (length >= 2) return layList.msg('标签最多添加2个');
  556. for (var i = 0; i < length; i++) {
  557. if (this.formData.label[i] == this.label) return layList.msg('请勿重复添加');
  558. }
  559. this.formData.label.push(this.label);
  560. this.$set(this.formData, 'label', this.formData.label);
  561. this.label = '';
  562. }
  563. },
  564. save: function () {
  565. var that = this, banner = new Array();
  566. that.formData.content = that.ue.getContent();
  567. if (!that.formData.title) return layList.msg('请输入专栏名称');
  568. if (!that.formData.subject_id) return layList.msg('请选择分类');
  569. if (!that.formData.abstract) return layList.msg('请输入专栏简介');
  570. if (!that.formData.label.length) return layList.msg('请输入标签');
  571. if (!that.formData.image) return layList.msg('请上传专栏封面');
  572. if (!that.formData.banner.length) return layList.msg('请上传banner图,最少1张');
  573. if (!that.formData.poster_image) return layList.msg('请上传推广海报');
  574. if (!that.formData.content) return layList.msg('请编辑内容在进行保存');
  575. if (that.formData.validity < 0) return layList.msg('专题有效期不能小于0');
  576. if (that.formData.validity > 99999) return layList.msg('专题有效期不能大于99999');
  577. if ((that.formData.validity+'').indexOf('.')!=-1) return layList.msg('专题有效期不能为小数');
  578. if (that.formData.sum < 0) return layList.msg('专题章节不能小于0');
  579. if (that.formData.sum > 99999) return layList.msg('专题章节不能大于99999');
  580. if ((that.formData.sum + '').indexOf('.') != -1) return layList.msg('专题章节不能为小数');
  581. if (that.formData.is_pink) {
  582. if (!that.formData.pink_money) return layList.msg('请填写拼团金额');
  583. if (!that.formData.pink_number) return layList.msg('请填写拼团人数');
  584. if (!that.formData.pink_strar_time) return layList.msg('请选择拼团开始时间');
  585. if (!that.formData.pink_end_time) return layList.msg('请选择拼团结束时间');
  586. if (!that.formData.pink_time) return layList.msg('请填写拼团时间');
  587. if (that.formData.is_fake_pink && !that.formData.fake_pink_number) return layList.msg('请填写补齐比例');
  588. }
  589. that.formData.subjectIds=JSON.stringify(that.formData.check_source_sure);
  590. if (that.formData.pay_type == 1 && (!that.formData.money || that.formData.money == 0.00)) return layList.msg('请填写购买金额');
  591. if (that.formData.member_pay_type == 1 && (!that.formData.member_money || that.formData.member_money == 0.00)) return layList.msg('请填写会员购买金额');
  592. var data={};
  593. for (var key in that.formData) {
  594. if (key !== 'check_source_sure') {
  595. data[key] = that.formData[key]
  596. }
  597. }
  598. layList.loadFFF();
  599. layList.basePost(layList.U({
  600. a: 'save_special',
  601. q: {id: id, special_type: '{$special_type}'}
  602. }), data, function (res) {
  603. layList.loadClear();
  604. if (parseInt(id) == 0) {
  605. layList.layer.confirm('添加成功,您要继续添加专栏吗?', {
  606. btn: ['继续添加', '立即提交'] //按钮
  607. }, function (index) {
  608. layList.layer.close(index);
  609. }, function () {
  610. parent.layer.closeAll();
  611. });
  612. } else {
  613. layList.msg('修改成功', function () {
  614. parent.layer.closeAll();
  615. })
  616. }
  617. }, function (res) {
  618. layList.msg(res.msg);
  619. layList.loadClear();
  620. });
  621. },
  622. clone_form: function () {
  623. var that = this;
  624. parent.layer.closeAll();
  625. },
  626. //素材
  627. search_task: function () {
  628. var that = this;
  629. var url="{:Url('special.special_type/special_task')}?special_id="+id+"&special_type={$special_type}";
  630. var title='选择专题';
  631. that.searchTask=true;
  632. layer.open({
  633. type: 2 //Page层类型
  634. ,area: ['80%', '90%']
  635. ,title: title
  636. ,shade: 0.6 //遮罩透明度
  637. ,maxmin: true //允许全屏最小化
  638. ,anim: 1 //0-6的动画形式,-1不开启
  639. ,content: url,
  640. btn: '确定',
  641. btnAlign: 'c', //按钮居中
  642. closeBtn:1,
  643. yes: function(){
  644. layer.closeAll();
  645. var source_tmp = $("#check_source_tmp").val();
  646. that.source_tmp_list = JSON.parse(source_tmp);
  647. var array=that.formData.check_source_sure;
  648. that.formData.check_source_sure=array.concat(JSON.parse(source_tmp));
  649. that.formData.check_source_sure=that.duplicate_removal(that.formData.check_source_sure);
  650. that.show_source_list();
  651. }
  652. });
  653. },
  654. duplicate_removal:function(array)
  655. {
  656. var new_arr=[];
  657. var check_source_sure=[];
  658. for(var i=0;i<array.length;i++) {
  659. var items=array[i];
  660. var id=array[i].id;
  661. if($.inArray(id,new_arr)==-1) {
  662. new_arr.push(id);
  663. check_source_sure.push(items);
  664. }
  665. }
  666. return check_source_sure;
  667. },
  668. add_source:function(title,special_type){
  669. var that=this;
  670. var url="{:Url('special.special_type/add')}?special_type="+special_type;
  671. layer.open({
  672. type: 2 //Page层类型
  673. ,area: ['90%', '95%']
  674. ,title: title
  675. ,shade: 0.6 //遮罩透明度
  676. ,maxmin: true //允许全屏最小化
  677. ,anim: 1 //0-6的动画形式,-1不开启
  678. ,content: url
  679. ,end:function () {
  680. layer.closeAll();
  681. }
  682. });
  683. },
  684. add_single_source:function(){
  685. var that=this;
  686. var url="{:Url('special.special_type/single_add')}?special_type=6";
  687. var title='添加图文专题';
  688. layer.open({
  689. type: 2 //Page层类型
  690. ,area: ['90%', '95%']
  691. ,title: title
  692. ,shade: 0.6 //遮罩透明度
  693. ,maxmin: true //允许全屏最小化
  694. ,anim: 1 //0-6的动画形式,-1不开启
  695. ,content: url
  696. ,end:function () {
  697. layer.closeAll();
  698. }
  699. });
  700. },
  701. show_source_list: function () {
  702. var that = this;
  703. var table = layui.table, form = layui.form;
  704. table.render({
  705. elem: '#showSourceList',
  706. cols: [[
  707. {field: 'id', title: '编号', align: 'center',width:60},
  708. {field: 'title', title: '标题', align: 'center'},
  709. {field: 'image', title: '封面', align: 'center', templet: '<div><img src="{{ d.image }}" style="width: 100%;height: 100%;"></div>'},
  710. {field: 'is_mer_visible', title: '仅会员可见',align: 'center',templet:function(d){
  711. var is_checked = d.is_mer_visible == 1 ? "checked" : "";
  712. return "<input type='checkbox' disabled name='is_mer_visible' lay-skin='switch' value='"+d.id+"' lay-text='是|否' "+is_checked+">";
  713. }},
  714. {field: 'sort', title: '排序',edit:'sort',align: 'center'},
  715. {field: 'validity', title: '有效期(天)',align: 'center'},
  716. {field: 'right', title: '状态', align: 'center', templet:function(d){
  717. return '<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon">&#xe640;</i> 移除</a>';
  718. }},
  719. ]]
  720. ,data:that.formData.check_source_sure
  721. , page: {
  722. theme: '#0092DC'
  723. }
  724. ,id: 'table'
  725. });
  726. table.on('tool(showSourceList)', function(obj){
  727. var data = obj.data;
  728. if(obj.event === 'del'){
  729. if (that.formData.check_source_sure) {
  730. for(var i=0;i<that.formData.check_source_sure.length;i++){
  731. if(that.formData.check_source_sure[i].id==data.id){
  732. that.formData.check_source_sure.splice(i,1);
  733. }
  734. }
  735. that.formData.check_source_sure=that.formData.check_source_sure;
  736. that.show_source_list();
  737. }
  738. }
  739. });
  740. //监听单元格编辑
  741. table.on('edit(showSourceList)', function(obj){
  742. var id=obj.data.id,values=obj.value;
  743. switch (obj.field) {
  744. case 'sort':
  745. if (that.formData.check_source_sure) {
  746. $.each(that.formData.check_source_sure, function(index, value){
  747. if(value.id == id){
  748. that.formData.check_source_sure[index].sort = values;
  749. }
  750. })
  751. }
  752. break;
  753. }
  754. });
  755. //监听素材是否免费操作
  756. form.on('switch(pay_status)', function (obj) {
  757. if (that.formData.check_source_sure) {
  758. $.each(that.formData.check_source_sure, function (index, value) {
  759. if (value.id == obj.value) {
  760. that.formData.check_source_sure[index].pay_status = obj.elem.checked == true ? 0 : 1;
  761. }
  762. })
  763. }
  764. });
  765. //监听素材是否删除
  766. form.on('switch(delect)', function(obj){
  767. if (that.formData.check_source_sure) {
  768. for(var i=0;i<that.formData.check_source_sure.length;i++){
  769. if(that.formData.check_source_sure[i].id==obj.value){
  770. that.formData.check_source_sure.splice(i,1);
  771. }
  772. }
  773. that.formData.check_source_sure=that.formData.check_source_sure;
  774. that.show_source_list();
  775. }
  776. });
  777. },
  778. get_check_source_sure:function () {
  779. var that = this;
  780. layList.baseGet(layList.U({a: 'get_check_source_sure',q: {id: id, special_type:"{$special_type}"}}), function (res) {
  781. that.formData.check_source_sure=res.data.sourceCheckList;
  782. that.formData.check_store_sure=res.data.storeCheckList;
  783. that.show_source_list();
  784. });
  785. },
  786. // 上一步、下一步
  787. tabChange: function (value) {
  788. layui.element.tabChange('tab', this.tabIndex + value);
  789. }
  790. },
  791. mounted: function () {
  792. var that = this;
  793. window.changeIMG = that.changeIMG;
  794. layList.date({
  795. elem: '#start_time',
  796. type: 'datetime',
  797. done: function (value) {
  798. that.formData.pink_strar_time = value;
  799. }
  800. });
  801. layList.date({
  802. elem: '#end_time',
  803. type: 'datetime',
  804. done: function (value) {
  805. that.formData.pink_end_time = value;
  806. }
  807. });
  808. //选择图片
  809. function changeIMG(index, pic) {
  810. $(".image_img").css('background-image', "url(" + pic + ")");
  811. $(".active").css('background-image', "url(" + pic + ")");
  812. $('#image_input').val(pic);
  813. }
  814. //选择图片插入到编辑器中
  815. window.insertEditor = function (list) {
  816. that.ue.execCommand('insertimage', list);
  817. };
  818. this.$nextTick(function () {
  819. layList.form.render();
  820. //实例化编辑器
  821. layui.element.on('tab(tab)', function (data) {
  822. layui.table.resize('table');
  823. that.tabIndex = data.index;
  824. });
  825. UE.registerUI('选择图片', function (editor, uiName) {
  826. var btn = new UE.ui.Button({
  827. name: uiName,
  828. title: uiName,
  829. cssRules: 'background-position: -380px 0;',
  830. onclick: function() {
  831. ossUpload.createFrame(uiName, { fodder: editor.key }, { w: 800, h: 550 });
  832. }
  833. });
  834. return btn;
  835. });
  836. that.ue = UE.getEditor('editor');
  837. });
  838. //获取科目
  839. that.get_subject_list();
  840. //获取已添加的素材
  841. that.get_check_source_sure();
  842. //图片上传和视频上传
  843. layList.form.on('radio(is_pink)', function (data) {
  844. that.formData.is_pink = parseInt(data.value);
  845. });
  846. layList.form.on('radio(pay_type)', function (data) {
  847. that.formData.pay_type = parseInt(data.value);
  848. if (that.formData.pay_type != 1) {
  849. that.formData.is_pink = 0;
  850. that.formData.member_pay_type = 0;
  851. that.formData.member_money = 0;
  852. };
  853. that.$nextTick(function () {
  854. layList.form.render('radio');
  855. });
  856. });
  857. layList.form.on('radio(member_pay_type)', function (data) {
  858. that.formData.member_pay_type = parseInt(data.value);
  859. if (that.formData.member_pay_type != 1) {
  860. that.formData.member_money = 0;
  861. };
  862. that.$nextTick(function () {
  863. layList.form.render('radio');
  864. });
  865. });
  866. layList.form.on('radio(sort_order)', function (data) {
  867. that.formData.sort_order = parseInt(data.value);
  868. that.$nextTick(function () {
  869. layList.form.render('radio');
  870. });
  871. });
  872. layList.select('subject_id', function (obj) {
  873. that.formData.subject_id = obj.value;
  874. });
  875. layList.form.on('radio(is_fake_pink)', function (data) {
  876. that.formData.is_fake_pink = parseInt(data.value);
  877. });
  878. layList.form.on('radio(is_mer_visible)', function (data) {
  879. that.formData.is_mer_visible = parseInt(data.value);
  880. });
  881. that.$nextTick(function () {
  882. that.uploader = ossUpload.upload({
  883. id: 'ossupload',
  884. mime_types: [
  885. {title: "Mp4 files", extensions: "mp4"}
  886. ],
  887. FilesAddedSuccess: function () {
  888. that.is_video = true;
  889. },
  890. uploadIng: function (file) {
  891. that.videoWidth = file.percent;
  892. },
  893. success: function (res) {
  894. layList.msg('上传成功');
  895. that.videoWidth = 0;
  896. that.is_video = false;
  897. that.setContent(res.url);
  898. },
  899. fail: function (err) {
  900. that.videoWidth = 0;
  901. that.is_video = false;
  902. layList.msg(err);
  903. }
  904. })
  905. });
  906. }
  907. })
  908. })
  909. </script>
  910. {/block}