recharge-view.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // 充值界面逻辑
  2. (function() {
  3. let overlay = null;
  4. let container = null;
  5. let closeBtn = null;
  6. let packages = null;
  7. let rechargeInfo = null;
  8. let selectedPointsEl = null;
  9. let selectedPriceEl = null;
  10. let currentPackage = null;
  11. let currentUsername = null;
  12. function init() {
  13. overlay = document.getElementById('rechargeOverlay');
  14. container = document.getElementById('rechargeContainer');
  15. closeBtn = document.getElementById('rechargeClose');
  16. packages = document.querySelectorAll('.recharge-package');
  17. rechargeInfo = document.getElementById('rechargeInfo');
  18. selectedPointsEl = document.getElementById('selectedPoints');
  19. selectedPriceEl = document.getElementById('selectedPrice');
  20. if (!overlay || !container) {
  21. console.error('[RechargeView] 充值界面元素未找到');
  22. return;
  23. }
  24. bindEvents();
  25. }
  26. function bindEvents() {
  27. // 关闭按钮 - 只关闭界面,不触发充值
  28. if (closeBtn) {
  29. closeBtn.addEventListener('click', () => {
  30. hide();
  31. // 通知父窗口关闭充值界面
  32. if (window.parent && window.parent !== window) {
  33. window.parent.postMessage({
  34. type: 'close-recharge-view'
  35. }, '*');
  36. }
  37. });
  38. }
  39. // 点击遮罩层关闭 - 只关闭界面,不触发充值
  40. if (overlay) {
  41. overlay.addEventListener('click', (e) => {
  42. if (e.target === overlay) {
  43. hide();
  44. // 通知父窗口关闭充值界面
  45. if (window.parent && window.parent !== window) {
  46. window.parent.postMessage({
  47. type: 'close-recharge-view'
  48. }, '*');
  49. }
  50. }
  51. });
  52. }
  53. // ESC 键关闭 - 只关闭界面,不触发充值
  54. document.addEventListener('keydown', (e) => {
  55. if (e.key === 'Escape' && overlay && overlay.classList.contains('show')) {
  56. hide();
  57. // 通知父窗口关闭充值界面
  58. if (window.parent && window.parent !== window) {
  59. window.parent.postMessage({
  60. type: 'close-recharge-view'
  61. }, '*');
  62. }
  63. }
  64. });
  65. // 测试购买按钮
  66. const testBuyBtn = document.getElementById('testBuyBtn');
  67. if (testBuyBtn) {
  68. testBuyBtn.addEventListener('click', handleRechargeSuccess);
  69. }
  70. // 套餐选择
  71. if (packages) {
  72. packages.forEach(pkg => {
  73. pkg.addEventListener('click', () => {
  74. selectPackage(pkg);
  75. });
  76. });
  77. }
  78. // 监听来自父窗口的消息
  79. window.addEventListener('message', (event) => {
  80. if (event.data && event.data.type === 'open-recharge-view') {
  81. show(event.data.needPoints, event.data.currentPoints);
  82. }
  83. });
  84. }
  85. function selectPackage(pkg) {
  86. // 移除所有选中状态
  87. packages.forEach(p => p.classList.remove('selected'));
  88. // 添加选中状态
  89. pkg.classList.add('selected');
  90. currentPackage = {
  91. points: parseInt(pkg.dataset.points),
  92. price: parseFloat(pkg.dataset.price),
  93. package: pkg.dataset.package
  94. };
  95. // 显示充值信息
  96. if (rechargeInfo) {
  97. rechargeInfo.style.display = 'block';
  98. }
  99. if (selectedPointsEl) {
  100. selectedPointsEl.textContent = currentPackage.points + ' Ani币';
  101. }
  102. if (selectedPriceEl) {
  103. selectedPriceEl.textContent = '¥' + currentPackage.price;
  104. }
  105. }
  106. function show(needPoints, currentPoints) {
  107. if (!overlay) {
  108. init();
  109. }
  110. currentUsername = getCurrentUsername();
  111. if (!currentUsername) {
  112. if (window.parent && window.parent.HintView) {
  113. window.parent.HintView.error('请先登录', 2000);
  114. }
  115. return;
  116. }
  117. // 重置状态
  118. if (packages) {
  119. packages.forEach(p => p.classList.remove('selected'));
  120. }
  121. if (rechargeInfo) {
  122. rechargeInfo.style.display = 'none';
  123. }
  124. currentPackage = null;
  125. // 显示充值界面
  126. overlay.classList.add('show');
  127. overlay.style.pointerEvents = 'auto';
  128. // 默认选中第一个套餐
  129. if (packages && packages.length > 0) {
  130. selectPackage(packages[0]);
  131. }
  132. }
  133. function hide() {
  134. if (overlay) {
  135. overlay.classList.remove('show');
  136. overlay.style.pointerEvents = 'none';
  137. }
  138. currentPackage = null;
  139. currentUsername = null;
  140. }
  141. async function handleRechargeSuccess() {
  142. if (!currentPackage || !currentUsername) {
  143. hide();
  144. return;
  145. }
  146. try {
  147. // 调用充值API
  148. const response = await fetch('/api/recharge', {
  149. method: 'POST',
  150. headers: {
  151. 'Content-Type': 'application/json'
  152. },
  153. body: JSON.stringify({
  154. username: currentUsername,
  155. points: currentPackage.points,
  156. price: currentPackage.price,
  157. package: currentPackage.package
  158. })
  159. });
  160. const result = await response.json();
  161. if (result.success) {
  162. // 充值成功,通知父窗口
  163. if (window.parent && window.parent !== window) {
  164. window.parent.postMessage({
  165. type: 'recharge-success',
  166. points: currentPackage.points
  167. }, '*');
  168. }
  169. // 显示成功提示
  170. if (window.parent && window.parent.HintView) {
  171. window.parent.HintView.success(`充值成功!获得 ${currentPackage.points} Ani币`, 3000);
  172. }
  173. hide();
  174. } else {
  175. // 充值失败
  176. if (window.parent && window.parent.HintView) {
  177. window.parent.HintView.error(result.message || '充值失败', 3000);
  178. }
  179. hide();
  180. }
  181. } catch (error) {
  182. console.error('[RechargeView] 充值处理失败:', error);
  183. if (window.parent && window.parent.HintView) {
  184. window.parent.HintView.error('充值失败,请稍后重试', 3000);
  185. }
  186. hide();
  187. }
  188. }
  189. // 获取当前登录用户名
  190. function getCurrentUsername() {
  191. try {
  192. const loginDataStr = localStorage.getItem('loginData');
  193. if (!loginDataStr) {
  194. return null;
  195. }
  196. const loginData = JSON.parse(loginDataStr);
  197. const now = Date.now();
  198. // 检查是否过期
  199. if (now >= loginData.expireTime) {
  200. localStorage.removeItem('loginData');
  201. return null;
  202. }
  203. return loginData.user ? loginData.user.username : null;
  204. } catch (error) {
  205. console.error('[RechargeView] 获取用户名失败:', error);
  206. return null;
  207. }
  208. }
  209. // 初始化
  210. if (document.readyState === 'loading') {
  211. document.addEventListener('DOMContentLoaded', init);
  212. } else {
  213. init();
  214. }
  215. })();