index.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. @extends('base.base')
  2. @section('base')
  3. <meta name="csrf-token" content="{{ csrf_token() }}">
  4. <div class="container-fluid">
  5. <div class="row">
  6. <div class="col-12">
  7. <div class="card">
  8. <div class="card-header d-flex align-items-center justify-content-between">
  9. <h3 class="card-title mb-0">公用配置管理</h3>
  10. <small class="text-muted">编辑 6 档参数并一键保存 (索引 0-5)</small>
  11. </div>
  12. <div class="card-body">
  13. <!-- 标签页导航 -->
  14. <ul class="nav nav-tabs mb-3" role="tablist">
  15. <li class="nav-item">
  16. <a class="nav-link active" data-toggle="tab" href="#common-config" role="tab">
  17. <i class="mdi mdi-cog"></i> 常规配置
  18. </a>
  19. </li>
  20. <li class="nav-item">
  21. <a class="nav-link" data-toggle="tab" href="#special-config" role="tab">
  22. <i class="mdi mdi-package-variant"></i> 库存模式
  23. </a>
  24. </li>
  25. </ul>
  26. <!-- 标签页内容 -->
  27. <div class="tab-content">
  28. <!-- 常规配置标签页 -->
  29. <div class="tab-pane fade show active" id="common-config" role="tabpanel">
  30. <div class="table-responsive">
  31. <table class="table table-striped table-hover align-middle mb-0" style="min-width: 900px;">
  32. <thead class="thead-light">
  33. <tr>
  34. <th style="width:82px;">档位</th>
  35. <th style="width:180px;">充值区间下限 (RechargeMin)</th>
  36. <th style="width:180px;">充值区间上限 (RechargeMax)</th>
  37. <th style="width:180px;">固定值 (FreeWinMax)</th>
  38. <th style="width:180px;">充值最大百分比 (RechargeMaxPercent)</th>
  39. <th style="width:160px;">税收比例 (TaxPercent)</th>
  40. </tr>
  41. </thead>
  42. <tbody class="config-form" data-config-type="common">
  43. @foreach([0,1,2,3,4,5] as $index => $level)
  44. <tr>
  45. <td>
  46. <span class="badge badge-primary">等级{{ $level }}</span>
  47. </td>
  48. <td>
  49. <input type="number" class="form-control form-control-sm"
  50. name="level[{{ $level }}][RechargeMin]"
  51. value="{{ $config[$level]['RechargeMin'] ?? 0 }}" />
  52. </td>
  53. <td>
  54. <input type="number" class="form-control form-control-sm"
  55. name="level[{{ $level }}][RechargeMax]"
  56. value="{{ $config[$level]['RechargeMax'] ?? 0 }}" />
  57. </td>
  58. <td>
  59. <input type="number" class="form-control form-control-sm"
  60. name="level[{{ $level }}][FreeWinMax]"
  61. value="{{ $config[$level]['FreeWinMax'] ?? 0 }}" />
  62. </td>
  63. <td>
  64. <div class="input-group input-group-sm">
  65. <input type="number" class="form-control"
  66. name="level[{{ $level }}][RechargeMaxPercent]"
  67. value="{{ $config[$level]['RechargeMaxPercent'] ?? 0 }}" />
  68. <div class="input-group-append"><span class="input-group-text">%</span></div>
  69. </div>
  70. </td>
  71. <td>
  72. <div class="input-group input-group-sm">
  73. <input type="number" class="form-control"
  74. name="level[{{ $level }}][TaxPercent]"
  75. value="{{ $config[$level]['TaxPercent'] ?? 0 }}" />
  76. <div class="input-group-append"><span class="input-group-text">%</span></div>
  77. </div>
  78. </td>
  79. </tr>
  80. @endforeach
  81. </tbody>
  82. </table>
  83. </div>
  84. <div class="d-flex align-items-center mt-4">
  85. <button class="btn btn-gradient-primary btn-sm save-config" data-config-type="common">
  86. <i class="mdi mdi-content-save"></i> 保存配置
  87. </button>
  88. <span class="save-status ml-3"></span>
  89. </div>
  90. </div>
  91. <!-- 库存模式标签页 -->
  92. <div class="tab-pane fade" id="special-config" role="tabpanel">
  93. <div class="table-responsive">
  94. <table class="table table-striped table-hover align-middle mb-0" style="min-width: 900px;">
  95. <thead class="thead-light">
  96. <tr>
  97. <th style="width:82px;">档位</th>
  98. <th style="width:180px;">充值区间下限 (RechargeMin)</th>
  99. <th style="width:180px;">充值区间上限 (RechargeMax)</th>
  100. <th style="width:180px;">固定值 (FreeWinMax)</th>
  101. <th style="width:180px;">充值最大百分比 (RechargeMaxPercent)</th>
  102. <th style="width:160px;">税收比例 (TaxPercent)</th>
  103. </tr>
  104. </thead>
  105. <tbody class="config-form" data-config-type="special">
  106. @foreach([0,1,2,3,4,5] as $index => $level)
  107. <tr>
  108. <td>
  109. <span class="badge badge-success">等级{{ $level }}</span>
  110. </td>
  111. <td>
  112. <input type="number" class="form-control form-control-sm"
  113. name="level[{{ $level }}][RechargeMin]"
  114. value="{{ $specialConfig[$level]['RechargeMin'] ?? 0 }}" />
  115. </td>
  116. <td>
  117. <input type="number" class="form-control form-control-sm"
  118. name="level[{{ $level }}][RechargeMax]"
  119. value="{{ $specialConfig[$level]['RechargeMax'] ?? 0 }}" />
  120. </td>
  121. <td>
  122. <input type="number" class="form-control form-control-sm"
  123. name="level[{{ $level }}][FreeWinMax]"
  124. value="{{ $specialConfig[$level]['FreeWinMax'] ?? 0 }}" />
  125. </td>
  126. <td>
  127. <div class="input-group input-group-sm">
  128. <input type="number" class="form-control"
  129. name="level[{{ $level }}][RechargeMaxPercent]"
  130. value="{{ $specialConfig[$level]['RechargeMaxPercent'] ?? 0 }}" />
  131. <div class="input-group-append"><span class="input-group-text">%</span></div>
  132. </div>
  133. </td>
  134. <td>
  135. <div class="input-group input-group-sm">
  136. <input type="number" class="form-control"
  137. name="level[{{ $level }}][TaxPercent]"
  138. value="{{ $specialConfig[$level]['TaxPercent'] ?? 0 }}" />
  139. <div class="input-group-append"><span class="input-group-text">%</span></div>
  140. </div>
  141. </td>
  142. </tr>
  143. @endforeach
  144. </tbody>
  145. </table>
  146. </div>
  147. <div class="d-flex align-items-center mt-4">
  148. <button class="btn btn-gradient-primary btn-sm save-config" data-config-type="special">
  149. <i class="mdi mdi-content-save"></i> 保存配置
  150. </button>
  151. <span class="save-status ml-3"></span>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. <script>
  161. $(function() {
  162. $('.save-config').click(function(event) {
  163. const $btn = $(this);
  164. const configType = $btn.data('config-type'); // 获取配置类型 common 或 special
  165. const $form = $('.config-form[data-config-type="' + configType + '"]');
  166. const $status = $btn.closest('.tab-pane').find('.save-status');
  167. $btn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> 保存中...');
  168. $status.html('').removeClass('text-success text-danger');
  169. // 构建索引数组
  170. let configArray = [];
  171. for (let i = 0; i <= 5; i++) {
  172. configArray[i] = {
  173. "RechargeMin": 0,
  174. "RechargeMax": 0,
  175. "FreeWinMax": 0,
  176. "RechargeMaxPercent": 0,
  177. "TaxPercent": 0
  178. };
  179. }
  180. $form.find('input').each(function() {
  181. const name = this.name; // level[0][RechargeMin]
  182. const val = this.value;
  183. const m = name.match(/level\[(\d+)\]\[([^\]]+)\]/);
  184. if (m) {
  185. const lvl = parseInt(m[1]);
  186. const key = m[2];
  187. let num = parseInt(val || 0);
  188. if (isNaN(num)) num = 0;
  189. configArray[lvl][key] = num;
  190. }
  191. });
  192. $.post("{{ url('/admin/common-config/update') }}", {
  193. config: JSON.stringify(configArray),
  194. config_type: configType,
  195. _token: "{{ csrf_token() }}"
  196. }).done(function(res){
  197. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存配置');
  198. if (res.status === 'success') {
  199. $status.text('更新成功').addClass('text-success');
  200. } else {
  201. $status.text(res.message || '更新失败').addClass('text-danger');
  202. }
  203. setTimeout(function(){ $status.fadeOut(function(){ $(this).text('').show().removeClass('text-success text-danger'); }); }, 3000);
  204. }).fail(function(){
  205. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存配置');
  206. $status.text('系统错误').addClass('text-danger');
  207. });
  208. });
  209. });
  210. </script>
  211. <style>
  212. .table thead th { white-space: nowrap; }
  213. .table tbody td { vertical-align: middle; }
  214. .input-group-text { min-width: 34px; justify-content: center; }
  215. .badge { font-size: .85rem; padding: .5em .6em; }
  216. </style>
  217. @endsection