index.blade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. <div class="form-group">
  39. <label>活动图标地址</label>
  40. <input type="text" class="form-control" name="icon_url"
  41. placeholder="请输入活动图标URL"
  42. value="{{ $activity['icon_url'] ?? '' }}">
  43. </div>
  44. <div class="form-group">
  45. <label>充值规则(充值金额 -> 次数)</label>
  46. <table class="table table-bordered" id="rules-table">
  47. <thead>
  48. <tr>
  49. <th>充值金额 (amount)</th>
  50. <th>赠送次数 (times)</th>
  51. <th>操作</th>
  52. </tr>
  53. </thead>
  54. <tbody>
  55. @foreach($rules as $idx => $rule)
  56. <tr>
  57. <td>
  58. <input type="number" step="0.01" class="form-control"
  59. name="rules[{{ $idx }}][amount]"
  60. value="{{ $rule['amount'] }}">
  61. </td>
  62. <td>
  63. <input type="number" step="1" class="form-control"
  64. name="rules[{{ $idx }}][times]"
  65. value="{{ $rule['times'] }}">
  66. </td>
  67. <td>
  68. <button type="button" class="btn btn-sm btn-danger" onclick="removeRuleRow(this)">删除</button>
  69. </td>
  70. </tr>
  71. @endforeach
  72. </tbody>
  73. </table>
  74. <button type="button" class="btn btn-sm btn-gradient-info" onclick="addRuleRow()">添加规则</button>
  75. <small class="form-text text-muted mt-2">
  76. 说明:这里配置充值金额与对应增加的大转盘次数,例如 9.99 → 1 次。
  77. </small>
  78. </div>
  79. </form>
  80. </div>
  81. </div>
  82. </div>
  83. </div>
  84. <div class="row mt-3">
  85. <div class="col-12 grid-margin stretch-card">
  86. <div class="card">
  87. <div class="card-body">
  88. <h4 class="card-title">16档转盘配置</h4>
  89. <p class="card-description">slot_index 0-15,每档一个 reward(奖励值)、weight(权重)、sort_index(排序索引)</p>
  90. <div class="table-responsive">
  91. <table class="table table-bordered">
  92. <thead>
  93. <tr>
  94. <th>档位索引 (slot_index)</th>
  95. <th>奖励值 (reward)</th>
  96. <th>权重 (weight)</th>
  97. <th>排序索引 (sort_index)</th>
  98. </tr>
  99. </thead>
  100. <tbody>
  101. @foreach($slots as $slot)
  102. <tr>
  103. <td>
  104. <input type="text" class="form-control" value="{{ $slot['slot_index'] }}" disabled>
  105. </td>
  106. <td>
  107. <input type="number" step="0.01" class="form-control"
  108. name="slots[{{ $slot['slot_index'] }}][reward]"
  109. value="{{ $slot['reward'] }}">
  110. </td>
  111. <td>
  112. <input type="number" step="1" class="form-control"
  113. name="slots[{{ $slot['slot_index'] }}][weight]"
  114. value="{{ $slot['weight'] }}">
  115. </td>
  116. <td>
  117. <input type="number" step="1" class="form-control"
  118. name="slots[{{ $slot['slot_index'] }}][sort_index]"
  119. value="{{ $slot['sort_index'] }}">
  120. </td>
  121. </tr>
  122. @endforeach
  123. </tbody>
  124. </table>
  125. </div>
  126. <button type="button" class="btn btn-sm btn-gradient-primary mt-3" onclick="saveConfig()">
  127. <i class="mdi mdi-content-save"></i> 保存配置
  128. </button>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <script>
  136. function saveConfig() {
  137. var activityData = $("#activity-form").serializeArray();
  138. var data = {};
  139. activityData.forEach(function (item) {
  140. data[item.name] = item.value;
  141. });
  142. var slots = {};
  143. $("input[name^='slots']").each(function () {
  144. var name = $(this).attr('name'); // slots[0][reward]
  145. var match = name.match(/slots\[(\d+)]\[(\w+)]/);
  146. if (match) {
  147. var index = match[1];
  148. var field = match[2];
  149. if (!slots[index]) {
  150. slots[index] = {};
  151. }
  152. slots[index][field] = $(this).val();
  153. }
  154. });
  155. data['slots'] = slots;
  156. // 处理充值规则
  157. var rules = {};
  158. $("input[name^='rules']").each(function () {
  159. var name = $(this).attr('name'); // rules[0][amount]
  160. var match = name.match(/rules\[(\d+)]\[(\w+)]/);
  161. if (match) {
  162. var index = match[1];
  163. var field = match[2];
  164. if (!rules[index]) {
  165. rules[index] = {};
  166. }
  167. rules[index][field] = $(this).val();
  168. }
  169. });
  170. // 转成数组并过滤空行
  171. var rulesArr = [];
  172. Object.keys(rules).forEach(function (k) {
  173. var r = rules[k];
  174. var amount = parseFloat(r.amount || 0);
  175. var times = parseInt(r.times || 0);
  176. if (!isNaN(amount) && amount > 0 && !isNaN(times) && times > 0) {
  177. rulesArr.push({amount: amount, times: times});
  178. }
  179. });
  180. data['recharge_rules'] = JSON.stringify(rulesArr);
  181. myRequest('/admin/holiday-wheel/update', 'post', data, function (res) {
  182. layer.msg(res.msg || (res.code === '200' ? '保存成功' : '保存失败'));
  183. if (res.code === '200') {
  184. setTimeout(function () {
  185. window.location.reload();
  186. }, 1500);
  187. }
  188. });
  189. }
  190. function addRuleRow() {
  191. var tbody = $("#rules-table tbody");
  192. var index = tbody.children("tr").length;
  193. var row = '<tr>' +
  194. '<td><input type="number" step="0.01" class="form-control" name="rules[' + index + '][amount]" value=""></td>' +
  195. '<td><input type="number" step="1" class="form-control" name="rules[' + index + '][times]" value=""></td>' +
  196. '<td><button type="button" class="btn btn-sm btn-danger" onclick="removeRuleRow(this)">删除</button></td>' +
  197. '</tr>';
  198. tbody.append(row);
  199. }
  200. function removeRuleRow(btn) {
  201. $(btn).closest('tr').remove();
  202. }
  203. </script>
  204. @endsection