add.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <style>
  4. .layui-layout-admin .layui-body .body-content {
  5. min-height: initial;
  6. padding-top: 0;
  7. padding-bottom: 0;
  8. margin: 0;
  9. }
  10. .form-wrap {
  11. margin-top: 0;
  12. }
  13. .layui-form-label.mid {
  14. width: 100px;
  15. }
  16. .layui-form-label.mid+.layui-input-block {
  17. margin-left: 100px;
  18. }
  19. .new-mid {
  20. margin-left: -20px !important;
  21. }
  22. .poster-form {
  23. display: flex;
  24. background: #eee;
  25. }
  26. .poster-left {
  27. width: 400px;
  28. height: 800px;
  29. background: #FFFFFF;
  30. padding: 10px 30px 10px 10px;
  31. }
  32. .poster-left-header {
  33. font-size: 18px;
  34. border-bottom: 1px solid #eee;
  35. padding: 0 0 10px 0;
  36. margin: 0 0 10px 0;
  37. }
  38. .layui-input-block {
  39. margin-left: 0;
  40. }
  41. .poster-headimg,
  42. .poster-name {
  43. display: flex;
  44. }
  45. .poster-right {
  46. width: 360px;
  47. height: 640px;
  48. opacity: 0.9;
  49. margin: 20px 0 0 271px;
  50. background-color: #fff;
  51. }
  52. .tips {
  53. width: 153px;
  54. height: 16px;
  55. font-size: 12px;
  56. font-family: Microsoft YaHei;
  57. font-weight: 400;
  58. color: #909399;
  59. padding-left: 100px;
  60. }
  61. .album-img-select {
  62. height: 30px;
  63. line-height: 30px;
  64. margin: 0 0 5px 20px;
  65. }
  66. .upload-img-block {
  67. width: 300px;
  68. height: 100px;
  69. }
  70. .upload {
  71. }
  72. .form-row {
  73. padding-top: 20px;
  74. }
  75. .bg-color {
  76. margin-left: 800px;
  77. background: #ff6a00;
  78. }
  79. .poster-tips {
  80. background: #fff;
  81. width: 280px;
  82. margin-left: 320px;
  83. padding: 20px 20px;
  84. border: 1px solid #e8e8e8;
  85. border-right: none;
  86. }
  87. .set-tips {
  88. font-size: 16px;
  89. font-family: Microsoft YaHei;
  90. font-weight: bolder;
  91. color: #303133;
  92. line-height: 22px;
  93. }
  94. .content {
  95. font-size: 12px;
  96. font-family: Microsoft YaHei;
  97. font-weight: 400;
  98. color: #909399;
  99. line-height: 22px;
  100. margin-top: 10px;
  101. }
  102. .layui-nav-more1 {
  103. width: 7px;
  104. height: 7px;
  105. border-width: 1px;
  106. border-color: #333 #333 transparent transparent;
  107. border-style: solid;
  108. transform: rotate(135deg);
  109. top: 16px;
  110. right: 16px;
  111. margin-top: 7px;
  112. }
  113. .layui-nav-more2 {
  114. width: 7px;
  115. height: 7px;
  116. border-width: 1px;
  117. border-color: #333 #333 transparent transparent;
  118. border-style: solid;
  119. transform: rotate(135deg);
  120. top: 16px;
  121. right: 16px;
  122. margin-top: 7px;
  123. }
  124. .layui-new-more1 {
  125. transform: rotate(45deg);
  126. }
  127. .layui-new-more2 {
  128. transform: rotate(45deg);
  129. }
  130. .layui-colorpicker {
  131. margin-left: 15px;
  132. }
  133. .form-row {
  134. position: fixed;
  135. bottom: 0px;
  136. left: 0;
  137. width: 89.7%;
  138. background: #fff;
  139. padding: 10px 0;
  140. display: flex;
  141. justify-content: center;
  142. }
  143. .form-row button{
  144. margin-right: 20px;
  145. }
  146. .layui-colorpicker-main-input .layui-btn {
  147. padding: 0 10px;
  148. }
  149. .circle {
  150. border-radius: 50%;
  151. }
  152. .upload img {
  153. margin-top: 20px;
  154. }
  155. .img_prev {
  156. margin-top: 0 !important;
  157. }
  158. </style>
  159. {/block}
  160. {block name="main"}
  161. <div class="layui-form add-poster">
  162. <div class="poster-form">
  163. <div id="view" style="display: flex;"></div>
  164. <div class="poster-tips">
  165. <div class="set-tips">海报设置说明</div>
  166. <div class="content">
  167. 1. 用户头像,用户昵称这两个元素需要空出<br>
  168. 2. 裂变海报其他部分皆可自定义设计<br>
  169. 3. 可自行拖拉设置相应元素的大小
  170. </div>
  171. </div>
  172. </div>
  173. <div class="form-row">
  174. <button class="layui-btn" lay-submit lay-filter="save_poster">保存</button>
  175. <input type="hidden" name="template_id" value='{notempty name="$template_data"}{$template_data.template_id}{/notempty}'>
  176. <button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
  177. </div>
  178. </div>
  179. <script type="text/html" id="poster_left">
  180. <div class="poster-left">
  181. <div class="poster-left-header">基础设置</div>
  182. <div class="layui-form-item">
  183. <label class="layui-form-label mid"><span class="required">*</span>海报名称</label>
  184. <div class="layui-input-block mid">
  185. <input type="text" class="layui-input" lay-verify="required" placeholder="请输入海报名称" name="poster_name" value="{{d.poster_name || ''}}"/>
  186. </div>
  187. </div>
  188. <div class="layui-form-item">
  189. <label class="layui-form-label mid"><span class="required">*</span>宣传语</label>
  190. <div class="layui-input-block mid">
  191. <input type="text" class="layui-input" lay-verify="required" placeholder="请输入宣传语" name="share_content" value="{{d.share_content || ''}}"/>
  192. </div>
  193. </div>
  194. <div class="layui-form-item">
  195. <label class="layui-form-label short-label mid"><span class="required">*</span>上传海报</label>
  196. <div class="layui-input-block mid">
  197. <div class="upload-img-block icon">
  198. <div class="upload-img-box {{d.background ? 'hover' : ''}}" >
  199. <div class="upload-default" id="posterImg">
  200. {{# if (d.background) { }}
  201. <div id="preview_posterImg" class="preview_img">
  202. <img layer-src src='{{ ns.img(d.background) }}' class="img_prev" data-id="qr_img"/>
  203. <p style="width: 300px;"></p>
  204. </div>
  205. {{# } else { }}
  206. <div class="upload">
  207. <i class="iconfont iconshangchuan"></i>
  208. <p>点击上传</p>
  209. </div>
  210. {{# } }}
  211. </div>
  212. <div class="operation">
  213. <div style="position: absolute; top: -10px; left: 110px;">
  214. <i title="图片预览" class="iconfont iconreview js-preview"></i>
  215. <i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
  216. </div>
  217. <div class="replace_img js-replace">点击替换</div>
  218. </div>
  219. <input type="hidden" lay-verify="background" name="background" value='{{d.background}}' />
  220. </div>
  221. </div>
  222. </div>
  223. </div>
  224. <div class="tips">建议图片尺寸:720*1280px</div>
  225. <div class="layui-form-item poster-headimg">
  226. <div class="layui-form album-img-select">
  227. <input type="checkbox" name="switch" lay-filter="headimg" value="" lay-skin="primary" {{d.headimg_is_show == '1' ? 'checked' : ''}}>
  228. </div>
  229. <label class="layui-form-label mid" style="text-align: left;">用户头像</label>
  230. <div class="layui-input-block mid new-mid">
  231. <div class="layui-input-block">
  232. <input type="radio" lay-filter="headimg" name="shop_status" value="circle" title="圆形" {{d.headimg_shape == 'circle' ? 'checked' : ''}}>
  233. <input type="radio" lay-filter="headimg" name="shop_status" value="square" title="方形" {{d.headimg_shape == 'square' ? 'checked' : ''}}>
  234. </div>
  235. </div>
  236. </div>
  237. <div class="layui-form-item poster-name">
  238. <div class="layui-form album-img-select">
  239. <input type="checkbox" name="check[]" lay-filter="nickname" value="" lay-skin="primary" {{d.nickname_is_show == '1' ? 'checked' : ''}}>
  240. </div>
  241. <label class="layui-form-label mid" style="text-align: left;">用户昵称</label>
  242. <div class="layui-input-block mid new-mid">
  243. <div class="poster-name-box">
  244. <div class="layui-form poster-select len-short" lay-filter="poster-select">
  245. <select name="" lay-filter="nickname">
  246. {{# for (var font_index = 14; font_index <= 36; font_index++) { }}
  247. {{# if (font_index == d.nickname_font_size) { }}
  248. <option value="{{font_index}}" selected>{{font_index}}px</option>
  249. {{# } else { }}
  250. <option value="{{font_index}}">{{font_index}}px</option>
  251. {{# } }}
  252. {{# } }}
  253. </select>
  254. </div>
  255. </div>
  256. </div>
  257. <div class="layui-form poster_color_nickname">
  258. 颜色:
  259. <div>
  260. <input type="hidden" name="color" id="friendfission-all-input">
  261. <div class="friendfission-all"></div>
  262. </div>
  263. </div>
  264. </div>
  265. <div class="layui-form-item poster-name">
  266. <div class="layui-form album-img-select">
  267. <input type="checkbox" name="check[]" lay-filter="share_content" value="" lay-skin="primary" {{d.share_content_is_show == '1' ? 'checked' : ''}}>
  268. </div>
  269. <label class="layui-form-label mid" style="text-align: left;">宣传语</label>
  270. <div class="layui-input-block mid new-mid">
  271. <div class="poster-name-box">
  272. <div class="layui-form poster-select len-short" lay-filter="poster-select">
  273. <select name="" lay-filter="share_content">
  274. {{# for (var font_index = 14; font_index <= 36; font_index++) { }}
  275. {{# if (font_index == d.share_content_font_size) { }}
  276. <option value="{{font_index}}" selected>{{font_index}}px</option>
  277. {{# } else { }}
  278. <option value="{{font_index}}">{{font_index}}px</option>
  279. {{# } }}
  280. {{# } }}
  281. </select>
  282. </div>
  283. </div>
  284. </div>
  285. <div class="layui-form poster_color_share_content">
  286. 颜色:
  287. <div>
  288. <input type="hidden" name="color" id="friendfission-all-input">
  289. <div class="friendfission-all"></div>
  290. </div>
  291. </div>
  292. </div>
  293. </div>
  294. <div class="poster-right design-sketch" style="position: relative;border: 1px solid #d6d6d6;
  295. {notempty name='$template_data.background'}background-image:url({:img($template_data.background)}); background-size: 100%; background-repeat: no-repeat;{/notempty}
  296. {{# if (d.background) { }}background-image:url(/{{ d.background }});background-size: 100%;background-repeat: no-repeat;{{# } }}
  297. ">
  298. <div class="headimg {{d.headimg_is_show == '1' ? '' : 'layui-hide'}}" style="position:absolute;top: {{d.headimg_top}}px; left: {{d.headimg_left}}px; width: {{d.headimg_width}}px; height: {{d.headimg_height}}px;">
  299. <img alt="" class="{{d.headimg_shape == 'circle' ? 'circle' : ''}}" src="__STATIC__/img/caner1.png" width="100%" />
  300. </div>
  301. <div class="nickname {{d.nickname_is_show == '1' ? '' : 'layui-hide'}}" style="position:absolute;top: {{d.nickname_top}}px; left: {{d.nickname_left}}px; width: {{d.nickname_width}}px; color: {{d.nickname_color}}; font-size: {{d.nickname_font_size}}px;">
  302. <span class="design-text">用户昵称</span>
  303. </div>
  304. <div style="margin: 10px;">
  305. <div class="share_content {{d.share_content_is_show == '1' ? '' : 'layui-hide'}}" style="position:absolute;top: {{d.share_content_top}}px; color: {{d.share_content_color}}; left: {{d.share_content_left}}px; width: {{d.share_content_width}}px; height: {{d.share_content_height}}px; font-size: {{d.share_content_font_size}}px;">
  306. <span class="design-text">{{d.share_content}}</span>
  307. </div>
  308. </div>
  309. <div class="qrcode" style="top: {{d.qrcode_top}}px; left: {{d.qrcode_left}}px; height: {{d.qrcode_height}}px; width: {{d.qrcode_width}}px;">
  310. <img alt="" src="__STATIC__/img/caner_erweima.png" width="100%" />
  311. </div>
  312. </div>
  313. </script>
  314. {/block}
  315. {block name="script"}
  316. <script src="STATIC_JS/tdrag.js"></script>
  317. <script>
  318. var form, laytpl, laypage, laydate, colorpicker, repeat_flag = false;
  319. var poster_detail = JSON.parse('{:json_encode($template_info)}');
  320. layui.use(['form', 'laytpl', 'colorpicker'], function() {
  321. var form = layui.form,
  322. laytpl = layui.laytpl,
  323. colorpicker = layui.colorpicker,
  324. repeat_flag = false; //防重复标识
  325. form.render();
  326. laytpl($("#poster_left").html()).render(poster_detail, function(html) {
  327. $('#view').html(html);
  328. form.render();
  329. new Upload({
  330. elem: '#posterImg',
  331. data: {
  332. },
  333. callback: function(res) {
  334. if (res.code >= 0) {
  335. $('.poster-right').css({
  336. "background-image": `url('${ns.img(res.data.pic_path)}')`,
  337. "background-size": "100%",
  338. "background-repeat": "no-repeat"
  339. });
  340. poster_detail.background = res.data.pic_path;
  341. $("input[name='background']").val(res.data.pic_path)
  342. }
  343. },
  344. deleteCallback: function() {
  345. poster_detail.background = '';
  346. $("input[name='background']").val('')
  347. }
  348. });
  349. });
  350. //是否显示的控制
  351. var checkbox_field_arr = ['headimg', 'nickname', 'share_content'];
  352. checkbox_field_arr.forEach(function(field_name, index){
  353. form.on('checkbox('+ field_name +')', function(data) {
  354. poster_detail[field_name + '_is_show'] = data.elem.checked ? '1' : '0';
  355. if (data.elem.checked) {
  356. $("."+ field_name).removeClass("layui-hide");
  357. } else {
  358. $("."+ field_name).addClass("layui-hide");
  359. }
  360. })
  361. });
  362. //字体大小控制
  363. var font_field_arr = ['nickname', 'share_content'];
  364. font_field_arr.forEach(function(field_name, index){
  365. form.on('select('+ field_name +')', function(data) {
  366. poster_detail[field_name + '_font_size'] = data.value;
  367. $("."+ field_name).css("font-size", data.value + "px")
  368. });
  369. });
  370. //字体颜色控制
  371. var color_field_arr = ['nickname', 'share_content'];
  372. color_field_arr.forEach(function(field_name, index){
  373. colorpicker.render({
  374. elem: '.poster_color_' + field_name, //绑定元素
  375. color: poster_detail[field_name + '_color'],
  376. done: function(color) {
  377. $("."+ field_name).css("color", color);
  378. poster_detail[field_name + '_color'] = color;
  379. }
  380. });
  381. });
  382. //圆角控制
  383. var shape_field_arr = ['headimg'];
  384. shape_field_arr.forEach(function(field_name, index){
  385. form.on('radio('+ field_name +')', function(data) {
  386. let shape = data.value;
  387. poster_detail[field_name + '_shape'] = shape;
  388. if(shape == 'circle'){
  389. $("."+ field_name +" img").addClass('circle');
  390. }else{
  391. $("."+ field_name +" img").removeClass('circle');
  392. }
  393. })
  394. });
  395. //拖拽控制
  396. var drag_field_arr = ['headimg', 'nickname', 'qrcode', 'share_content'];
  397. drag_field_arr.forEach((field_name, index) => {
  398. $(`.${field_name}`).Tdrag({
  399. scope: '.design-sketch',
  400. cbChange: function(obj, self) {
  401. poster_detail[field_name + '_top'] = parseFloat($(self.$element).css('top'));
  402. poster_detail[field_name + '_left'] =parseFloat($(self.$element).css('left'));
  403. poster_detail[field_name + '_width'] = parseFloat($(self.$element).css('width'));
  404. poster_detail[field_name + '_height'] = parseFloat($(self.$element).css('height'));
  405. },
  406. cbEnd: function (obj, self) {
  407. poster_detail[field_name + '_top'] = parseFloat($(self.$element).css('top'));
  408. poster_detail[field_name + '_left'] =parseFloat($(self.$element).css('left'));
  409. poster_detail[field_name + '_width'] = parseFloat($(self.$element).css('width'));
  410. poster_detail[field_name + '_height'] = parseFloat($(self.$element).css('height'));
  411. }
  412. });
  413. });
  414. form.verify({
  415. background: function(value){
  416. if(!value){
  417. return '请上传海报背景';
  418. }
  419. }
  420. });
  421. /**
  422. * 监听提交
  423. */
  424. form.on('submit(save_poster)', function(data) {
  425. poster_detail.poster_name = data.field.poster_name;
  426. poster_detail.share_content = data.field.share_content;
  427. if (repeat_flag) return false;
  428. repeat_flag = true;
  429. $.ajax({
  430. url: ns.url("fenxiao://shop/postertemplate/"+ (poster_detail['template_id'] ? 'edit' : 'add') +"postertemplate"),
  431. data:poster_detail,
  432. dataType: 'JSON', //服务器返回json格式数据
  433. type: 'POST', //HTTP请求类型
  434. success: function(res) {
  435. repeat_flag = false;
  436. if(res.code == 0){
  437. layer.confirm(poster_detail['template_id'] ? '编辑成功' : '添加成功',{
  438. title: '操作提示',
  439. btn: ['返回列表',poster_detail['template_id'] ? '继续编辑' : '继续添加'],
  440. closeBtn: 0,
  441. yes: function() {
  442. location.href = ns.url("fenxiao://shop/postertemplate/lists");
  443. },btn2: function() {
  444. location.reload();
  445. }
  446. })
  447. } else {
  448. layer.msg(res.message);
  449. }
  450. }
  451. });
  452. });
  453. });
  454. function back() {
  455. location.href = ns.url("fenxiao://shop/postertemplate/lists");
  456. localStorage.removeItem("poster_data");
  457. }
  458. $('body').on('click', '.layui-nav-more1', function() {
  459. $(this).addClass('layui-new-more1');
  460. $('.layer-form').css("display", 'none');
  461. });
  462. $('body').on('click', '.layui-new-more1', function() {
  463. $(this).removeClass('layui-new-more1');
  464. $('.layer-form').css("display", 'block');
  465. });
  466. $('body').on('click', '.layui-nav-more2', function() {
  467. $(this).addClass('layui-new-more2');
  468. $('.layer-form2').css("display", 'none');
  469. });
  470. $('body').on('click', '.layui-new-more2', function() {
  471. $(this).removeClass('layui-new-more2');
  472. $('.layer-form2').css("display", 'block');
  473. });
  474. $('body').on('click', '.js-delete', function() {
  475. $('.poster-right').css("background-image", 'none');
  476. });
  477. </script>
  478. {/block}
  479. {block name="copyright"}{/block}