market.blade.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. @extends('layouts.base')
  2. @section('title', trans('插件安装/升级'))
  3. @section('css')
  4. <link rel="stylesheet" type="text/css" href="{{ plugin_assets('plugins-market', 'assets/css/market.css') }}">
  5. @endsection
  6. @section('content')
  7. <!-- Content Wrapper. Contains page content -->
  8. <div class="content-wrapper" style="margin-left: 0px">
  9. <!-- Content Header (Page header) -->
  10. <section class="content-header">
  11. <h1 style="display: inline-block;">
  12. {{--{{ trans('Yunshop\PluginsMarket::general.name') }}--}}
  13. 插件安装/升级
  14. </h1>
  15. <a href="{{yzWebUrl('plugins.get-plugin-data')}}" class="btn btn-warning" style="font-size: 13px;float: right;margin-top: 20px;">
  16. <i class="fa fa-mail-reply-all"> </i> 返回插件管理
  17. </a>
  18. </section>
  19. <div style="color:#ff2620;">
  20. (更新插件后,请返回到插件管理页面,将已更新了的插件禁用后再启用)
  21. </div>
  22. <!-- Main content -->
  23. <section class="content">
  24. <div class="modal" id="showMiddleModal"
  25. data-backdrop="false" data-keyboard="false"
  26. role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  27. <div class="modal-dialog" role="document">
  28. <div class="modal-content">
  29. <div class="modal-body">
  30. <h5 class="center-block">正在加载中...</h5>
  31. </div>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="modal fade" id="openModal" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  36. <div class="modal-dialog" role="document">
  37. <div class="modal-content">
  38. <div class="modal-header">
  39. <h5 class="modal-title" id="exampleModalLabel">填写密钥</h5>
  40. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  41. <span aria-hidden="true">&times;</span>
  42. </button>
  43. </div>
  44. <form method="post" class="form-horizontal form" enctype="multipart/form-data">
  45. <div class="modal-body" id="openModalBody">
  46. <div class="form-group">
  47. <label class="form-control-label">Key:</label>
  48. <input type="text" name="plugin[key]" class="form-control" id="key" value="">
  49. </div>
  50. <div class="form-group">
  51. <label class="form-control-label">密钥:</label>
  52. <input type="text" name="plugin[secret]" class="form-control" id="secret" value="">
  53. </div>
  54. </div>
  55. <div class="modal-footer">
  56. <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
  57. <input type="submit" name="submit" value="确定" class="btn btn-success " onclick="return formcheck(this)" />
  58. </div>
  59. </form>
  60. </div>
  61. </div>
  62. </div>
  63. @if (session()->has('message'))
  64. <div class="callout callout-success" role="alert">
  65. {{ session('message') }}
  66. </div>
  67. @endif
  68. <div class="box">
  69. <div class="box-body">
  70. <div class="alert"></div>
  71. <div class="row">
  72. <div class="col-md-6 scrollbox left-menu-border content-height-scroll" >
  73. <ul class="nav nav-sidebar">
  74. @foreach($data as $k => $item)
  75. <li>
  76. <button onclick="jumpToDiv(this, '{{$k}}')" data-status="{{$item['versionStatus']}}" class="button_content" style="background: #f4f4f4;">
  77. {{--<div class="col-md-2 button_icon">{{$item['version']}}</div>--}}
  78. <div class="col-md-9">
  79. <div class="form-group button_title">
  80. <h5 style="float: left">
  81. {{$item['title']}}
  82. <span style="font-size: 11px">({{$item['version']}})</span>
  83. </h5>
  84. </div>
  85. {{--<div class="form-group button_detail">{{$item['description']}}</div>--}}
  86. </div>
  87. <div class="col-md-3 button_icon">
  88. <span style="font-size: 12px;">
  89. @if ($uninstall)
  90. <label class="upgrade-css" id="versionStatusCss{{$k}}"> <i class="fa fa-arrow-o"></i> 禁止安装 </label>
  91. @else
  92. @if($item['versionStatus'] == 'new')
  93. <label class="upgrade-css" id="versionStatusCss{{$k}}"> <i class="fa fa-arrow-up"></i> 请升级 </label>
  94. @elseif($item['versionStatus'] == 'preview')
  95. <label> 预览 </label>
  96. @elseif($item['versionStatus'] == 'installed')
  97. <label class="installed-css" id="versionStatusCss{{$k}}"> <i class="fa fa-check-square-o"></i> 已安装 </label>
  98. @else
  99. <label> <i class="fa fa-download"></i> 未安装</label>
  100. @endif
  101. @endif
  102. </span>
  103. </div>
  104. {{--<div class="col-md-2 button_icon ">--}}
  105. {{--<select class="select-css" id="select-css{{$k}}" name="version" onchange="selectVersion(this, '{{$k}}', )">--}}
  106. {{--@foreach($item['versionList'] as $index => $ver)--}}
  107. {{--<option value="{{$ver['id']}}" @if($ver['version'] == $item['version']) selected @endif--}}
  108. {{--data-size="{{$ver['size']}}" data-description="{{$ver['description']}}" data-index="{{$index}}">--}}
  109. {{--{{$ver['version']}}--}}
  110. {{--</option>--}}
  111. {{--@endforeach--}}
  112. {{--</select>--}}
  113. {{--</div>--}}
  114. </button>
  115. </li>
  116. @endforeach
  117. </ul>
  118. </div>
  119. <div class="col-md-6 main content-height-scroll">
  120. @foreach($data as $k => $item)
  121. <div id="detail{{$k}}" data-status="{{$item['versionStatus']}}" data-size="{{$item['size']}}" data-name="{{$item['name']}}" data-index="{{$k}}" class="display" style="@if($k==0) display: block; @else display: none;@endif">
  122. <div class="form-group button_title">
  123. <h4 style="text-align: center">{{$item['title']}}</h4>
  124. <p style="text-align: right; font-size: 12px"> ——— {{$item['author']}}</p>
  125. </div>
  126. <div class="form-group">
  127. @if ($uninstall)
  128. <label class="upgrade-css" id="versionStatusCss{{$k}}"> <i class="fa fa-arrow-o"></i> 禁止安装 </label>
  129. @else
  130. @if($item['versionStatus'] == 'new')
  131. <button onclick="isUpdated('{{$item['latestVersion']}}', '{{$item['key']}}', '{{$item['secret']}}')" class="btn btn-info" style="height: 32px">
  132. <i class="fa fa-download"> </i> <label style="color:#fff"> 升级 </label>
  133. </button>
  134. @elseif($item['versionStatus'] == 'installed')
  135. <button onclick="" disabled class="btn btn-success" style="height: 32px">
  136. <i class="fa fa-download"> </i> <label> 安装 </label>
  137. </button>
  138. @elseif($item['versionStatus'] == 'preview')
  139. <button onclick="" class="btn btn-success" style="height: 32px">
  140. <i class="fa fa-download"> </i> <label> 预览 </label>
  141. </button>
  142. @else
  143. <button onclick="isDownload('{{$item['key']}}', '{{$item['secret']}}')" class="btn btn-success" style="height: 32px">
  144. <i class="fa fa-download"></i> <label> 安装 </label>
  145. </button>
  146. @endif
  147. @endif
  148. </div>
  149. {{--<div class="form-group">--}}
  150. {{--<label class="font-description">请选择版本 :</label>--}}
  151. {{--<select class="select-css" id="select-css{{$k}}" name="version" onchange="selectVersion(this, '{{$k}}', )">--}}
  152. {{--@foreach($item['versionList'] as $index => $ver)--}}
  153. {{--<option value="{{$ver['id']}}" @if($ver['version'] == $item['version']) selected @endif--}}
  154. {{--data-size="{{$ver['size']}}" data-description="{{$ver['description']}}" data-index="{{$index}}">--}}
  155. {{--{{$ver['version']}}--}}
  156. {{--</option>--}}
  157. {{--@endforeach--}}
  158. {{--</select>--}}
  159. {{--</div>--}}
  160. <div class="form-group">
  161. <label class="font-description"> 插件详情:</label><br/>
  162. <div class="interval">{{$item['description']}}</div>
  163. </div>
  164. <div class="form-group">
  165. <label class="font-description"> 版本号:</label>
  166. <span class="interval" id="versionNumber{{$k}}">{{$item['version']}}</span>
  167. </div>
  168. <div class="form-group">
  169. <label class="font-description"> 版本说明:</label><br/>
  170. <div class="interval" id="versionDetail{{$k}}">
  171. @foreach($item['versionList'] as $ver)
  172. @if($ver['version'] == $item['version'])
  173. <span data-version="{{$item['version']}}">{!! $ver['description'] !!}</span>
  174. @endif
  175. @endforeach
  176. </div>
  177. </div>
  178. <div class="form-group">
  179. <label class="font-description"> 大小:</label>
  180. <span class="interval" id="size{{$k}}">{{$item['size']}}</span>
  181. </div>
  182. </div>
  183. @endforeach
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </section><!-- /.content -->
  189. </div><!-- /.content-wrapper -->
  190. @endsection
  191. @section('js')
  192. <script type="text/javascript">
  193. $(document).ready(function () {
  194. var obj = $('.main').find('div:visible')
  195. var name = obj.attr('data-name')
  196. var index = obj.attr('data-index')
  197. var size = obj.attr('data-size')
  198. var status = obj.attr('data-status')
  199. var version = $('#versionDetail' + index + ' span').attr('data-version')
  200. $('#openModalBody').append('<div id="modal-hidden-div">' +
  201. '<input type="hidden" data-status="'+ status +'" value="'+ name +'" name="pluginData[name]">' +
  202. '<input type="hidden" value="'+ version +'" name="pluginData[version]">' +
  203. '</div>')
  204. })
  205. </script>
  206. {{-- 下载js --}}
  207. <script type="text/javascript">
  208. function showMiddleModal() {
  209. $('#showMiddleModal').modal('show')
  210. }
  211. function showAlert($message, $css) {
  212. return $('.alert').html($message).addClass($css).show().delay(1500).fadeOut();
  213. //return $('.alert').html($message).addClass($css).show();
  214. }
  215. function formcheck(event) {
  216. var $name = $(':input[name="pluginData[name]"]').val()
  217. var $version = $(':input[name="pluginData[version]"]').val()
  218. let status = $(':input[name="pluginData[version]"]').attr('data-status')
  219. let tip = status == 'new' ? '更新' : '下载';
  220. var $url = "{{yzWebUrl('plugin.plugins-market.Controllers.plugin.readyToDownload')}}";
  221. $url = $url.replace(/\amp;/g, '')
  222. if ($(':input[name="plugin[key]"]').val() == '' || $(':input[name="plugin[secret]"]').val() == '') {
  223. if($(':input[name="plugin[key]"]').val() == '') {
  224. Tip.focus(':input[name="plugin[key]"]', 'Key 不能为空');
  225. }else {
  226. Tip.focus(':input[name="plugin[secret]"]', '密钥不能为空')
  227. }
  228. return false;
  229. }
  230. showMiddleModal()
  231. $.ajax({
  232. type : 'post',
  233. headers: {
  234. 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
  235. },
  236. url : $url,
  237. data : {
  238. 'plugin' : {'name' : $name, 'version' : $version} ,
  239. 'keyData' : {'key' : $(':input[name="plugin[key]"]').val(), 'secret' : $(':input[name="plugin[secret]"]').val()}
  240. },
  241. dataType : 'json',
  242. success : function (msg) {
  243. $('#showMiddleModal').modal('hide');
  244. switch (msg['code']){
  245. case 0:
  246. $('#openModal').modal('hide');
  247. showAlert(tip+'成功', 'alert-success')
  248. location.reload();
  249. console.log('download success ',msg);
  250. break;
  251. case -2 :
  252. $('#key').val('');
  253. $('#secret').val('');
  254. $('#openModal').modal('show');
  255. break;
  256. case -3:
  257. $('#openModal').modal('hide');
  258. showAlert(msg['msg'], 'alert-danger')
  259. break;
  260. default:
  261. console.log(msg);
  262. break;
  263. }
  264. },
  265. error : function (msg) {
  266. console.log(msg)
  267. $('#showMiddleModal').modal('hide')
  268. }
  269. })
  270. return false;
  271. }
  272. function isDownload(key, secret) {
  273. if(confirm('您确定要下载这个插件吗?')) {
  274. //检查是否已有key 和密钥
  275. var $name = $(':input[name="pluginData[name]"]').val()
  276. var $version = $(':input[name="pluginData[version]"]').val()
  277. var $url = "{{yzWebUrl('plugin.plugins-market.Controllers.plugin.check')}}";
  278. $url = $url.replace(/\amp;/g, '')
  279. showMiddleModal();
  280. $.ajax({
  281. type : 'post',
  282. headers: {
  283. 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
  284. },
  285. url : $url,
  286. data : {'plugin[name]' : $name, 'plugin[version]' : $version},
  287. dataType : 'json',
  288. success : function (msg) {
  289. console.log(msg)
  290. $('#showMiddleModal').modal('hide');
  291. switch (msg['code']){
  292. case -2 :
  293. if (typeof key != "undefined" || typeof secret != "undefined") {
  294. $('#key').val(key);
  295. $('#secret').val(secret);
  296. } else {
  297. $('#key').val('');
  298. $('#secret').val('');
  299. }
  300. $('#openModal').modal('show');
  301. break;
  302. case 0:
  303. showAlert('下载成功', 'alert-success')
  304. location.reload();
  305. console.log('download success ',msg);
  306. break;
  307. default:
  308. console.log(msg);
  309. break;
  310. }
  311. },
  312. error : function (error) {
  313. $('#showMiddleModal').modal('hide')
  314. console.log(error)
  315. }
  316. })
  317. }
  318. }
  319. function jumpToDiv(obj, $index){
  320. $('.installed-css').css('color' , '#00a65a')
  321. $('.upgrade-css').css('color' , '#00c0ef')
  322. var version_status = $(obj).attr('data-status')
  323. if(version_status == 'new' || version_status == 'installed') {
  324. $('#versionStatusCss' + $index).css('color', '#f5f5f5');
  325. }
  326. $('.button_content').attr('style', 'background: #f4f4f4; ')
  327. $(obj).attr('style', 'background: rgba(11, 70, 224, 0.61); color:#f5f5f5')
  328. $('.display').attr('style', 'display:none;')
  329. $('#detail' + $index).attr('style', 'display:block;')
  330. // $('.select-css').attr('style', 'color:rgba(216, 217, 220, 0.77);')
  331. $('#select-css' + $index).attr('style', 'color: rgba(17, 33, 78, 0.77);')
  332. var name = $('#detail' + $index).attr('data-name')
  333. var version = $('#versionDetail' + $index + ' span').attr('data-version')
  334. $(':input[name="pluginData[name]"]').val(name)
  335. $(':input[name="pluginData[version]"]').val(version)
  336. }
  337. function selectVersion(obj, $detail_index) {
  338. var $versionDescription = $(obj).find('option:selected').attr('data-description')
  339. var size = $(obj).find('option:selected').attr('data-size')
  340. $('#versionDetail' + $detail_index).html('<span id="versionDetail"'+ $detail_index +'>' + $versionDescription +'</span>')
  341. $('#size' + $detail_index).html(size)
  342. var name = $('#detail' + $detail_index).attr('data-name')
  343. var version = $(obj).find('option:selected').text().trim();
  344. //console.log('select version', version)
  345. $(':input[name="pluginData[version]"]').val(version)
  346. }
  347. </script>
  348. {{-- 更新js --}}
  349. <script type="text/javascript">
  350. function isUpdated($updateVersion, key, secret) {
  351. if(confirm('您确定要更新这个插件吗?')) {
  352. //检查是否已有key 和密钥
  353. var $name = $(':input[name="pluginData[name]"]').val()
  354. var $url = "{{yzWebUrl('plugin.plugins-market.Controllers.plugin.checkIsUpdate')}}";
  355. $url = $url.replace(/\amp;/g, '')
  356. showMiddleModal()
  357. $.ajax({
  358. type : 'post',
  359. headers: {
  360. 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
  361. },
  362. url : $url,
  363. data : {
  364. 'plugin[name]' : $name,
  365. 'plugin[version]' : $updateVersion,
  366. //'plugin[url]' : $updateUrl
  367. },
  368. dataType : 'json',
  369. success : function (msg) {
  370. console.log(msg)
  371. $('#showMiddleModal').modal('hide')
  372. switch (msg['code']){
  373. case -2 :
  374. if (typeof key != "undefined" || typeof secret != "undefined") {
  375. $('#key').val(key);
  376. $('#secret').val(secret);
  377. } else {
  378. $('#key').val('');
  379. $('#secret').val('');
  380. }
  381. //更新版本
  382. $(':input[name="pluginData[version]"]').val($updateVersion)
  383. $('#openModal').modal('show');
  384. break;
  385. case 0:
  386. showAlert('更新成功', 'alert-success')
  387. location.reload();
  388. console.log('download success ',msg);
  389. break;
  390. default:
  391. console.log(msg);
  392. break;
  393. }
  394. },
  395. error : function (error) {
  396. $('#showMiddleModal').modal('hide');
  397. console.log(error)
  398. }
  399. })
  400. }
  401. }
  402. </script>
  403. {{--<script type="text/javascript" src="{{ plugin_assets('plugins-market', 'assets/js/market.js') }}"></script>--}}
  404. @endsection