info.blade.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. @extends('admin.layouts')
  2. @section('css')
  3. <link href="/assets/global/vendor/bootstrap-select/bootstrap-select.min.css" rel="stylesheet">
  4. <link href="/assets/custom/bootstrap-switch/bootstrap-switch.min.css" rel="stylesheet">
  5. <link href="/assets/global/vendor/ascolorpicker/asColorPicker.min.css" rel="stylesheet">
  6. <link href="/assets/global/vendor/dropify/dropify.min.css" rel="stylesheet">
  7. @endsection
  8. @section('content')
  9. <div class="page-content container">
  10. <x-ui.panel type="bordered" :title="trans(isset($good) ? 'admin.action.edit_item' : 'admin.action.add_item', ['attribute' => trans('model.goods.attribute')])" icon="wb-shopping-cart">
  11. <x-slot:actions>
  12. <a class="btn btn-danger" href="{{ route('admin.goods.index') }}">{{ trans('common.back') }}</a>
  13. </x-slot:actions>
  14. <x-slot:alert>
  15. @if (Session::has('successMsg'))
  16. <x-alert :message="Session::pull('successMsg')" />
  17. @endif
  18. @if ($errors->any())
  19. <x-alert type="danger" :message="$errors->all()" />
  20. @endif
  21. </x-slot:alert>
  22. <x-admin.form.container :route="isset($good) ? route('admin.goods.update', $good) : route('admin.goods.store')" :method="isset($good) ? 'PUT' : 'POST'" enctype="true">
  23. <div class="form-row">
  24. <div class="col-lg-6">
  25. <x-admin.form.radio-group name="type" :label="trans('model.common.type')" :options="[1 => trans('admin.goods.type.package'), 2 => trans('admin.goods.type.plan')]" :help="trans('admin.goods.info.type_hint')" />
  26. <x-admin.form.input name="name" :label="trans('model.goods.name')" required />
  27. <x-admin.form.input-group name="price" type="number" :label="trans('model.goods.price')" :prepend="array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]" required attribute="min=0 step=0.1" />
  28. <x-admin.form.select name="category_id" :label="trans('model.goods.category')" :options="$categories" />
  29. <x-admin.form.select name="level" :label="trans('model.common.level')" :options="$levels" />
  30. <div class="package-renew">
  31. <x-admin.form.input-group name="renew" type="number" :label="trans('model.goods.renew')" :prepend="array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]" attribute="min=0 step=0.1" />
  32. <x-admin.form.input-group name="speed_limit" type="number" :label="trans('model.goods.user_limit')" append="Mbps" :help="trans('admin.zero_unlimited_hint')" attribute="min=0" />
  33. <x-admin.form.input-group name="period" type="number" :label="trans('model.goods.period')" :append="trans_choice('common.days.attribute', 1)" :help="trans('admin.goods.info.period_hint')"
  34. attribute="min=0 step=1" />
  35. <x-admin.form.input-group name="days" type="number" :label="trans('model.goods.available_date')" :append="trans_choice('common.days.attribute', 1)" :help="trans('admin.goods.info.available_date_hint')"
  36. attribute="min=0 step=1" />
  37. </div>
  38. <x-admin.form.skeleton name="traffic" :label="trans('model.goods.traffic')">
  39. <div class="input-group">
  40. <input class="form-control" id="traffic" name="traffic" type="number" min="0" />
  41. <select class="form-control" id="traffic_unit" name="traffic_unit" data-plugin="selectpicker" data-style="btn-outline btn-primary">
  42. <option value="1">MB</option>
  43. <option value="1024">GB</option>
  44. <option value="1048576">TB</option>
  45. <option value="1073741824">PB</option>
  46. </select>
  47. </div>
  48. </x-admin.form.skeleton>
  49. <x-admin.form.input name="invite_num" type="number" :label="trans('model.goods.invite_num')" attribute="min=0 step=1" />
  50. <x-admin.form.input-group name="limit_num" type="number" :label="trans('model.goods.limit_num')" :append="trans('admin.times')" :help="trans('admin.goods.info.limit_num_hint')" required
  51. attribute="min=0 step=1" />
  52. </div>
  53. <div class="col-lg-6">
  54. <x-admin.form.skeleton name="is_hot" :label="trans('model.goods.hot')">
  55. <input id="is_hot" name="is_hot" data-toggle="switch" data-on-color="primary" data-off-color="default"
  56. data-on-text="{{ trans('admin.yes') }}" data-off-text="{{ trans('admin.no') }}" data-size="small" type="checkbox">
  57. </x-admin.form.skeleton>
  58. <x-admin.form.skeleton name="status" :label="trans('common.status.attribute')">
  59. <input id="status" name="status" data-toggle="switch" data-on-color="primary" data-off-color="default"
  60. data-on-text="{{ trans('admin.goods.status.yes') }}" data-off-text="{{ trans('admin.goods.status.no') }}" data-size="small"
  61. type="checkbox">
  62. </x-admin.form.skeleton>
  63. <x-admin.form.input name="sort" type="number" :label="trans('model.common.sort')" attribute="min=0 max=255 step=1" :help="trans('admin.sort_asc')" />
  64. <x-admin.form.input name="color" :label="trans('model.goods.color')" attribute="data-plugin=asColorPicker data-mode=simple" />
  65. <x-admin.form.input name="logo" type="file" :label="trans('model.goods.logo')"
  66. attribute="data-plugin=dropify data-default-file={{ asset($good->logo ?? '/assets/images/default.png') }}" />
  67. <x-admin.form.textarea name="description" :label="trans('model.common.description')" rows="3" :placeholder="trans('admin.goods.info.desc_placeholder')" />
  68. <x-admin.form.textarea name="info" :label="trans('model.goods.info')" rows="6" :placeholder="trans('admin.goods.info.list_placeholder')" :help="trans('admin.goods.info.list_hint')" />
  69. <div class="form-actions col-12 text-right">
  70. <button class="btn btn-success" type="submit">
  71. <i class="icon wb-check"></i>{{ trans('common.submit') }}
  72. </button>
  73. </div>
  74. </div>
  75. </div>
  76. </x-admin.form.container>
  77. </x-ui.panel>
  78. </div>
  79. @endsection
  80. @section('javascript')
  81. <script src="/assets/global/vendor/bootstrap-select/bootstrap-select.min.js"></script>
  82. <script src="/assets/global/vendor/ascolor/jquery-asColor.min.js"></script>
  83. <script src="/assets/global/vendor/asgradient/jquery-asGradient.min.js"></script>
  84. <script src="/assets/global/vendor/ascolorpicker/jquery-asColorPicker.min.js"></script>
  85. <script src="/assets/global/vendor/dropify/dropify.min.js"></script>
  86. <script src="/assets/global/js/Plugin/bootstrap-select.js"></script>
  87. <script src="/assets/custom/bootstrap-switch/bootstrap-switch.min.js"></script>
  88. <script src="/assets/global/js/Plugin/ascolorpicker.js"></script>
  89. <script src="/assets/global/js/Plugin/dropify.js"></script>
  90. <script>
  91. // 初始化开关控件
  92. $("[data-toggle='switch']").bootstrapSwitch();
  93. // 商品类型切换处理
  94. $("input[name='type']").change(function() {
  95. $(".package-renew").toggle(parseInt($(this).val()) !== 1);
  96. });
  97. // 流量单位转换函数
  98. function getTrafficAndUnit(traffic) {
  99. for (let unit of [1073741824, 1048576, 1024]) {
  100. if (traffic >= unit) {
  101. return {
  102. "traffic": traffic / unit,
  103. "traffic_unit": unit
  104. };
  105. }
  106. }
  107. return {
  108. "traffic": traffic,
  109. "traffic_unit": 1
  110. };
  111. }
  112. $(document).ready(function() {
  113. // 默认商品数据
  114. let productData = {
  115. "type": 2,
  116. "speed_limit": 0,
  117. "period": 30,
  118. "traffic": 102400,
  119. "invite_num": 0,
  120. "limit_num": 0,
  121. "days": 0,
  122. "sort": 0,
  123. "color": "#a57afa",
  124. "status": 1
  125. };
  126. // 根据条件更新商品数据
  127. @isset($good)
  128. productData = @json($good);
  129. @endisset
  130. @if (old())
  131. productData = @json(old());
  132. @endif
  133. // 填充表单数据
  134. autoPopulateForm({
  135. ...productData,
  136. ...getTrafficAndUnit(productData.traffic || 0)
  137. });
  138. // 编辑模式下的特殊处理
  139. @isset($good)
  140. $("input[name='type']").attr("disabled", true);
  141. $("#traffic").attr("disabled", true);
  142. $("#traffic_unit").attr("disabled", true).selectpicker("refresh");
  143. if (productData.type === 2) $("#days").attr("disabled", true);
  144. @endisset
  145. });
  146. </script>
  147. @endsection