index.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. @extends('base.base')
  2. @section('base')
  3. <div class="main-panel">
  4. <div class="content-wrapper">
  5. <div class="page-header">
  6. <h3 class="page-title">
  7. <span class="page-title-icon bg-gradient-primary text-white mr-2">
  8. <i class="mdi mdi-tumblr-reblog"></i>
  9. </span>
  10. 圣诞大转盘配置
  11. </h3>
  12. </div>
  13. <div class="row">
  14. <div class="col-12 grid-margin stretch-card">
  15. <div class="card">
  16. <div class="card-body">
  17. <h4 class="card-title">活动配置</h4>
  18. <form class="forms-sample" id="activity-form">
  19. <div class="form-row">
  20. <div class="form-group col-md-4">
  21. <label>活动开始时间</label>
  22. <input type="datetime-local" class="form-control" name="start_time"
  23. value="{{ !empty($activity['start_time']) ? \Carbon\Carbon::parse($activity['start_time'])->format('Y-m-d\TH:i') : '' }}">
  24. </div>
  25. <div class="form-group col-md-4">
  26. <label>活动结束时间</label>
  27. <input type="datetime-local" class="form-control" name="end_time"
  28. value="{{ !empty($activity['end_time']) ? \Carbon\Carbon::parse($activity['end_time'])->format('Y-m-d\TH:i') : '' }}">
  29. </div>
  30. <div class="form-group col-md-4">
  31. <label>活动状态</label>
  32. <select class="form-control" name="status">
  33. <option value="0" {{ ($activity['status'] ?? 0) == 0 ? 'selected' : '' }}>关闭</option>
  34. <option value="1" {{ ($activity['status'] ?? 0) == 1 ? 'selected' : '' }}>开启</option>
  35. </select>
  36. </div>
  37. </div>
  38. {{-- 隐藏图片地址配置 --}}
  39. <input type="hidden" name="icon_url" value="{{ $activity['icon_url'] ?? '' }}">
  40. <input type="hidden" name="button_url" value="{{ $activity['button_url'] ?? '' }}">
  41. <input type="hidden" name="button_light_url" value="{{ $activity['button_light_url'] ?? '' }}">
  42. <input type="hidden" name="lunzi_url" value="{{ $activity['lunzi_url'] ?? '' }}">
  43. <input type="hidden" name="dipan_url" value="{{ $activity['dipan_url'] ?? '' }}">
  44. <div class="form-group">
  45. <label>免费转盘次数</label>
  46. <input type="number" step="1" min="0" class="form-control" name="free_times"
  47. placeholder="未充值用户可获得的免费转盘次数(0表示不赠送)"
  48. value="{{ $activity['free_times'] ?? 0 }}">
  49. <small class="form-text text-muted">
  50. 说明:配置免费次数后,未充值的用户首次访问转盘时会自动获得该次数。每个用户只能获得一次免费次数。
  51. </small>
  52. </div>
  53. <div class="form-group">
  54. <label>充值规则(充值金额 -> 次数)</label>
  55. <table class="table table-bordered" id="rules-table">
  56. <thead>
  57. <tr>
  58. <th>充值金额 (amount)</th>
  59. <th>赠送次数 (times)</th>
  60. <th>操作</th>
  61. </tr>
  62. </thead>
  63. <tbody>
  64. @foreach($rules as $idx => $rule)
  65. <tr>
  66. <td>
  67. <input type="number" step="0.01" class="form-control"
  68. name="rules[{{ $idx }}][amount]"
  69. value="{{ $rule['amount'] }}">
  70. </td>
  71. <td>
  72. <input type="number" step="1" class="form-control"
  73. name="rules[{{ $idx }}][times]"
  74. value="{{ $rule['times'] }}">
  75. </td>
  76. <td>
  77. <button type="button" class="btn btn-sm btn-danger" onclick="removeRuleRow(this)">删除</button>
  78. </td>
  79. </tr>
  80. @endforeach
  81. </tbody>
  82. </table>
  83. <button type="button" class="btn btn-sm btn-gradient-info" onclick="addRuleRow()">添加规则</button>
  84. <small class="form-text text-muted mt-2">
  85. 说明:这里配置充值金额与对应增加的大转盘次数,例如 9.99 → 1 次。
  86. </small>
  87. </div>
  88. </form>
  89. </div>
  90. </div>
  91. </div>
  92. </div>
  93. <div class="row mt-3">
  94. <div class="col-12 grid-margin stretch-card">
  95. <div class="card">
  96. <div class="card-body">
  97. <h4 class="card-title">9档转盘配置</h4>
  98. <p class="card-description">slot_index 0-8,每档一个 reward(奖励值)、weight(权重)、sort_index(排序索引)</p>
  99. <div class="table-responsive">
  100. <table class="table table-bordered">
  101. <thead>
  102. <tr>
  103. <th>档位索引 (slot_index)</th>
  104. <th>奖励值 (reward)</th>
  105. <th>权重 (weight)</th>
  106. <th>排序索引 (sort_index)</th>
  107. </tr>
  108. </thead>
  109. <tbody>
  110. @foreach($slots as $slot)
  111. <tr>
  112. <td>
  113. <input type="text" class="form-control" value="{{ $slot['slot_index'] }}" disabled>
  114. </td>
  115. <td>
  116. <input type="number" step="any" class="form-control"
  117. name="slots[{{ $slot['slot_index'] }}][reward]"
  118. value="{{ $slot['reward'] }}">
  119. </td>
  120. <td>
  121. <input type="number" step="1" class="form-control"
  122. name="slots[{{ $slot['slot_index'] }}][weight]"
  123. value="{{ $slot['weight'] }}">
  124. </td>
  125. <td>
  126. <input type="number" step="1" class="form-control"
  127. name="slots[{{ $slot['slot_index'] }}][sort_index]"
  128. value="{{ $slot['sort_index'] }}">
  129. </td>
  130. </tr>
  131. @endforeach
  132. </tbody>
  133. </table>
  134. </div>
  135. <button type="button" class="btn btn-sm btn-gradient-primary mt-3" onclick="saveConfig()">
  136. <i class="mdi mdi-content-save"></i> 保存配置
  137. </button>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. </div>
  144. <script>
  145. function saveConfig() {
  146. var activityData = $("#activity-form").serializeArray();
  147. var data = {};
  148. activityData.forEach(function (item) {
  149. data[item.name] = item.value;
  150. });
  151. var slots = {};
  152. $("input[name^='slots']").each(function () {
  153. var name = $(this).attr('name'); // slots[0][reward]
  154. var match = name.match(/slots\[(\d+)]\[(\w+)]/);
  155. if (match) {
  156. var index = match[1];
  157. var field = match[2];
  158. if (!slots[index]) {
  159. slots[index] = {};
  160. }
  161. slots[index][field] = $(this).val();
  162. }
  163. });
  164. data['slots'] = slots;
  165. // 处理充值规则
  166. var rules = {};
  167. $("input[name^='rules']").each(function () {
  168. var name = $(this).attr('name'); // rules[0][amount]
  169. var match = name.match(/rules\[(\d+)]\[(\w+)]/);
  170. if (match) {
  171. var index = match[1];
  172. var field = match[2];
  173. if (!rules[index]) {
  174. rules[index] = {};
  175. }
  176. rules[index][field] = $(this).val();
  177. }
  178. });
  179. // 转成数组并过滤空行
  180. var rulesArr = [];
  181. Object.keys(rules).forEach(function (k) {
  182. var r = rules[k];
  183. var amount = parseFloat(r.amount || 0);
  184. var times = parseInt(r.times || 0);
  185. if (!isNaN(amount) && amount > 0 && !isNaN(times) && times > 0) {
  186. rulesArr.push({amount: amount, times: times});
  187. }
  188. });
  189. data['recharge_rules'] = JSON.stringify(rulesArr);
  190. myRequest('/admin/christmas-wheel/update', 'post', data, function (res) {
  191. layer.msg(res.msg || (res.code === '200' ? '保存成功' : '保存失败'));
  192. if (res.code === '200') {
  193. setTimeout(function () {
  194. window.location.reload();
  195. }, 1500);
  196. }
  197. });
  198. }
  199. function addRuleRow() {
  200. var tbody = $("#rules-table tbody");
  201. var index = tbody.children("tr").length;
  202. var row = '<tr>' +
  203. '<td><input type="number" step="0.01" class="form-control" name="rules[' + index + '][amount]" value=""></td>' +
  204. '<td><input type="number" step="1" class="form-control" name="rules[' + index + '][times]" value=""></td>' +
  205. '<td><button type="button" class="btn btn-sm btn-danger" onclick="removeRuleRow(this)">删除</button></td>' +
  206. '</tr>';
  207. tbody.append(row);
  208. }
  209. function removeRuleRow(btn) {
  210. $(btn).closest('tr').remove();
  211. }
  212. </script>
  213. @endsection