better-staridc-MNBT
1<?php
2if (!defined('IN_CRONLITE')) { exit; }
3$page_title = $page_title ?? '购买 Docker';
4$plan = $plan ?? null; $methods = $methods ?? [];
5$base_plan = $plan && (int)$plan['base_plan_id'] > 0 ? docker_shop_base_plan_get((int)$plan['base_plan_id']) : null;
6$node = $plan && (int)$plan['node'] > 0 ? docker_shop_node_get((int)$plan['node']) : null;
7ob_start();
8?>
9<div class="layui-card">
10 <div class="layui-card-body" style="padding:28px;">
11 <div class="ly-msg" id="msg"></div>
12
13 <div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:18px;">
14 <h1 style="font-size:20px;color:#222;margin:0;">购买:<?= htmlspecialchars($plan['name']) ?></h1>
15 <a class="layui-btn layui-btn-xs layui-btn-primary" href="<?= htmlspecialchars(docker_shop_url('docker-shop'), ENT_QUOTES) ?>">返回套餐列表</a>
16 </div>
17
18 <?php if ($base_plan): ?>
19 <ul class="hs-plan-spec" style="margin-bottom:20px;">
20 <li><span>CPU 核</span><b><?= htmlspecialchars($base_plan['cpu_max']) ?></b></li>
21 <li><span>内存</span><b><?= htmlspecialchars($base_plan['mem_max']) ?> MB</b></li>
22 <li><span>磁盘</span><b><?= (int)$base_plan['disk_max'] > 0 ? htmlspecialchars($base_plan['disk_max']) . ' MB' : '不限制' ?></b></li>
23 <li><span>开通节点</span><b><?= $node ? htmlspecialchars($node['name']) : '—' ?></b></li>
24 </ul>
25 <?php endif; ?>
26
27 <form class="hs-order-form" id="orderForm">
28 <div class="layui-form-item">
29 <label class="layui-form-label">购买周期</label>
30 <div class="layui-input-block hs-form-choices" style="padding-top:8px;">
31 <?php
32 $enabled = docker_shop_plan_enabled_periods($plan);
33 foreach ($enabled as $p):
34 $cfg = docker_shop_periods()[$p];
35 $field = docker_shop_period_price_field($p);
36 $price = (int)($plan[$field] ?? 0);
37 ?>
38 <label class="hs-choice"><input type="radio" name="period" value="<?= htmlspecialchars($p, ENT_QUOTES) ?>"> <?= htmlspecialchars($cfg['label']) ?> ¥<?= docker_shop_format_cents($price) ?></label>
39 <?php endforeach; ?>
40 <?php if ($enabled === []): ?>
41 <span style="color:#999;">该套餐未设置购买周期</span>
42 <?php endif; ?>
43 </div>
44 </div>
45
46 <?php
47 $isFreePlan = true;
48 foreach ($enabled as $p) {
49 $field = docker_shop_period_price_field($p);
50 if ((int)($plan[$field] ?? 0) > 0) {
51 $isFreePlan = false;
52 break;
53 }
54 }
55 ?>
56 <?php if (!$isFreePlan): ?>
57 <?php if (!empty($methods)): ?>
58 <div class="layui-form-item">
59 <label class="layui-form-label">支付方式</label>
60 <div class="layui-input-block hs-form-choices" style="padding-top:6px;">
61 <?php foreach ($methods as $m): ?>
62 <label class="hs-choice"><input type="radio" name="type" value="<?= htmlspecialchars($m['plugin'].'__'.$m['method']) ?>" required> <?= htmlspecialchars($m['display_name'] ?: ($m['plugin'].' / '.$m['method'])) ?></label>
63 <?php endforeach; ?>
64 </div>
65 </div>
66 <?php else: ?>
67 <div class="layui-form-item"><div class="layui-input-block" style="color:#999;">暂无可用的支付方式</div></div>
68 <?php endif; ?>
69 <?php endif; ?>
70
71 <?php if ($isFreePlan || !empty($methods)): ?>
72 <div class="layui-form-item">
73 <div class="layui-input-block">
74 <button type="submit" class="layui-btn layui-btn-lg" id="submitBtn">确认购买</button>
75 </div>
76 </div>
77 <?php endif; ?>
78 </form>
79 </div>
80</div>
81
82<script>
83(function(){
84 var periodRadios = document.querySelectorAll('input[name="period"]');
85 if (periodRadios.length && !document.querySelector('input[name="period"]:checked')) {
86 periodRadios[0].checked = true;
87 }
88 var typeRadios = document.querySelectorAll('input[name="type"]');
89 if (typeRadios.length && !document.querySelector('input[name="type"]:checked')) {
90 typeRadios[0].checked = true;
91 }
92
93 var form=document.getElementById('orderForm');if(!form)return;
94 var msg=document.getElementById('msg'),btn=document.getElementById('submitBtn');
95 function showMsg(text,type){msg.textContent=text;msg.className='ly-msg show '+(type==='success'?'ly-msg-success':'ly-msg-error');}
96 function updateChoiceStyles(){
97 form.querySelectorAll('.hs-choice').forEach(function(l){l.classList.remove('active');});
98 form.querySelectorAll('input[type="radio"]:checked').forEach(function(r){
99 var p=r.closest('.hs-choice');if(p)p.classList.add('active');
100 });
101 }
102 form.addEventListener('change',updateChoiceStyles);
103 updateChoiceStyles();
104
105 form.addEventListener('submit',function(e){
106 e.preventDefault();if(!btn)return;btn.disabled=true;btn.textContent='正在创建订单...';msg.className='ly-msg';
107 var body=new URLSearchParams();
108 body.append('plan_id','<?=(int)$plan['id']?>');
109 var pc=form.querySelector('input[name="period"]:checked');
110 body.append('period',pc?pc.value:'');
111 var tc=form.querySelector('input[name="type"]:checked');
112 body.append('type',tc?tc.value:'');
113 fetch('<?= htmlspecialchars(docker_shop_url('docker-shop/api/create_order'), ENT_QUOTES) ?>',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:body.toString()})
114 .then(function(r){return r.json();})
115 .then(function(res){
116 if(res.html){document.open();document.write(res.html);document.close();}
117 else if(res.redirect){window.location.href=res.redirect;}
118 else{showMsg(res.code||'创建订单失败','error');btn.disabled=false;btn.textContent='确认购买';}
119 })
120 .catch(function(){showMsg('网络错误,请重试','error');btn.disabled=false;btn.textContent='确认购买';});
121 });
122})();
123</script>
124<?php
125$content = ob_get_clean();
126include __DIR__ . '/layout.php';