index.blade.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. @extends('base.base')
  2. @section('base')
  3. <meta name="csrf-token" content="{{ csrf_token() }}">
  4. <div class="main-panel">
  5. <div class="content-wrapper">
  6. <div class="page-header">
  7. <h3 class="page-title">
  8. <span class="page-title-icon bg-gradient-primary text-white mr-2">
  9. <i class="mdi mdi-percent"></i>
  10. </span>
  11. 游戏税收比例管理
  12. </h3>
  13. <nav aria-label="breadcrumb">
  14. <ol class="breadcrumb">
  15. <li class="breadcrumb-item"><a href="#">游戏配置</a></li>
  16. <li class="breadcrumb-item active" aria-current="page">税收比例管理</li>
  17. </ol>
  18. </nav>
  19. </div>
  20. <div class="row">
  21. <div class="col-12">
  22. <div class="card">
  23. <div class="card-header">
  24. <h3 class="card-title mb-0">游戏税收比例配置</h3>
  25. </div>
  26. <div class="card-body">
  27. <div class="row">
  28. <div class="col-md-8">
  29. <form id="taxForm">
  30. <div class="form-group">
  31. <label for="revenue_ratio">税收比例 <small class="text-muted">(所有游戏共用此比例)</small></label>
  32. <div class="input-group" style="max-width: 300px;">
  33. <input type="number"
  34. class="form-control"
  35. id="revenue_ratio"
  36. name="revenue_ratio"
  37. value="{{ $revenueRatio }}"
  38. min="0"
  39. max="100"
  40. step="0.1"
  41. placeholder="请输入税收比例">
  42. <div class="input-group-append">
  43. <span class="input-group-text">%</span>
  44. </div>
  45. </div>
  46. <small class="form-text text-muted">
  47. 说明:此税收比例将应用到所有游戏房间。输入5表示5%,系统会自动转换为千分比(50)存储到数据库。
  48. </small>
  49. </div>
  50. <div class="form-group">
  51. <button type="submit" class="btn btn-gradient-primary" id="saveBtn">
  52. <i class="mdi mdi-content-save"></i> 保存修改
  53. </button>
  54. <span class="ml-3" id="saveStatus"></span>
  55. </div>
  56. </form>
  57. </div>
  58. </div>
  59. <div class="row mt-4">
  60. <div class="col-md-12">
  61. <div class="alert alert-info">
  62. <h5 class="alert-heading"><i class="mdi mdi-information"></i> 注意事项</h5>
  63. <ul class="mb-0">
  64. <li>税收比例范围为 0% - 100%</li>
  65. <li>所有游戏的税收值都是统一的,修改后将更新 <code>QPPlatformDB.dbo.GameRoomInfo</code> 表中所有记录的 <code>RevenueRatio</code> 字段</li>
  66. <li>数据库存储格式为千分比,例如:输入 5% 会存储为 50</li>
  67. <li>修改操作会影响所有游戏房间,请谨慎操作</li>
  68. </ul>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. <script>
  79. $(function() {
  80. // 设置CSRF token
  81. $.ajaxSetup({
  82. headers: {
  83. 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
  84. }
  85. });
  86. $('#taxForm').on('submit', function(e) {
  87. e.preventDefault();
  88. const $btn = $('#saveBtn');
  89. const $status = $('#saveStatus');
  90. const revenueRatio = $('#revenue_ratio').val();
  91. // 验证输入
  92. if (!revenueRatio || revenueRatio === '') {
  93. $status.html('<span class="text-danger">请输入税收比例</span>');
  94. return;
  95. }
  96. const revenueRatioFloat = parseFloat(revenueRatio);
  97. if (isNaN(revenueRatioFloat) || revenueRatioFloat < 0 || revenueRatioFloat > 100) {
  98. $status.html('<span class="text-danger">税收比例必须在 0-100 之间</span>');
  99. return;
  100. }
  101. // 禁用按钮,显示加载状态
  102. $btn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> 保存中...');
  103. $status.html('');
  104. // 发送AJAX请求
  105. $.ajax({
  106. url: "{{ url('/admin/game-tax/update') }}",
  107. type: 'POST',
  108. data: {
  109. revenue_ratio: revenueRatioFloat
  110. },
  111. success: function(response) {
  112. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存修改');
  113. if (response.code == 200) {
  114. $status.html('<span class="text-success"><i class="mdi mdi-check-circle"></i> ' + response.msg + '</span>');
  115. // 3秒后清除提示
  116. setTimeout(function() {
  117. $status.fadeOut(function() {
  118. $(this).html('').show();
  119. });
  120. }, 3000);
  121. } else {
  122. $status.html('<span class="text-danger"><i class="mdi mdi-alert-circle"></i> ' + (response.msg || '保存失败') + '</span>');
  123. }
  124. },
  125. error: function(xhr) {
  126. $btn.prop('disabled', false).html('<i class="mdi mdi-content-save"></i> 保存修改');
  127. let errorMsg = '系统错误';
  128. if (xhr.responseJSON && xhr.responseJSON.msg) {
  129. errorMsg = xhr.responseJSON.msg;
  130. } else if (xhr.responseText) {
  131. try {
  132. const response = JSON.parse(xhr.responseText);
  133. errorMsg = response.msg || errorMsg;
  134. } catch(e) {
  135. errorMsg = '保存失败,请稍后重试';
  136. }
  137. }
  138. $status.html('<span class="text-danger"><i class="mdi mdi-alert-circle"></i> ' + errorMsg + '</span>');
  139. }
  140. });
  141. });
  142. });
  143. </script>
  144. <style>
  145. .input-group-text {
  146. min-width: 40px;
  147. justify-content: center;
  148. }
  149. .alert ul {
  150. padding-left: 20px;
  151. }
  152. .alert code {
  153. background-color: rgba(0,0,0,0.1);
  154. padding: 2px 6px;
  155. border-radius: 3px;
  156. }
  157. </style>
  158. @endsection