config.blade.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. @extends('admin.layouts')
  2. @section('css')
  3. <script src="//at.alicdn.com/t/font_682457_e6aq10jsbq0yhkt9.js" type="text/javascript"></script>
  4. <link href="/assets/global/vendor/bootstrap-table/bootstrap-table.min.css" type="text/css" rel="stylesheet">
  5. @endsection
  6. @section('content')
  7. <div class="page-content container">
  8. <div class="panel">
  9. <div class="panel-heading">
  10. <h1 class="panel-title"><i class="icon wb-settings" aria-hidden="true"></i>通用配置</h1>
  11. </div>
  12. <div class="panel-body container-fluid">
  13. <div class="nav-tabs-vertical" data-plugin="tabs">
  14. <ul class="nav nav-tabs mr-25" role="tablist">
  15. <li class="nav-item" role="presentation">
  16. <a class="nav-link active" data-toggle="tab" href="#method" aria-controls="method" role="tab">加密</a>
  17. </li>
  18. <li class="nav-item" role="presentation">
  19. <a class="nav-link" data-toggle="tab" href="#protocol" aria-controls="protocol" role="tab">协议</a>
  20. </li>
  21. <li class="nav-item" role="presentation">
  22. <a class="nav-link" data-toggle="tab" href="#obfs" aria-controls="obfs" role="tab">混淆</a>
  23. </li>
  24. <li class="nav-item" role="presentation">
  25. <a class="nav-link" data-toggle="tab" href="#level" aria-controls="level" role="tab">等级</a>
  26. </li>
  27. <li class="nav-item" role="presentation">
  28. <a class="nav-link" data-toggle="tab" href="#country" aria-controls="country" role="tab">国家地区</a>
  29. </li>
  30. </ul>
  31. <div class="tab-content py-15">
  32. <div class="tab-pane active" id="method" role="tabpanel">
  33. <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal"> 新增
  34. <i class="icon wb-plus"></i></button>
  35. <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
  36. <thead class="thead-default">
  37. <tr>
  38. <th> 名称</th>
  39. <th> 操作</th>
  40. </tr>
  41. </thead>
  42. <tbody>
  43. @foreach($method_list as $method)
  44. <tr>
  45. <td> {{$method->name}}</td>
  46. <td>
  47. @if($method->is_default)
  48. <span class='badge badge-lg badge-default'>默认</span>
  49. @else
  50. <div class="btn-group">
  51. <button class="btn btn-primary" onclick="setDefault('{{$method->id}}')">默认</button>
  52. <button class="btn btn-danger" onclick="delConfig('{{$method->id}}','{{$method->name}}')">
  53. <i class="icon wb-trash"></i>
  54. </button>
  55. </div>
  56. @endif
  57. </td>
  58. </tr>
  59. @endforeach
  60. </tbody>
  61. </table>
  62. </div>
  63. <div class="tab-pane" id="protocol" role="tabpanel">
  64. <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal"> 新增
  65. <i class="icon wb-plus"></i></button>
  66. <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
  67. <thead class="thead-default">
  68. <tr>
  69. <th> 名称</th>
  70. <th> 操作</th>
  71. </tr>
  72. </thead>
  73. <tbody>
  74. @foreach($protocol_list as $protocol)
  75. <tr>
  76. <td> {{$protocol->name}}</td>
  77. <td>
  78. @if($protocol->is_default)
  79. <span class="badge badge-lg badge-default">默认</span>
  80. @else
  81. <div class="btn-group">
  82. <button class="btn btn-primary" onclick="setDefault('{{$protocol->id}}')">默认</button>
  83. <button class="btn btn-danger" onclick="delConfig('{{$protocol->id}}','{{$protocol->name}}')">
  84. <i class="icon wb-trash"></i>
  85. </button>
  86. </div>
  87. @endif
  88. </td>
  89. </tr>
  90. @endforeach
  91. </tbody>
  92. </table>
  93. </div>
  94. <div class="tab-pane" id="obfs" role="tabpanel">
  95. <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal"> 新增
  96. <i class="icon wb-plus"></i></button>
  97. <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
  98. <thead class="thead-default">
  99. <tr>
  100. <th> 名称</th>
  101. <th> 操作</th>
  102. </tr>
  103. </thead>
  104. <tbody>
  105. @foreach($obfs_list as $obfs)
  106. <tr>
  107. <td> {{$obfs->name}}</td>
  108. <td>
  109. @if($obfs->is_default)
  110. <span class="badge badge-lg badge-default">默认</span>
  111. @else
  112. <button class="btn btn-primary" onclick="setDefault('{{$obfs->id}}')">默认</button>
  113. <button class="btn btn-danger" onclick="delConfig('{{$obfs->id}}','{{$obfs->name}}')">
  114. <i class="icon wb-trash"></i>
  115. </button>
  116. @endif
  117. </td>
  118. </tr>
  119. @endforeach
  120. </tbody>
  121. </table>
  122. </div>
  123. <div class="tab-pane" id="level" role="tabpanel">
  124. <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_level_modal"> 新增
  125. <i class="icon wb-plus"></i></button>
  126. <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
  127. <thead class="thead-default">
  128. <tr>
  129. <th> 等级</th>
  130. <th> 名称</th>
  131. <th> 操作</th>
  132. </tr>
  133. </thead>
  134. <tbody>
  135. @foreach($level_list as $level)
  136. <tr>
  137. <td>
  138. <input type="text" class="form-control" name="level" id="level_{{$level->id}}" value="{{$level->level}}"/>
  139. </td>
  140. <td>
  141. <input type="text" class="form-control" name="level_name" id="level_name_{{$level->id}}" value="{{$level->level_name}}"/>
  142. </td>
  143. <td>
  144. <div class="btn-group">
  145. <button type="button" class="btn btn-primary" onclick="updateLevel('{{$level->id}}')">修改</button>
  146. <button type="button" class="btn btn-danger" onclick="delLevel('{{$level->id}}','{{$level->level_name}}')">
  147. <i class="icon wb-trash"></i>
  148. </button>
  149. </div>
  150. </td>
  151. </tr>
  152. @endforeach
  153. </tbody>
  154. </table>
  155. </div>
  156. <div class="tab-pane" id="country" role="tabpanel">
  157. <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_country_modal"> 新增
  158. <i class="icon wb-plus"></i></button>
  159. <table class="text-md-center" data-toggle="table" data-height="600" data-virtual-scroll="true" data-mobile-responsive="true">
  160. <thead class="thead-default">
  161. <tr>
  162. <th> 图标</th>
  163. <th> 国家/地区名称</th>
  164. <th> 代码</th>
  165. <th> 操作</th>
  166. </tr>
  167. </thead>
  168. <tbody>
  169. @foreach($country_list as $country)
  170. <tr>
  171. <td>
  172. <svg class="w-40 h-40 text-center" aria-hidden="true">
  173. <use xlink:href="@if($country->code)#icon-{{$country->code}}@endif"></use>
  174. </svg>
  175. </td>
  176. <td>
  177. <input type="text" class="form-control" name="country_name" id="country_name_{{$country->id}}" value="{{$country->name}}"/>
  178. </td>
  179. <td>
  180. <input type="text" class="form-control" name="country_code" id="country_code_{{$country->id}}" value="{{$country->code}}"/>
  181. </td>
  182. <td>
  183. <div class="btn-group">
  184. <button type="button" class="btn btn-primary" onclick="updateCountry('{{$country->id}}')">修改</button>
  185. <button type="button" class="btn btn-danger" onclick="delCountry('{{$country->id}}','{{$country->name}}')"><i class="icon wb-trash"></i></button>
  186. </div>
  187. </td>
  188. </tr>
  189. @endforeach
  190. </tbody>
  191. </table>
  192. </div>
  193. </div>
  194. </div>
  195. </div>
  196. </div>
  197. </div>
  198. <div class="modal fade" id="add_config_modal" aria-hidden="true" role="dialog" tabindex="-1">
  199. <div class="modal-dialog modal-simple modal-center">
  200. <div class="modal-content">
  201. <div class="modal-header">
  202. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  203. <span aria-hidden="true">×</span>
  204. </button>
  205. <h4 class="modal-title">新增配置</h4>
  206. </div>
  207. <form action="#" method="post" class="modal-body">
  208. <div class="alert alert-danger" style="display: none;" id="msg"></div>
  209. <div class="row">
  210. <div class="col-md-6 form-group">
  211. <select class="form-control" name="type" id="type" placeholder="类型">
  212. <option value="1" selected>加密方式</option>
  213. <option value="2">协议</option>
  214. <option value="3">混淆</option>
  215. </select>
  216. </div>
  217. <div class="col-md-6 form-group">
  218. <input type="text" class="form-control" name="name" id="name" placeholder="名称">
  219. </div>
  220. </div>
  221. </form>
  222. <div class="modal-footer">
  223. <button class="btn btn-danger" data-dismiss="modal">关 闭</button>
  224. <button class="btn btn-primary" onclick="addConfig()">提 交</button>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <div class="modal fade" id="add_level_modal" aria-hidden="true" role="dialog" tabindex="-1">
  230. <div class="modal-dialog modal-simple modal-center">
  231. <div class="modal-content">
  232. <div class="modal-header">
  233. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  234. <span aria-hidden="true">×</span>
  235. </button>
  236. <h4 class="modal-title">新增配置</h4>
  237. </div>
  238. <form action="#" method="post" class="modal-body">
  239. <div class="alert alert-danger" style="display: none;" id="level_msg"></div>
  240. <div class="row">
  241. <div class="col-md-6 form-group">
  242. <input type="text" class="form-control" name="level" id="add_level" placeholder="等级">
  243. </div>
  244. <div class="col-md-6 form-group">
  245. <input type="text" class="form-control" name="level_name" id="add_level_name" placeholder="等级名称">
  246. </div>
  247. </div>
  248. </form>
  249. <div class="modal-footer">
  250. <button data-dismiss="modal" class="btn btn-danger">关 闭</button>
  251. <button class="btn btn-primary" onclick="addLevel('4')">提 交</button>
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. <div class="modal fade" id="add_country_modal" aria-hidden="true" role="dialog" tabindex="-1">
  257. <div class="modal-dialog modal-simple modal-center">
  258. <div class="modal-content">
  259. <div class="modal-header">
  260. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  261. <span aria-hidden="true">×</span>
  262. </button>
  263. <h4 class="modal-title">新增国家/地区</h4>
  264. </div>
  265. <form action="#" method="post" class="modal-body">
  266. <div class="alert alert-danger" style="display: none;" id="country_msg"></div>
  267. <div class="row">
  268. <div class="col-md-6 form-group">
  269. <input type="text" class="form-control" name="country_name" id="add_country_name" placeholder=" 国家/地区名称">
  270. </div>
  271. <div class="col-md-6 form-group">
  272. <input type="text" class="form-control" name="country_code" id="add_country_code" placeholder="国家代码">
  273. </div>
  274. </div>
  275. </form>
  276. <div class="modal-footer">
  277. <button data-dismiss="modal" class="btn btn-danger">关 闭</button>
  278. <button class="btn btn-primary" onclick="addCountry('5')">提 交</button>
  279. </div>
  280. </div>
  281. </div>
  282. </div>
  283. @endsection
  284. @section('script')
  285. <script src="/assets/global/vendor/matchheight/jquery.matchHeight-min.js" type="text/javascript"></script>
  286. <script src="/assets/global/js/Plugin/tabs.js" type="text/javascript"></script>
  287. <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js" type="text/javascript"></script>
  288. <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js" type="text/javascript"></script>
  289. <script type="text/javascript">
  290. // 添加等级
  291. function addLevel() {
  292. const level = $('#add_level').val();
  293. const level_name = $('#add_level_name').val();
  294. if (level.trim() === '') {
  295. $("#level_msg").show().html("等级不能为空");
  296. $("#level").focus();
  297. return false;
  298. }
  299. if (level_name.trim() === '') {
  300. $("#level_msg").show().html("等级名称不能为空");
  301. $("#level_name").focus();
  302. return false;
  303. }
  304. $.ajax({
  305. url: '/admin/addLevel',
  306. type: "POST",
  307. data: {_token: '{{csrf_token()}}', level: level, level_name: level_name},
  308. beforeSend: function () {
  309. $("#level_msg").show().html("正在添加");
  310. },
  311. success: function (ret) {
  312. if (ret.status === 'fail') {
  313. $("#level_msg").show().html(ret.message);
  314. return false;
  315. }
  316. $("#add_level_modal").modal("hide");
  317. window.location.href = '/admin/config';
  318. },
  319. error: function () {
  320. $("#level_msg").show().html("请求错误,请重试");
  321. },
  322. complete: function () {
  323. swal.fire({title: '添加成功', type: "success", timer: 1000, showConfirmButton: false}).then(() => window.location.reload())
  324. }
  325. });
  326. }
  327. // 更新等级
  328. function updateLevel(id) {
  329. $.ajax({
  330. type: "POST",
  331. url: "/admin/updateLevel",
  332. async: false,
  333. data: {_token: '{{csrf_token()}}', id: id, level: $('#level_' + id).val(), level_name: $('#level_name_' + id).val()},
  334. dataType: 'json',
  335. success: function (ret) {
  336. if (ret.status === 'success') {
  337. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  338. .then(() => window.location.href = '/admin/config')
  339. } else {
  340. swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
  341. }
  342. }
  343. });
  344. }
  345. // 删除等级
  346. function delLevel(id, name) {
  347. swal.fire({
  348. title: '确定删除等级 【' + name + '】 ?',
  349. type: 'question',
  350. allowEnterKey: false,
  351. showCancelButton: true,
  352. cancelButtonText: '{{trans('home.ticket_close')}}',
  353. confirmButtonText: '{{trans('home.ticket_confirm')}}',
  354. }).then((result) => {
  355. if (result.value) {
  356. $.post("/admin/delLevel", {id: id, _token: '{{csrf_token()}}'}, function (ret) {
  357. if (ret.status === 'success') {
  358. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  359. .then(() => window.location.href = '/admin/config')
  360. } else {
  361. swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
  362. }
  363. });
  364. }
  365. })
  366. }
  367. // 添加国家/地区
  368. function addCountry() {
  369. const country_name = $('#add_country_name').val();
  370. const country_code = $('#add_country_code').val();
  371. if (country_name.trim() === '') {
  372. $("#country_msg").show().html("国家/地区名称不能为空");
  373. $("#add_country_name").focus();
  374. return false;
  375. }
  376. if (country_code.trim() === '') {
  377. $("#country_msg").show().html("国家/地区代码不能为空");
  378. $("#add_country_code").focus();
  379. return false;
  380. }
  381. $.ajax({
  382. url: '/admin/addCountry',
  383. type: "POST",
  384. data: {_token: '{{csrf_token()}}', country_name: country_name, country_code: country_code},
  385. beforeSend: function () {
  386. $("#country_msg").show().html("正在添加");
  387. },
  388. success: function (ret) {
  389. if (ret.status === 'fail') {
  390. $("#country_msg").show().html(ret.message);
  391. return false;
  392. }
  393. $("#add_country_modal").modal("hide");
  394. window.location.href = '/admin/config';
  395. },
  396. error: function () {
  397. $("#country_msg").show().html("请求错误,请重试");
  398. },
  399. complete: function () {
  400. swal.fire({title: '添加成功', type: "success", timer: 1000, showConfirmButton: false}).then(() => window.location.reload())
  401. }
  402. });
  403. }
  404. // 更新国家/地区
  405. function updateCountry(id) {
  406. const country_name = $('#country_name_' + id).val();
  407. const country_code = $('#country_code_' + id).val();
  408. $.ajax({
  409. type: "POST",
  410. url: "/admin/updateCountry",
  411. async: false,
  412. data: {_token: '{{csrf_token()}}', id: id, country_name: country_name, country_code: country_code},
  413. dataType: 'json',
  414. success: function (ret) {
  415. if (ret.status === 'success') {
  416. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  417. .then(() => window.location.href = '/admin/config')
  418. } else {
  419. swal.fire({title: ret.message, type: "error"});
  420. }
  421. }
  422. });
  423. }
  424. // 删除国家/地区
  425. function delCountry(id, name) {
  426. swal.fire({
  427. title: '确定删除 【' + name + '】 信息?',
  428. type: 'question',
  429. allowEnterKey: false,
  430. showCancelButton: true,
  431. cancelButtonText: '{{trans('home.ticket_close')}}',
  432. confirmButtonText: '{{trans('home.ticket_confirm')}}',
  433. }).then((result) => {
  434. if (result.value) {
  435. $.post("/admin/delCountry", {id: id, _token: '{{csrf_token()}}'}, function (ret) {
  436. if (ret.status === 'success') {
  437. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  438. .then(() => window.location.href = '/admin/config')
  439. } else {
  440. swal.fire({title: ret.message, type: "error"});
  441. }
  442. });
  443. }
  444. })
  445. }
  446. // 添加配置
  447. function addConfig() {
  448. const name = $("#name").val();
  449. const type = $("#type").val();
  450. if (name.trim() === '') {
  451. $("#msg").show().html("名称不能为空");
  452. $("#name").focus();
  453. return false;
  454. }
  455. $.ajax({
  456. url: '/admin/config',
  457. type: "POST",
  458. data: {_token: '{{csrf_token()}}', name: name, type: type},
  459. beforeSend: function () {
  460. $("#msg").show().html("正在添加");
  461. },
  462. success: function (ret) {
  463. if (ret.status === 'fail') {
  464. $("#msg").show().html(ret.message);
  465. return false;
  466. }
  467. $("#add_config_modal").modal("hide");
  468. },
  469. error: function () {
  470. $("#msg").show().html("请求错误,请重试");
  471. },
  472. complete: function () {
  473. swal.fire({title: '添加成功', type: "success", timer: 1000, showConfirmButton: false}).then(() => window.location.reload())
  474. }
  475. });
  476. }
  477. // 删除配置
  478. function delConfig(id, name) {
  479. swal.fire({
  480. title: '确定删除配置 【' + name + '】 ?',
  481. type: 'question',
  482. allowEnterKey: false,
  483. showCancelButton: true,
  484. cancelButtonText: '{{trans('home.ticket_close')}}',
  485. confirmButtonText: '{{trans('home.ticket_confirm')}}',
  486. }).then((result) => {
  487. if (result.value) {
  488. $.post("/admin/delConfig", {id: id, _token: '{{csrf_token()}}'}, function (ret) {
  489. if (ret.status === 'success') {
  490. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  491. .then(() => window.location.href = '/admin/config')
  492. } else {
  493. swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
  494. }
  495. });
  496. }
  497. })
  498. }
  499. // 置为默认
  500. function setDefault(id) {
  501. $.ajax({
  502. type: "POST",
  503. url: "/admin/setDefaultConfig",
  504. async: false,
  505. data: {_token: '{{csrf_token()}}', id: id},
  506. dataType: 'json',
  507. success: function (ret) {
  508. if (ret.status === 'success') {
  509. swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false})
  510. .then(() => window.location.href = '/admin/config')
  511. } else {
  512. swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
  513. }
  514. }
  515. });
  516. }
  517. </script>
  518. @endsection