recharge.vue 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <CommonTopBanner
  3. title="充值乡源果"
  4. showNav
  5. >
  6. <FlexCol gap="gap.lg" padding="padding.md">
  7. <FlexRow center>
  8. <Image src="https://xy.wenlvti.net/app_static/images/village/IconBlessing.png" :width="100" :height="100" />
  9. </FlexRow>
  10. <FlexCol padding="padding.md" center>
  11. <Text
  12. text="请选择您要付款方式"
  13. fontConfig="contentText" :fontSize="30" textAlign="center"
  14. />
  15. </FlexCol>
  16. <FlexCol gap="gap.md">
  17. <BoxMid v-for="item in listLoader.content.value" direction="row" justify="space-between" align="center" gap="gap.md">
  18. <FlexCol width="74%">
  19. <Text :text="item.name" fontConfig="lightImportantTitle" :fontSize="42" />
  20. <Text :text="`+ ${item.addFruit} 乡源果`" fontConfig="lightGoldTitle" :fontSize="30" />
  21. </FlexCol>
  22. <FlexRow align="center" gap="gap.lg">
  23. <Text :text="`¥${item.price}`" fontConfig="lightGoldTitle" :fontSize="42" />
  24. <FrameButton primary text="选择" @click="handlePay(item.id)" />
  25. </FlexRow>
  26. </BoxMid>
  27. </FlexCol>
  28. </FlexCol>
  29. </CommonTopBanner>
  30. </template>
  31. <script setup lang="ts">
  32. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  33. import { useRequireLogin } from '@/common/composeabe/RequireLogin';
  34. import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
  35. import { toast } from '@/components/dialog/CommonRoot';
  36. import { backAndCallOnPageBack, navTo } from '@/components/utils/PageAction';
  37. import { showError } from '@/common/composeabe/ErrorDisplay';
  38. import BoxMid from '@/common/components/box/BoxMid.vue';
  39. import CommonTopBanner from '@/common/components/CommonTopBanner.vue';
  40. import FrameButton from '@/common/components/FrameButton.vue';
  41. import Text from '@/components/basic/Text.vue';
  42. import FlexCol from '@/components/layout/FlexCol.vue';
  43. import FlexRow from '@/components/layout/FlexRow.vue';
  44. import Image from '@/components/basic/Image.vue';
  45. import TreeApi from '@/api/light/TreeApi';
  46. const { requireLoginAsync } = useRequireLogin();
  47. const { querys } = useLoadQuerys({
  48. villageId: 0,
  49. });
  50. const listLoader = useSimpleDataLoader(async () => {
  51. return (await TreeApi.getFruitDepositList({ page: 1, pageSize: 30 })).list;
  52. });
  53. async function handlePay(id: number) {
  54. if (!requireLoginAsync('登录后为村社升级,做出你的贡献哦'))
  55. return;
  56. try {
  57. uni.showLoading({ title: '创建订单中...' });
  58. const payInfo = await TreeApi.placeOrder(
  59. id,
  60. querys.value.villageId,
  61. );
  62. if (payInfo && payInfo.pay) {
  63. uni.requestPayment({
  64. provider: 'wxpay',
  65. appId: payInfo.pay.appId,
  66. timeStamp: payInfo.pay.timeStamp,
  67. nonceStr: payInfo.pay.nonceStr,
  68. package: payInfo.pay.package,
  69. signType: payInfo.pay.signType,
  70. paySign: payInfo.pay.paySign,
  71. success: () => {
  72. toast('支付成功');
  73. setTimeout(() =>
  74. backAndCallOnPageBack('paySuccessAndRefresh', {})
  75. , 1000);
  76. },
  77. fail: (err) => {
  78. showError(`支付失败: ${err.errMsg}`);
  79. },
  80. });
  81. }
  82. } catch (e) {
  83. showError(e);
  84. } finally {
  85. uni.hideLoading();
  86. }
  87. }
  88. </script>