add.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. {extend name="app/shop/view/base.html"/}
  2. {block name="resources"}
  3. <link rel="stylesheet" href="SHOP_CSS/game.css">
  4. <style>
  5. .iconreview{margin-right: 20px;}
  6. </style>
  7. {/block}
  8. {block name="main"}
  9. <div class="layui-form">
  10. <div class="layui-card card-common card-brief">
  11. <div class="layui-card-header">
  12. <span class="card-title">活动设置</span>
  13. </div>
  14. <div class="layui-card-body">
  15. <div class="layui-form-item">
  16. <label class="layui-form-label"><span class="required">*</span>活动名称:</label>
  17. <div class="layui-input-block">
  18. <input type="text" name="game_name" lay-verify="required" maxlength="15" placeholder="最多可填写15个字" autocomplete="off" class="layui-input len-long">
  19. </div>
  20. </div>
  21. <div class="layui-form-item">
  22. <label class="layui-form-label"><span class="required">*</span>活动时间:</label>
  23. <div class="layui-inline">
  24. <div class="layui-input-inline">
  25. <input type="text" id="start_time" name="start_time" lay-verify="required" class="layui-input len-mid" autocomplete="off" readonly>
  26. <i class=" iconrili iconfont calendar"></i>
  27. </div>
  28. <span class="layui-form-mid">-</span>
  29. <div class="layui-input-inline end-time">
  30. <input type="text" id="end_time" name="end_time" lay-verify="required|time" class="layui-input len-mid" autocomplete="off" readonly>
  31. <i class=" iconrili iconfont calendar"></i>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="layui-form-item">
  36. <label class="layui-form-label">活动说明:</label>
  37. <div class="layui-input-inline">
  38. <textarea name="remark" class="layui-textarea len-long" maxlength="150"></textarea>
  39. </div>
  40. </div>
  41. <div class="layui-form-item participation-condition">
  42. <label class="layui-form-label">参与条件:</label>
  43. <div class="layui-input-block">
  44. <input type="radio" name="level_id" value="0" lay-filter="participation" title="全部会员" checked>
  45. <input type="radio" name="level_id" value="1" lay-filter="participation" title="部分会员">
  46. </div>
  47. <div class="layui-inline layui-hide">
  48. <label class="layui-form-label"></label>
  49. <div class="layui-input-block">
  50. {foreach $member_level_list as $k =>$v}
  51. <input type="checkbox" class="level-id" value="{$v.level_id}" title="{$v.level_name}" lay-skin="primary">
  52. {/foreach}
  53. </div>
  54. </div>
  55. <div class="word-aux">选择参与的会员等级,默认为所有会员都可参与</div>
  56. </div>
  57. <div class="layui-form-item">
  58. <label class="layui-form-label"><span class="required">*</span>消耗积分:</label>
  59. <div class="layui-input-block">
  60. <input type="number" min="0" name="points" lay-verify="required" onchange="detectionNumType(this,'integral')" class="layui-input len-short" autocomplete="off" value="1">
  61. </div>
  62. </div>
  63. <div class="layui-form-item">
  64. <label class="layui-form-label"><span class="required">*</span>参与次数:</label>
  65. <div class="layui-input-block">
  66. <input type="radio" name="join_type" value="1" lay-verify="required" title="每天N次" checked>
  67. <input type="radio" name="join_type" value="0" lay-verify="required" title="一人N次">
  68. </div>
  69. </div>
  70. <div class="layui-form-item">
  71. <label class="layui-form-label"></label>
  72. <div class="layui-input-block">
  73. <input type="number" name="join_frequency" min="0" lay-verify="required" onchange="detectionNumType(this,'positiveInteger')" autocomplete="off" class="layui-input len-short" value="1"> 次
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <div class="layui-card card-common card-brief">
  79. <div class="layui-card-header">
  80. <span class="card-title">中奖设置</span>
  81. </div>
  82. <div class="layui-card-body">
  83. <div class="layui-form-item">
  84. <label class="layui-form-label"><span class="required">*</span>整体中奖概率:</label>
  85. <div class="layui-input-block">
  86. <input type="number" name="winning_rate" min="0" max="100" lay-verify="winning_rate" onchange="detectionNumType(this,'positiveNumber')" value="1.00" autocomplete="off" class="layui-input len-short"> %
  87. </div>
  88. <div class="word-aux">
  89. <span class="aux-title">注意:</span>
  90. <div class="aux-item">若整体中奖概率为100%,需满足以下条件:</div>
  91. <div class="aux-item">1、奖品对应的活动不能失效,奖品状态正常。</div>
  92. <div class="aux-item">2、保持奖品库存需充足,活动库存充足,当奖项被领取完,此时中奖概率已经非100%。</div>
  93. </div>
  94. </div>
  95. <div class="layui-form-item">
  96. <label class="layui-form-label">未中奖提示语:</label>
  97. <div class="layui-input-block">
  98. <input type="text" name="no_winning_desc" value="很遗憾,未中奖" lay-verify="required" autocomplete="off" class="layui-input len-long" maxlength="40">
  99. </div>
  100. </div>
  101. <div class="layui-form-item">
  102. <label class="layui-form-label">未中奖图片:</label>
  103. <div class="layui-input-block img-upload">
  104. <div class="upload-img-block square">
  105. <div class="upload-img-box hover">
  106. <div class="upload-default" id="no_winning_img">
  107. <div id="preview_no_winning_img" class="preview_img">
  108. <img layer-src src="__ROOT__/public/uniapp/game/no_winning.png" class="img_prev"/>
  109. </div>
  110. </div>
  111. <div class="operation">
  112. <div>
  113. <i title="图片预览" class="iconfont iconreview js-preview" ></i>
  114. <i title="删除图片" class="layui-icon layui-icon-delete js-delete"></i>
  115. </div>
  116. <div class="replace_img js-replace">点击替换</div>
  117. </div>
  118. <input type="hidden" name="no_winning_img" value="public/uniapp/game/no_winning.png"/>
  119. </div>
  120. <!-- <p id="no_winning_img" class="replace">替换</p>
  121. <input type="hidden" name="no_winning_img" value="public/uniapp/game/no_winning.png"/>
  122. <i class="del show">x</i> -->
  123. </div>
  124. </div>
  125. </div>
  126. <div class="layui-form-item">
  127. <label class="layui-form-label">中奖名单:</label>
  128. <div class="layui-input-block">
  129. <input type="radio" name="is_show_winner" value="0" lay-verify="required" title="不显示" checked>
  130. <input type="radio" name="is_show_winner" value="1" lay-verify="required" title="显示">
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <div class="layui-card card-common card-brief">
  136. <div class="layui-card-header">
  137. <span class="card-title">奖品设置</span>
  138. </div>
  139. <div class="layui-card-body">
  140. <div class="layui-form-item">
  141. <label class="layui-form-label">奖品明细:</label>
  142. <div class="layui-input-block">
  143. <table id="award_list"></table>
  144. </div>
  145. <div class="word-aux">
  146. <span class="aux-title">注意:</span>
  147. <div class="aux-item">1、奖项发放完毕之后活动将自动关闭</div>
  148. <div class="aux-item">2、奖品奖项不能少于1项且不能超过7项。</div>
  149. </div>
  150. <div class="word-aux">
  151. <button class="layui-btn" onclick="addAward()">添加奖品</button>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. <div class="form-row">
  157. <button class="layui-btn" lay-submit lay-filter="save">保存</button>
  158. <button class="layui-btn layui-btn-primary" onclick="back()">返回</button>
  159. <a id="noWinningImg"></a>
  160. </div>
  161. </div>
  162. {/block}
  163. {block name="script"}
  164. <!-- 添加奖品 -->
  165. {include file="turntable/award_select"/}
  166. <script>
  167. var form,laydate,laytpl,upload,tableData = [],
  168. repeat_flag = false,
  169. awardId = 0,
  170. currentDate = new Date(),
  171. minDate = "";
  172. var saveData = null;
  173. var totalUploadNum = 0;
  174. var completeUploadNum = 0;
  175. layui.use(['form', 'laydate', 'laytpl'], function() {
  176. form = layui.form;
  177. laydate = layui.laydate;
  178. laytpl = layui.laytpl;
  179. currentDate.setDate(currentDate.getDate() + 30);
  180. form.render();
  181. //开始时间
  182. laydate.render({
  183. elem: '#start_time', //指定元素
  184. type: 'datetime',
  185. value: new Date(),
  186. done: function(value) {
  187. minDate = value;
  188. reRender();
  189. }
  190. });
  191. //结束时间
  192. laydate.render({
  193. elem: '#end_time', //指定元素
  194. type: 'datetime',
  195. value: new Date(currentDate)
  196. });
  197. /**
  198. * 重新渲染结束时间
  199. * */
  200. function reRender() {
  201. $("#end_time").remove();
  202. $(".end-time").html('<input type="text" id="end_time" name="end_time" placeholder="请输入结束时间" lay-verify="required|time" class = "layui-input len-mid" autocomplete="off"> ');
  203. laydate.render({
  204. elem: '#end_time',
  205. type: 'datetime',
  206. min: minDate
  207. });
  208. }
  209. //参与条件
  210. form.on('radio(participation)', function(data){
  211. if (parseInt(data.value))
  212. $('.participation-condition .layui-inline').removeClass('layui-hide');
  213. else
  214. $('.participation-condition .layui-inline').addClass('layui-hide');
  215. });
  216. /**
  217. * 表单验证
  218. */
  219. form.verify({
  220. time: function(value) {
  221. var now_time = (new Date()).getTime();
  222. var start_time = (new Date($("#start_time").val())).getTime();
  223. var end_time = (new Date(value)).getTime();
  224. if (now_time > end_time) {
  225. return '结束时间不能小于当前时间!'
  226. }
  227. if (start_time > end_time) {
  228. return '结束时间不能小于开始时间!';
  229. }
  230. },
  231. flnum: function(value) {
  232. var arrMen = value.split(".");
  233. var val = 0;
  234. if (arrMen.length == 2) {
  235. val = arrMen[1];
  236. }
  237. if (val.length > 2) {
  238. return '保留小数点后两位!'
  239. }
  240. },
  241. int: function(value) {
  242. if (value <= 1 || value % 1 != 0) {
  243. return '请输入大于1的正整数!'
  244. }
  245. },
  246. winning_rate:function (value) {
  247. var reg = /^\d{0,2}(.?\d{0,2})$/;
  248. if (value.length > 0) {
  249. if (isNaN(value)) {
  250. return '中奖概率输入错误';
  251. }
  252. if (!reg.test(value) || value < 0 || value > 100) {
  253. return '中奖概率范围:0~100%';
  254. }
  255. }
  256. }
  257. });
  258. /**
  259. * 表单提交
  260. */
  261. form.on('submit(save)', function(data){
  262. saveData = data;
  263. if(repeat_flag) return;
  264. repeat_flag = true;
  265. if (tableData.length > 7){
  266. layer.msg("奖品奖项不能超出7项。");
  267. return false;
  268. }
  269. if (!tableData.length){
  270. layer.msg("奖品奖项不能少于1项。");
  271. return false;
  272. }
  273. var obj = $("img.img_prev[data-prev='1']");
  274. totalUploadNum = obj.length;
  275. if(totalUploadNum > 0){
  276. obj.each(function(){
  277. var actionId = $(this).attr('data-action-id');
  278. $(actionId).click();
  279. })
  280. }else{
  281. saveFunc();
  282. }
  283. });
  284. upload = new Upload({
  285. elem: '#no_winning_img',
  286. auto:false,
  287. bindAction:'#noWinningImg',
  288. callback: function(res) {
  289. uploadComplete('no_winning_img', res.data.pic_path);
  290. }
  291. });
  292. function uploadComplete(field, pic_path) {
  293. saveData.field[field] = pic_path;
  294. completeUploadNum += 1;
  295. if(completeUploadNum == totalUploadNum){
  296. saveFunc();
  297. }
  298. }
  299. function saveFunc(){
  300. var data = saveData;
  301. if (parseInt(data.field.level_id)){
  302. var levelId = [],
  303. levelName = [];
  304. $('.level-id').each(function(){
  305. if($(this).prop('checked')){
  306. levelId.push($(this).val());
  307. levelName.push($(this).attr("title"));
  308. }
  309. });
  310. data.field.level_id = levelId.toString();
  311. data.field.level_name = levelName.toString();
  312. }
  313. data.field.award_json = JSON.stringify(tableData);
  314. if (!data.field.no_winning_img && upload.path != 'public/uniapp/game/no_winning.png') upload.delete();
  315. $.ajax({
  316. type: 'POST',
  317. dataType: 'JSON',
  318. url: ns.url("turntable://shop/turntable/add"),
  319. data: data.field,
  320. async: false,
  321. success: function(res){
  322. repeat_flag = false;
  323. if (res.code == 0) {
  324. layer.confirm('添加成功', {
  325. title:'操作提示',
  326. btn: ['返回列表', '继续添加'],
  327. closeBtn: 0,
  328. yes: function(){
  329. location.href = ns.url("turntable://shop/turntable/lists");
  330. },
  331. btn2: function() {
  332. location.href = ns.url("turntable://shop/turntable/add");
  333. }
  334. });
  335. }else{
  336. layer.msg(res.message);
  337. }
  338. }
  339. })
  340. }
  341. });
  342. /*
  343. * 渲染表格
  344. * */
  345. renderTable();
  346. function renderTable(data = []){
  347. var table = new Table({
  348. elem: "#award_list",
  349. cols: [
  350. [{
  351. field: 'award_name',
  352. title: '名称',
  353. width: '20%',
  354. unresize: 'false'
  355. },{
  356. field: 'award_type',
  357. title: '奖品',
  358. unresize: 'false',
  359. width: '20%',
  360. templet: function(data) {
  361. var type = data.award_type == 1 ? '积分' : data.award_type == 2 ? '红包' : '优惠券';
  362. return type;
  363. }
  364. },
  365. // {
  366. // title: '图片',
  367. // unresize: 'false',
  368. // width: '15%',
  369. // templet: function (data) {
  370. // var html = '<div class="img-box">';
  371. // html += '<img src="__ROOT__/'+ data.award_img +'"/>';
  372. // html += '</div>';
  373. // return html;
  374. // }
  375. // },
  376. {
  377. field: 'award_num',
  378. title: '奖品数量',
  379. unresize: 'false',
  380. width: '15%',
  381. }, {
  382. field: 'award_winning_rate',
  383. title: '奖项权重',
  384. unresize: 'false',
  385. width: '15%'
  386. },{
  387. title: '操作',
  388. toolbar: '#operation',
  389. align: 'right',
  390. unresize: 'false'
  391. }]
  392. ],
  393. data: data
  394. });
  395. }
  396. //添加奖品
  397. function addAward(){
  398. awardPop();
  399. }
  400. //编辑奖品
  401. function ediAward(el) {
  402. var data = $(el).attr("data-value");
  403. awardPop(JSON.parse(data));
  404. }
  405. //删除奖品
  406. function delAward(data) {
  407. for (var i = 0; i < tableData.length; i++){
  408. if (tableData[i].ident == data){
  409. tableData.splice(i,1);
  410. renderTable(tableData);
  411. }
  412. }
  413. }
  414. function back() {
  415. location.href = ns.url("turntable://shop/turntable/lists");
  416. }
  417. function detectionNumType(el,type){
  418. var value = $(el).val();
  419. //大于零 且 不是小数
  420. if (value < 0 && type == 'integral') $(el).val(0);
  421. else if(type == 'integral') $(el).val(Math.round(value));
  422. //大于1 且 不是小数
  423. if (value < 1 && type == 'positiveInteger'){
  424. $(el).val(1);
  425. } else if (type == 'positiveInteger'){
  426. var val = Math.round(value);
  427. if(Object.is(val,NaN)){
  428. $(el).val(1);
  429. }else{
  430. $(el).val(val);
  431. }
  432. }
  433. //大于零可以是小数
  434. if (type == 'positiveNumber'){
  435. value = parseFloat(value);
  436. if (value < 0) $(el).val(0);
  437. else $(el).val(value);
  438. }
  439. }
  440. </script>
  441. <script type="text/html" id="operation">
  442. <div class="table-btn">
  443. <a class="layui-btn" data-value='{{JSON.stringify(d)}}' onclick="ediAward(this)">编辑</a>
  444. <a class="layui-btn" onclick="delAward('{{d.ident}}')">删除</a>
  445. </div>
  446. </script>
  447. {/block}