info.blade.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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/global/vendor/bootstrap-datepicker/bootstrap-datepicker.min.css" rel="stylesheet">
  5. @endsection
  6. @section('content')
  7. <div class="page-content container-fluid">
  8. <x-ui.panel icon="wb-user-add" :title="trans(isset($user) ? 'admin.action.edit_item' : 'admin.action.add_item', ['attribute' => trans('model.user.attribute')])">
  9. @isset($user)
  10. @can('admin.user.switch')
  11. <x-slot:actions>
  12. <button class="btn btn-sm btn-danger" type="button" onclick="switchToUser()">{{ trans('admin.user.info.switch') }}</button>
  13. </x-slot:actions>
  14. @endcan
  15. @endisset
  16. <x-admin.form.container>
  17. <div class="form-row">
  18. <div class="col-lg-6">
  19. <h4 class="example-title">{{ trans('admin.user.info.account') }}</h4>
  20. <x-admin.form.input name="nickname" :label="trans('model.user.nickname')" required />
  21. <x-admin.form.input name="username" :label="trans('model.user.username')" required />
  22. <x-admin.form.input name="password" type="password" :label="trans('model.user.password')" :placeholder="isset($user) ? trans('common.stay_unchanged') : trans('common.random_generate')" attribute="autocomplete=new-password" />
  23. <x-admin.form.select name="level" :label="trans('model.common.level')" :options="$levels" />
  24. <x-admin.form.select name="group" :label="trans('model.user_group.attribute')" :options="$userGroups" :placeholder="trans('common.none')" />
  25. @isset($user)
  26. <x-admin.form.skeleton name="credit" :label="trans('model.user.credit')">
  27. <div class="input-group">
  28. <p class="form-control"> {{ $user->credit }} </p>
  29. @can('admin.user.updateCredit')
  30. <div class="input-group-append">
  31. <button class="btn btn-danger" data-toggle="modal" data-target="#handle_user_credit" type="button">
  32. {{ trans('user.recharge') }}
  33. </button>
  34. </div>
  35. @endcan
  36. </div>
  37. </x-admin.form.skeleton>
  38. @endisset
  39. <x-admin.form.input name="invite_num" type="number" :label="trans('model.user.invite_num')" required />
  40. <x-admin.form.input-group name="reset_time" attribute="data-plugin=datepicker" :label="trans('model.user.reset_date')" :prependIcon="'icon wb-calendar'" :help="trans('admin.user.info.reset_date_hint')"
  41. input_grid="col-auto" />
  42. <x-admin.form.input-group name="expired_at" attribute="data-plugin=datepicker" :label="trans('model.user.expired_date')" :prependIcon="'icon wb-calendar'" :help="trans('admin.user.info.expired_date_hint')"
  43. input_grid="col-auto" />
  44. <x-admin.form.radio-group name="status" :label="trans('model.user.account_status')" :options="[-1 => trans('common.status.banned'), 0 => trans('common.status.inactive'), 1 => trans('common.status.normal')]" />
  45. <x-admin.form.select name="roles" :label="trans('model.user.role')" :options="$roles" multiple="true"
  46. input_grid="col-xxl-4 col-xl-6 col-lg-8 col-md-6 col-sm-8" />
  47. <x-admin.form.input name="wechat" :label="trans('model.user.wechat')" />
  48. <x-admin.form.input name="qq" :label="trans('model.user.qq')" />
  49. <x-admin.form.textarea name="remark" :label="trans('model.user.remark')" />
  50. </div>
  51. <div class="col-lg-6">
  52. <h4 class="example-title">{{ trans('admin.user.info.proxy') }}</h4>
  53. <x-admin.form.input-group name="port" type="number" :placeholder="trans('common.random_generate')" :label="trans('model.user.port')" button='<i class="icon wb-refresh"></i>'
  54. buttonClass="btn-success" buttonOnclick="makePort()" />
  55. <x-admin.form.input-group name="vmess_id" :placeholder="trans('common.random_generate')" :label="trans('model.user.uuid')" button='<i class="icon wb-refresh"></i>'
  56. buttonClass="btn-success" buttonOnclick="makeUUID()" :help="trans('admin.user.info.uuid_hint')" />
  57. <x-admin.form.input-group name="passwd" :placeholder="trans('common.random_generate')" :label="trans('model.user.proxy_passwd')" button='<i class="icon wb-refresh"></i>'
  58. buttonClass="btn-success" buttonOnclick="makePasswd()" />
  59. <x-admin.form.input-group name="transfer_enable" type="number" :label="trans('model.user.usable_traffic')" required append="GB" />
  60. <x-admin.form.radio-group name="enable" :label="trans('model.user.proxy_status')" :options="[0 => trans('common.status.banned'), 1 => trans('common.status.enabled')]" />
  61. <hr>
  62. <x-admin.form.select name="method" :label="trans('model.user.proxy_method')" :options="$methods" input_grid="col-xxl-3 col-xl-5 col-lg-6 col-md-4 col-sm-auto" />
  63. <x-admin.form.select name="protocol" :label="trans('model.user.proxy_protocol')" :options="$protocols" input_grid="col-xxl-3 col-xl-5 col-lg-6 col-md-4 col-sm-auto" />
  64. <x-admin.form.select name="obfs" :label="trans('model.user.proxy_obfs')" :options="$obfs" input_grid="col-xxl-3 col-xl-5 col-lg-6 col-md-4 col-sm-auto" />
  65. <hr />
  66. <x-admin.form.input-group name="speed_limit" type="number" :label="trans('model.user.speed_limit')" append="Mbps" :help="trans('admin.zero_unlimited_hint')" />
  67. @isset($user)
  68. <hr />
  69. <x-admin.form.skeleton name="inviter" :label="trans('model.user.inviter')">
  70. <p class="form-control"> {{ $user->inviter->username ?? trans('common.none') }} </p>
  71. </x-admin.form.skeleton>
  72. <x-admin.form.skeleton name="created_at" :label="trans('model.user.created_date')">
  73. <p class="form-control"> {{ localized_date($user->created_at) }} </p>
  74. </x-admin.form.skeleton>
  75. @endisset
  76. <div class="col-12 form-actions text-right">
  77. <a class="btn btn-secondary" href="{{ route('admin.user.index') }}">{{ trans('common.back') }}</a>
  78. <button class="btn btn-success" type="submit">{{ trans('common.submit') }}</button>
  79. </div>
  80. </div>
  81. </div>
  82. </x-admin.form.container>
  83. </x-ui.panel>
  84. </div>
  85. @isset($user)
  86. @can('admin.user.updateCredit')
  87. <!-- 余额充值 -->
  88. <div class="modal fade" id="handle_user_credit" role="dialog" aria-hidden="true" tabindex="-1">
  89. <div class="modal-dialog modal-simple modal-center">
  90. <div class="modal-content">
  91. <div class="modal-header">
  92. <button class="close" data-dismiss="modal" type="button" aria-label="{{ trans('common.close') }}">
  93. <span aria-hidden="true">×</span>
  94. </button>
  95. <h4 class="modal-title">{{ trans('admin.goods.type.top_up') }}</h4>
  96. </div>
  97. <form class="modal-body" method="post">
  98. <div class="alert alert-danger" id="msg" style="display: none;"></div>
  99. <div class="form-group row">
  100. <label class="col-md-2 col-sm-3 col-form-label" for="amount"> {{ trans('user.shop.change_amount') }} </label>
  101. <input class="col-sm-4 form-control" id="amount" name="amount" type="number"
  102. placeholder="{{ trans('admin.user.info.recharge_placeholder') }}" step="0.01" />
  103. </div>
  104. </form>
  105. <div class="modal-footer">
  106. <button class="btn btn-danger mr-auto" data-dismiss="modal">{{ trans('common.close') }}</button>
  107. <button class="btn btn-primary" type="button" onclick="handleUserCredit()">{{ trans('user.recharge') }}</button>
  108. </div>
  109. </div>
  110. </div>
  111. </div>
  112. @endcan
  113. @endisset
  114. @endsection
  115. @section('javascript')
  116. <script src="/assets/global/vendor/bootstrap-select/bootstrap-select.min.js"></script>
  117. <script src="/assets/global/vendor/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
  118. @if (app()->getLocale() !== 'en')
  119. <script src="/assets/global/vendor/bootstrap-datepicker/locales/bootstrap-datepicker.{{ str_replace('_', '-', app()->getLocale()) }}.min.js" charset="UTF-8">
  120. </script>
  121. @endif
  122. <script src="/assets/global/js/Plugin/bootstrap-select.js"></script>
  123. <script src="/assets/global/js/Plugin/bootstrap-datepicker.js"></script>
  124. <script>
  125. $(document).ready(function() {
  126. let userData = { // 默认值
  127. level: 0,
  128. status: 1,
  129. transfer_enable: 1024,
  130. enable: 1,
  131. method: '{{ $methodDefault }}',
  132. protocol: '{{ $protocolDefault }}',
  133. obfs: '{{ $obfsDefault }}',
  134. speed_limit: 200
  135. }
  136. @isset($user)
  137. // 预处理需要特殊处理的字段
  138. userData = {
  139. ...@json($user),
  140. expired_at: '{{ $user->expiration_date }}',
  141. transfer_enable: '{{ $user->transfer_enable / GiB }}',
  142. reset_time: '{{ $user->reset_date }}',
  143. roles: @json($user->roles()->pluck('name')),
  144. }
  145. @endisset
  146. // 自动填充表单
  147. autoPopulateForm(userData, {
  148. skipFields: 'password'
  149. });
  150. });
  151. @isset($user)
  152. @can('admin.user.switch')
  153. // 切换用户身份
  154. function switchToUser() {
  155. ajaxPost('{{ route('admin.user.switch', $user) }}', {}, {
  156. success: function(ret) {
  157. handleResponse(ret, {
  158. reload: ret.status === 'success',
  159. redirectUrl: ret.status === 'success' ? '/' : null
  160. });
  161. }
  162. });
  163. }
  164. @endcan
  165. @can('admin.user.updateCredit')
  166. // 余额充值
  167. function handleUserCredit() {
  168. const amount = $('#amount').val();
  169. const reg = /^(-?)\d+(\.\d+)?$/; //只可以是正负数字
  170. if (amount.trim() === '' || amount === 0 || !reg.test(amount)) {
  171. $('#msg').show().html('{{ trans('user.shop.change_amount_help') }}');
  172. $('#name').focus();
  173. return false;
  174. }
  175. ajaxPost('{{ route('admin.user.updateCredit', $user) }}', {
  176. amount: amount
  177. }, {
  178. beforeSend: function() {
  179. $('#msg').show().html('{{ trans('user.recharging') }}');
  180. },
  181. success: function(ret) {
  182. if (ret.status === 'fail') {
  183. $('#msg').show().html(ret.message);
  184. return false;
  185. } else {
  186. $('#handle_user_credit').modal('hide');
  187. handleResponse(ret, {
  188. reload: true
  189. });
  190. }
  191. },
  192. error: function() {
  193. $('#msg').show().html('{{ trans('common.request_failed') }}');
  194. }
  195. });
  196. }
  197. @endcan
  198. @endisset
  199. // 使用表单提交函数
  200. function Submit() {
  201. ajaxRequest({
  202. url: '{{ isset($user) ? route('admin.user.update', $user) : route('admin.user.store') }}',
  203. method: '{{ isset($user) ? 'PUT' : 'POST' }}',
  204. data: collectFormData('.form-horizontal'),
  205. success: function(ret) {
  206. handleResponse(ret, {
  207. redirectUrl: '{{ route('admin.user.index') . (Request::getQueryString() ? '?' . Request::getQueryString() : '') }}'
  208. });
  209. },
  210. error: function(xhr) {
  211. handleErrors(xhr, {
  212. form: '.form-horizontal'
  213. });
  214. }
  215. });
  216. return false;
  217. }
  218. // 生成随机端口
  219. function makePort() {
  220. ajaxGet('{{ route('getPort') }}', {}, {
  221. success: function(ret) {
  222. $('#port').val(ret);
  223. }
  224. });
  225. }
  226. // 生成UUID
  227. function makeUUID() {
  228. ajaxGet('{{ route('createUUID') }}', {}, {
  229. success: function(ret) {
  230. $('#vmess_id').val(ret);
  231. }
  232. });
  233. }
  234. // 生成随机密码
  235. function makePasswd() {
  236. ajaxGet('{{ route('createStr') }}', {}, {
  237. success: function(ret) {
  238. $('#passwd').val(ret);
  239. }
  240. });
  241. }
  242. </script>
  243. @endsection