index.blade.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. <div class="table-responsive">
  14. <table class="table table-striped table-hover align-middle mb-0" style="min-width: 900px;">
  15. <thead class="thead-light">
  16. <tr>
  17. <th style="width:82px;">档位</th>
  18. <th style="width:180px;">充值区间下限 (RechargeMin)</th>
  19. <th style="width:180px;">充值区间上限 (RechargeMax)</th>
  20. <th style="width:180px;">固定值 (FreeWinMax)</th>
  21. <th style="width:180px;">充值最大百分比 (RechargeMaxPercent)</th>
  22. <th style="width:160px;">税收比例 (TaxPercent)</th>
  23. </tr>
  24. </thead>
  25. <tbody class="config-form">
  26. @foreach([0,1,2,3,4,5] as $index => $level)
  27. <tr>
  28. <td>
  29. <span class="badge badge-primary">等级{{ $level }}</span>
  30. </td>
  31. <td>
  32. <input type="number" class="form-control form-control-sm"
  33. name="level[{{ $level }}][RechargeMin]"
  34. value="{{ $config[$level]['RechargeMin'] ?? 0 }}" />
  35. </td>
  36. <td>
  37. <input type="number" class="form-control form-control-sm"
  38. name="level[{{ $level }}][RechargeMax]"
  39. value="{{ $config[$level]['RechargeMax'] ?? 0 }}" />
  40. </td>
  41. <td>
  42. <input type="number" class="form-control form-control-sm"
  43. name="level[{{ $level }}][FreeWinMax]"
  44. value="{{ $config[$level]['FreeWinMax'] ?? 0 }}" />
  45. </td>
  46. <td>
  47. <div class="input-group input-group-sm">
  48. <input type="number" class="form-control"
  49. name="level[{{ $level }}][RechargeMaxPercent]"
  50. value="{{ $config[$level]['RechargeMaxPercent'] ?? 0 }}" />
  51. <div class="input-group-append"><span class="input-group-text">%</span></div>
  52. </div>
  53. </td>
  54. <td>
  55. <div class="input-group input-group-sm">
  56. <input type="number" class="form-control"
  57. name="level[{{ $level }}][TaxPercent]"
  58. value="{{ $config[$level]['TaxPercent'] ?? 0 }}" />
  59. <div class="input-group-append"><span class="input-group-text">%</span></div>
  60. </div>
  61. </td>
  62. </tr>
  63. @endforeach
  64. </tbody>
  65. </table>
  66. </div>
  67. <div class="d-flex align-items-center mt-4">
  68. <button class="btn btn-gradient-primary btn-sm save-config">
  69. <i class="mdi mdi-content-save"></i> 保存配置
  70. </button>
  71. <span class="save-status ml-3"></span>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <script>
  79. $(function() {
  80. $('.save-config').click(function(event) {
  81. const $form = $('.config-form');
  82. const $btn = $(this);
  83. const $status = $('.save-status');
  84. $btn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> 保存中...');
  85. $status.html('').removeClass('text-success text-danger');
  86. // 构建索引数组
  87. let configArray = [];
  88. for (let i = 0; i <= 5; i++) {
  89. configArray[i] = {
  90. "RechargeMin": 0,
  91. "RechargeMax": 0,
  92. "FreeWinMax": 0,
  93. "RechargeMaxPercent": 0,
  94. "TaxPercent": 0
  95. };
  96. }
  97. $form.find('input').each(function() {
  98. const name = this.name; // level[0][RechargeMin]
  99. const val = this.value;
  100. const m = name.match(/level\[(\d+)\]\[([^\]]+)\]/);
  101. if (m) {
  102. const lvl = parseInt(m[1]);
  103. const key = m[2];
  104. let num = parseInt(val || 0);
  105. if (isNaN(num)) num = 0;
  106. configArray[lvl][key] = num;
  107. }
  108. });
  109. $.post("{{ url('/admin/common-config/update') }}", {
  110. config: JSON.stringify(configArray),
  111. _token: "{{ csrf_token() }}"
  112. }).done(function(res){
  113. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存配置');
  114. if (res.status === 'success') {
  115. $status.text('更新成功').addClass('text-success');
  116. } else {
  117. $status.text(res.message || '更新失败').addClass('text-danger');
  118. }
  119. setTimeout(function(){ $status.fadeOut(function(){ $(this).text('').show().removeClass('text-success text-danger'); }); }, 3000);
  120. }).fail(function(){
  121. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存配置');
  122. $status.text('系统错误').addClass('text-danger');
  123. });
  124. });
  125. });
  126. </script>
  127. <style>
  128. .table thead th { white-space: nowrap; }
  129. .table tbody td { vertical-align: middle; }
  130. .input-group-text { min-width: 34px; justify-content: center; }
  131. .badge { font-size: .85rem; padding: .5em .6em; }
  132. </style>
  133. @endsection