add.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  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. .file {
  42. position: relative;
  43. background: #0092DC;
  44. border: 1px solid #99D3F5;
  45. border-radius: 4px;
  46. padding: 7px 12px;
  47. overflow: hidden;
  48. color: #fff;
  49. text-decoration: none;
  50. text-indent: 0;
  51. line-height: 20px;
  52. width: 120px;
  53. }
  54. .file input {
  55. width: 100%;
  56. position: absolute;
  57. font-size: 5px;
  58. right: 0;
  59. top: 0;
  60. opacity: 0;
  61. }
  62. .file:hover {
  63. background: #AADFFD;
  64. border-color: #78C3F3;
  65. color: #004974;
  66. text-decoration: none;
  67. }
  68. .layui-progress {
  69. margin-top: 12px;
  70. }
  71. </style>
  72. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/third-party/zeroclipboard/ZeroClipboard.js"></script>
  73. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.config.js"></script>
  74. <script type="text/javascript" charset="utf-8" src="{__ADMIN_PATH}plug/ueditor/ueditor.all.min.js"></script>
  75. {/block}
  76. {block name="content"}
  77. <div v-cloak id="app" class="layui-fluid">
  78. <div class="layui-card">
  79. <div class="layui-card-body">
  80. <form class="layui-form" action="">
  81. <div class="layui-tab layui-tab-brief" lay-filter="tab">
  82. <ul class="layui-tab-title">
  83. <li class="layui-this" lay-id="0">基本设置</li>
  84. <li lay-id="1">上传内容</li>
  85. <li lay-id="2">价格设置</li>
  86. </ul>
  87. <div class="layui-tab-content">
  88. <div class="layui-tab-item layui-show">
  89. <div class="layui-form-item">
  90. <label class="layui-form-label required">资料名称:</label>
  91. <div class="layui-input-block">
  92. <input type="text" name="title" required v-model.trim="formData.title" autocomplete="off" placeholder="请输入资料名称" maxlength="50" class="layui-input">
  93. </div>
  94. </div>
  95. <div class="layui-form-item">
  96. <label class="layui-form-label required">资料分类:</label>
  97. <div class="layui-input-block">
  98. <select name="subject_id" v-model="formData.cate_id" lay-search="" lay-filter="cate_id" lay-verify="required">
  99. <option value="0">请选分类</option>
  100. <option v-for="item in cate_list" :value="item.id" :disabled="item.pid==0 ? true : false">{{item.html}}{{item.title}}</option>
  101. </select>
  102. </div>
  103. </div>
  104. <div class="layui-form-item">
  105. <label class="layui-form-label">资料排序:</label>
  106. <div class="layui-input-inline">
  107. <input type="number" name="sort" v-model="formData.sort" min="0" max="9999" class="layui-input" v-sort>
  108. </div>
  109. </div>
  110. <div class="layui-form-item">
  111. <label class="layui-form-label required">资料封面:(710*400)</label>
  112. <div class="layui-input-block">
  113. <div class="upload-image-box" v-if="formData.image">
  114. <img :src="formData.image" alt="">
  115. <div class="mask">
  116. <p>
  117. <i class="fa fa-eye" @click="look(formData.image)"></i>
  118. <i class="fa fa-trash-o" @click="delect('image')"></i>
  119. </p>
  120. </div>
  121. </div>
  122. <div class="upload-image" v-show="!formData.image" @click="upload('image')">
  123. <div class="fiexd"><i class="fa fa-plus"></i></div>
  124. <p>选择图片</p>
  125. </div>
  126. </div>
  127. </div>
  128. <div class="layui-form-item">
  129. <label class="layui-form-label required">推广海报:(600*740)</label>
  130. <div class="layui-input-block">
  131. <div class="upload-image-box" v-if="formData.poster_image">
  132. <img :src="formData.poster_image" alt="">
  133. <div class="mask">
  134. <p><i class="fa fa-eye" @click="look(formData.poster_image)"></i>
  135. <i class="fa fa-trash-o" @click="delect('poster_image')"></i></p>
  136. </div>
  137. </div>
  138. <div class="upload-image" v-show="!formData.poster_image" @click="upload('poster_image')">
  139. <div class="fiexd"><i class="fa fa-plus"></i></div>
  140. <p>选择图片</p>
  141. </div>
  142. </div>
  143. </div>
  144. <div class="layui-form-item">
  145. <label class="layui-form-label required">资料详情:</label>
  146. <div class="layui-input-block">
  147. <textarea id="editor">{{formData.abstract}}</textarea>
  148. </div>
  149. </div>
  150. </div>
  151. <div class="layui-tab-item">
  152. <div class="layui-form-item">
  153. <label class="layui-form-label" style="width: 150px;">上传方式:</label>
  154. <div class="layui-input-block" style="margin-left: 150px;">
  155. <input type="radio" name="type" lay-filter="type" v-model="formData.type" value="0" title="全部">
  156. <input type="radio" name="type" lay-filter="type" v-model="formData.type" value="1" title="OSS上传">
  157. <input type="radio" name="type" lay-filter="type" v-model="formData.type" value="2" title="百度网盘">
  158. </div>
  159. </div>
  160. <div v-show="formData.type != 2" class="layui-form-item">
  161. <label class="layui-form-label required" style="width: 150px;">资料链接:</label>
  162. <div class="layui-input-block" style="margin-left: 150px;overflow: hidden;">
  163. <div class="layui-row layui-col-space15">
  164. <div class="layui-col-md8">
  165. <input v-model.trim="link" :disabled="!!formData.link" type="text" name="title" placeholder="请输入资料链接" autocomplete="off" class="layui-input">
  166. <div>{{ filename }}</div>
  167. </div>
  168. <div class="layui-col-md4">
  169. <button v-show="formData.link" type="button" class="layui-btn layui-btn-danger layui-btn-sm" @click="deleteFile">删除</button>
  170. <button v-show="!formData.link" type="button" class="layui-btn layui-btn-normal layui-btn-sm" @click="uploadVideo">确认资料</button>
  171. <button v-show="!formData.link" type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="upload">上传资料</button>
  172. </div>
  173. </div>
  174. <div class="layui-row layui-col-space15">
  175. <div class="layui-col-md12">
  176. <div class="layui-form-mid layui-word-aux">仅支持zip、rar格式的文件,请在OSS上传大于1000M的文件,然后在此处添加OSS链接</div>
  177. </div>
  178. </div>
  179. <div v-show="is_video" class="layui-row layui-col-space15">
  180. <div class="layui-col-md8">
  181. <div class="layui-progress" lay-showPercent="true" lay-filter="progress">
  182. <div class="layui-progress-bar layui-bg-blue" lay-percent="0%"></div>
  183. </div>
  184. </div>
  185. <div class="layui-col-md4">
  186. <button type="button" class="layui-btn layui-btn-danger layui-btn-sm" @click="cancelUpload">取消上传</button>
  187. </div>
  188. </div>
  189. </div>
  190. </div>
  191. <div v-show="formData.type != 1" class="layui-form-item">
  192. <label class="layui-form-label required" style="width: 150px;">百度网盘链接:</label>
  193. <div class="layui-input-block" style="margin-left: 150px;">
  194. <input type="text" name="network_disk_link" required v-model.trim="formData.network_disk_link" autocomplete="off" placeholder="请输入百度网盘链接,由于微信iOS端网页不支持下载文件,请通过百度网盘上传、下载文件" class="layui-input">
  195. </div>
  196. </div>
  197. <div v-show="formData.type != 1" class="layui-form-item">
  198. <label class="layui-form-label required" style="width: 150px;">百度网盘提取码:</label>
  199. <div class="layui-input-block" style="margin-left: 150px;">
  200. <input type="text" name="network_disk_pwd" required v-model.trim="formData.network_disk_pwd" autocomplete="off" placeholder="请输入百度网盘提取码" maxlength="4" class="layui-input">
  201. </div>
  202. </div>
  203. </div>
  204. <div class="layui-tab-item">
  205. <div class="layui-form-item">
  206. <label class="layui-form-label">付费方式:</label>
  207. <div class="layui-input-block">
  208. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="1" title="付费">
  209. <input type="radio" name="pay_type" lay-filter="pay_type" v-model="formData.pay_type" value="0" title="免费">
  210. </div>
  211. </div>
  212. <div class="layui-form-item" v-show="formData.pay_type == 1">
  213. <label class="layui-form-label">购买金额:</label>
  214. <div class="layui-input-block">
  215. <input style="width: 300px" type="number" name="money" lay-verify="number" v-model="formData.money" autocomplete="off" class="layui-input">
  216. </div>
  217. <!-- <div class="layui-form-item">
  218. <label class="layui-form-label" style="padding: 9px 0;">会员付费方式:</label>
  219. <div class="layui-input-block">
  220. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="1" title="付费">
  221. <input type="radio" name="member_pay_type" lay-filter="member_pay_type" v-model="formData.member_pay_type" value="0" title="免费">
  222. </div>
  223. </div>
  224. <div class="layui-form-item" v-show="formData.member_pay_type == 1">
  225. <label class="layui-form-label" style="padding: 9px 0;">会员购买金额:</label>
  226. <div class="layui-input-block">
  227. <input style="width: 300px" type="number" name="member_money" lay-verify="number" v-model="formData.member_money" autocomplete="off" class="layui-input" min="0">
  228. </div>
  229. </div> -->
  230. </div>
  231. </div>
  232. </div>
  233. </div>
  234. <div class="layui-form-item">
  235. <div class="layui-input-block">
  236. <button type="button" class="layui-btn layui-btn-primary" @click="clone_form">取消</button>
  237. <button v-show="tabIndex" type="button" class="layui-btn layui-btn-primary" @click="tabChange(-1)">上一步</button>
  238. <button v-show="tabIndex != 2" type="button" class="layui-btn layui-btn-normal" @click="tabChange(1)">下一步</button>
  239. <button v-show="tabIndex == 2" type="button" class="layui-btn layui-btn-normal" @click="save">{$id ?'确认修改':'立即提交'}</button>
  240. </div>
  241. </div>
  242. </form>
  243. </div>
  244. </div>
  245. </div>
  246. <script type="text/javascript" src="{__ADMIN_PATH}js/layuiList.js"></script>
  247. {/block}
  248. {block name='script'}
  249. <script>
  250. var id = {$id}, download =<?=isset($download) ? $download : "{}"?>;
  251. require(['vue','helper','zh-cn','request','plupload','aliyun-oss','OssUpload'], function (Vue,$h) {
  252. new Vue({
  253. el: "#app",
  254. directives: {
  255. sort: {
  256. bind: function (el, binding, vnode) {
  257. var vm = vnode.context;
  258. el.addEventListener('change', function () {
  259. if (!this.value || this.value < 0) {
  260. vm.formData.sort = 0;
  261. } else if (this.value > 9999) {
  262. vm.formData.sort = 9999;
  263. } else {
  264. vm.formData.sort = parseInt(this.value);
  265. }
  266. });
  267. }
  268. }
  269. },
  270. data: {
  271. cate_list: [],
  272. formData: {
  273. title: download.title || '',
  274. cate_id: download.cate_id || 0,
  275. image: download.image || '',
  276. poster_image: download.poster_image || '',
  277. abstract:download.abstract || '',
  278. sort: download.sort || 0,
  279. sales: download.sales || 0,
  280. pay_type: download.pay_type == 1 ? 1 : 0,
  281. money: download.money || 0.00,
  282. member_pay_type: download.member_pay_type == 1 ? 1 : 0,
  283. member_money: download.member_money || 0.00,
  284. link:download.link || '',
  285. network_disk_link:download.network_disk_link || '',
  286. network_disk_pwd:download.network_disk_pwd || '',
  287. type: download.type || 0
  288. },
  289. link: download.link || '',
  290. host: ossUpload.host + '/',
  291. mask: {
  292. poster_image: false,
  293. image: false,
  294. service_code: false,
  295. },
  296. ue: null,
  297. is_video: false,
  298. is_upload:false,
  299. is_suspend:false,
  300. //上传类型
  301. mime_types: {
  302. Image: "jpg,gif,png,JPG,GIF,PNG",
  303. Video: "mp4,MP4",
  304. Audio: "mp3,MP3",
  305. },
  306. videoWidth: 0,
  307. uploader: null,
  308. uploadInst: null,
  309. tabIndex: 0
  310. },
  311. computed: {
  312. filename: function () {
  313. var arr = this.formData.link.split('/');
  314. return arr[arr.length - 1];
  315. }
  316. },
  317. methods: {
  318. //取消
  319. cancelUpload: function () {
  320. this.uploader.stop();
  321. this.is_video = false;
  322. this.videoWidth = 0;
  323. this.is_upload = false;
  324. },
  325. //删除图片
  326. delect: function (key, index) {
  327. var that = this;
  328. if (index != undefined) {
  329. that.formData[key].splice(index, 1);
  330. that.$set(that.formData, key, that.formData[key]);
  331. } else {
  332. that.$set(that.formData, key, '');
  333. }
  334. },
  335. //查看图片
  336. look: function (pic) {
  337. parent.$eb.openImage(pic);
  338. },
  339. //鼠标移入事件
  340. enter: function (item) {
  341. if (item) {
  342. item.is_show = true;
  343. } else {
  344. this.mask = true;
  345. }
  346. },
  347. //鼠标移出事件
  348. leave: function (item) {
  349. if (item) {
  350. item.is_show = false;
  351. } else {
  352. this.mask = false;
  353. }
  354. },
  355. changeIMG: function (key, value, multiple) {
  356. if (multiple) {
  357. var that = this;
  358. value.map(function (v) {
  359. that.formData[key].push({pic: v, is_show: false});
  360. });
  361. this.$set(this.formData, key, this.formData[key]);
  362. } else {
  363. this.$set(this.formData, key, value);
  364. }
  365. },
  366. confirmAdd:function(){
  367. var that = this;
  368. if(that.link.substr(0,7).toLowerCase() == "http://" || that.link.substr(0,8).toLowerCase() == "https://"){
  369. that.is_upload=true;
  370. that.uploadVideo();
  371. }else{
  372. layList.msg('请输入正确的资料链接');
  373. }
  374. },
  375. uploadVideo: function () {
  376. if (!this.link) {
  377. return;
  378. }
  379. if (this.link.indexOf('http')) {
  380. return layui.layer.msg('请输入正确的资料链接');
  381. }
  382. if (this.link.indexOf('.zip') == -1 && this.link.indexOf('.rar') == -1) {
  383. return layui.layer.msg('请输入正确的资料链接');
  384. }
  385. this.formData.link = this.link;
  386. },
  387. // 删除资料
  388. deleteFile: function () {
  389. this.formData.link = this.link = '';
  390. },
  391. //上传图片
  392. upload: function (key, count) {
  393. ossUpload.createFrame('请选择图片', {fodder: key, max_count: count === undefined ? 0 : count},{w:800,h:550});
  394. },
  395. //获取分类
  396. get_subject_list: function () {
  397. var that = this;
  398. layList.baseGet(layList.U({a: 'get_cate_list'}), function (res) {
  399. that.$set(that, 'cate_list', res.data);
  400. that.$nextTick(function () {
  401. layList.form.render('select');
  402. })
  403. });
  404. },
  405. save: function () {
  406. var that = this;
  407. that.formData.abstract = that.ue.getContent();
  408. that.$nextTick(function () {
  409. if (!that.formData.title) return layList.msg('请输入资料名称');
  410. if (!that.formData.cate_id) return layList.msg('请选择分类');
  411. if (!that.formData.image) return layList.msg('请上传资料封面');
  412. if (!that.formData.poster_image) return layList.msg('请上传推广海报');
  413. if (!that.formData.abstract) return layList.msg('请输入资料详情');
  414. if (that.formData.type == 1) {
  415. if (!that.formData.link) {
  416. return layList.msg('请上传资料文件');
  417. }
  418. } else if (that.formData.type == 2) {
  419. if (!that.formData.network_disk_link) {
  420. return layList.msg('请输入百度网盘链接');
  421. }
  422. if (!that.formData.network_disk_pwd) {
  423. return layList.msg('请输入百度网盘提取码');
  424. }
  425. } else {
  426. if (!that.formData.link) {
  427. return layList.msg('请上传资料文件');
  428. }
  429. if (!that.formData.network_disk_link) {
  430. return layList.msg('请输入百度网盘链接');
  431. }
  432. if (!that.formData.network_disk_pwd) {
  433. return layList.msg('请输入百度网盘提取码');
  434. }
  435. }
  436. if (that.formData.pay_type == 1) {
  437. if (!that.formData.money || that.formData.money == 0.00) return layList.msg('请填写购买金额');
  438. }
  439. if (that.formData.member_pay_type == 1) {
  440. if (!that.formData.member_money || that.formData.member_money == 0.00) return layList.msg('请填写会员购买金额');
  441. }
  442. layList.loadFFF();
  443. layList.basePost(layList.U({
  444. a: 'save_data',
  445. q: {id: id}
  446. }), that.formData, function (res) {
  447. layList.loadClear();
  448. if (parseInt(id) == 0) {
  449. layList.layer.confirm('添加成功,您要继续添加资料吗?', {
  450. btn: ['继续添加', '立即提交'] //按钮
  451. }, function (index) {
  452. layList.layer.close(index);
  453. }, function () {
  454. parent.layer.closeAll();
  455. });
  456. } else {
  457. layList.msg('修改成功', function () {
  458. parent.layer.closeAll();
  459. })
  460. }
  461. }, function (res) {
  462. layList.msg(res.msg);
  463. layList.loadClear();
  464. });
  465. })
  466. },
  467. clone_form: function () {
  468. if (parseInt(id) == 0) {
  469. var that = this;
  470. if (that.formData.image) return layList.msg('请先删除上传的图片在尝试取消');
  471. if (that.formData.poster_image) return layList.msg('请先删除上传的图片在尝试取消');
  472. parent.layer.closeAll();
  473. }
  474. parent.layer.closeAll();
  475. },
  476. // 上一步、下一步
  477. tabChange: function (value) {
  478. layui.element.tabChange('tab', this.tabIndex + value);
  479. }
  480. },
  481. mounted: function () {
  482. var that = this;
  483. window.changeIMG = that.changeIMG;
  484. //选择图片
  485. function changeIMG(index, pic) {
  486. $(".image_img").css('background-image', "url(" + pic + ")");
  487. $(".active").css('background-image', "url(" + pic + ")");
  488. $('#image_input').val(pic);
  489. }
  490. //选择图片插入到编辑器中
  491. window.insertEditor = function(list,fodder){
  492. that.ue.execCommand('insertimage', list);
  493. };
  494. this.$nextTick(function () {
  495. layList.form.render();
  496. //实例化编辑器
  497. UE.registerUI('选择图片', function (editor, uiName) {
  498. var btn = new UE.ui.Button({
  499. name: uiName,
  500. title: uiName,
  501. cssRules: 'background-position: -380px 0;',
  502. onclick: function() {
  503. ossUpload.createFrame(uiName, { fodder: editor.key }, { w: 800, h: 550 });
  504. }
  505. });
  506. return btn;
  507. });
  508. that.ue = UE.getEditor('editor');
  509. layui.element.on('tab(tab)', function (data) {
  510. that.tabIndex = data.index;
  511. });
  512. });
  513. //获取科目
  514. that.get_subject_list();
  515. layList.form.on('radio(pay_type)', function (data) {
  516. that.formData.pay_type = parseInt(data.value);
  517. if (that.formData.pay_type != 1) {
  518. that.formData.is_pink = 0;
  519. that.formData.member_pay_type = 0;
  520. that.formData.member_money = 0;
  521. };
  522. that.$nextTick(function () {
  523. layList.form.render('radio');
  524. });
  525. });
  526. layList.form.on('radio(type)', function (data) {
  527. that.formData.type = parseInt(data.value);
  528. that.$nextTick(function () {
  529. layList.form.render('radio');
  530. });
  531. });
  532. layList.form.on('radio(member_pay_type)', function (data) {
  533. that.formData.member_pay_type = parseInt(data.value);
  534. if (that.formData.member_pay_type != 1) {
  535. that.formData.member_money = 0;
  536. };
  537. that.$nextTick(function () {
  538. layList.form.render('radio');
  539. });
  540. });
  541. layList.select('cate_id', function (obj) {
  542. that.formData.cate_id = obj.value;
  543. });
  544. layui.element.render('progress');
  545. that.uploader = ossUpload.upload({
  546. id: 'upload',
  547. mime_types: [
  548. {title: "Zip files", extensions: "zip,rar"}
  549. ],
  550. uploadIng: function (file) {
  551. layui.element.progress('progress', file.percent + '%');
  552. },
  553. FilesAddedSuccess: function (files) {
  554. that.is_video = true;
  555. },
  556. success: function (res) {
  557. layList.msg('上传成功');
  558. that.is_video = false;
  559. that.link = res.url;
  560. that.uploadVideo();
  561. },
  562. fail: function (err) {
  563. that.is_video = false;
  564. that.is_upload = false;
  565. layList.msg(err);
  566. }
  567. });
  568. }
  569. })
  570. })
  571. </script>
  572. {/block}