Просмотр исходного кода

feat: 钱包兼容非货币形式显示额度

CaIon 1 год назад
Родитель
Сommit
bc9cfa5da0
4 измененных файлов с 73 добавлено и 33 удалено
  1. 30 10
      controller/topup.go
  2. 1 1
      web/src/components/SystemSetting.js
  3. 26 5
      web/src/helpers/render.js
  4. 16 17
      web/src/pages/TopUp/index.js

+ 30 - 10
controller/topup.go

@@ -40,31 +40,46 @@ func GetEpayClient() *epay.Client {
 	return withUrl
 }
 
-func GetAmount(count float64, user model.User) float64 {
+func getPayMoney(amount float64, user model.User) float64 {
+	if !common.DisplayInCurrencyEnabled {
+		amount = amount / common.QuotaPerUnit
+	}
 	// 别问为什么用float64,问就是这么点钱没必要
 	topupGroupRatio := common.GetTopupGroupRatio(user.Group)
 	if topupGroupRatio == 0 {
 		topupGroupRatio = 1
 	}
-	amount := count * common.Price * topupGroupRatio
-	return amount
+	payMoney := amount * common.Price * topupGroupRatio
+	return payMoney
+}
+
+func getMinTopup() int {
+	minTopup := common.MinTopUp
+	if !common.DisplayInCurrencyEnabled {
+		minTopup = minTopup * int(common.QuotaPerUnit)
+	}
+	return minTopup
 }
 
 func RequestEpay(c *gin.Context) {
 	var req EpayRequest
 	err := c.ShouldBindJSON(&req)
 	if err != nil {
-		c.JSON(200, gin.H{"message": err.Error(), "data": 10})
+		c.JSON(200, gin.H{"message": "error", "data": "参数错误"})
 		return
 	}
-	if req.Amount < common.MinTopUp {
-		c.JSON(200, gin.H{"message": fmt.Sprintf("充值数量不能小于 %d", common.MinTopUp), "data": 10})
+	if req.Amount < getMinTopup() {
+		c.JSON(200, gin.H{"message": "error", "data": fmt.Sprintf("充值数量不能小于 %d", getMinTopup())})
 		return
 	}
 
 	id := c.GetInt("id")
 	user, _ := model.GetUserById(id, false)
-	payMoney := GetAmount(float64(req.Amount), *user)
+	payMoney := getPayMoney(float64(req.Amount), *user)
+	if payMoney < 0.01 {
+		c.JSON(200, gin.H{"message": "error", "data": "充值金额过低"})
+		return
+	}
 
 	var payType epay.PurchaseType
 	if req.PaymentMethod == "zfb" {
@@ -206,12 +221,17 @@ func RequestAmount(c *gin.Context) {
 		c.JSON(200, gin.H{"message": "error", "data": "参数错误"})
 		return
 	}
-	if req.Amount < common.MinTopUp {
-		c.JSON(200, gin.H{"message": "error", "data": fmt.Sprintf("充值数量不能小于 %d", common.MinTopUp)})
+
+	if req.Amount < getMinTopup() {
+		c.JSON(200, gin.H{"message": "error", "data": fmt.Sprintf("充值数量不能小于 %d", getMinTopup())})
 		return
 	}
 	id := c.GetInt("id")
 	user, _ := model.GetUserById(id, false)
-	payMoney := GetAmount(float64(req.Amount), *user)
+	payMoney := getPayMoney(float64(req.Amount), *user)
+	if payMoney <= 0.01 {
+		c.JSON(200, gin.H{"message": "error", "data": "充值金额过低"})
+		return
+	}
 	c.JSON(200, gin.H{"message": "success", "data": strconv.FormatFloat(payMoney, 'f', 2, 64)})
 }

+ 1 - 1
web/src/components/SystemSetting.js

@@ -362,7 +362,7 @@ const SystemSetting = () => {
               onChange={handleInputChange}
             />
             <Form.Input
-              label='最低充值数量'
+              label='最低充值美元数量(以美金为单位,如果使用额度请自行换算!)'
               placeholder='例如:2,就是最低充值2$'
               value={inputs.MinTopUp}
               name='MinTopUp'

+ 26 - 5
web/src/helpers/render.js

@@ -15,14 +15,18 @@ export function renderText(text, limit) {
  */
 export function renderGroup(group) {
   if (group === '') {
-    return <Tag size='large' key='default'>default</Tag>;
+    return (
+      <Tag size='large' key='default'>
+        default
+      </Tag>
+    );
   }
 
   const tagColors = {
-    'vip': 'yellow',
-    'pro': 'yellow',
-    'svip': 'red',
-    'premium': 'red'
+    vip: 'yellow',
+    pro: 'yellow',
+    svip: 'red',
+    premium: 'red',
   };
 
   const groups = group.split(',').sort();
@@ -97,12 +101,29 @@ export function getQuotaPerUnit() {
   return quotaPerUnit;
 }
 
+export function renderUnitWithQuota(quota) {
+  let quotaPerUnit = localStorage.getItem('quota_per_unit');
+  quotaPerUnit = parseFloat(quotaPerUnit);
+  quota = parseFloat(quota);
+  return quotaPerUnit * quota;
+}
+
 export function getQuotaWithUnit(quota, digits = 6) {
   let quotaPerUnit = localStorage.getItem('quota_per_unit');
   quotaPerUnit = parseFloat(quotaPerUnit);
   return (quota / quotaPerUnit).toFixed(digits);
 }
 
+export function renderQuotaWithAmount(amount) {
+  let displayInCurrency = localStorage.getItem('display_in_currency');
+  displayInCurrency = displayInCurrency === 'true';
+  if (displayInCurrency) {
+    return '$' + amount;
+  } else {
+    return renderUnitWithQuota(amount);
+  }
+}
+
 export function renderQuota(quota, digits = 2) {
   let quotaPerUnit = localStorage.getItem('quota_per_unit');
   let displayInCurrency = localStorage.getItem('display_in_currency');

+ 16 - 17
web/src/pages/TopUp/index.js

@@ -1,6 +1,10 @@
 import React, { useEffect, useState } from 'react';
 import { API, isMobile, showError, showInfo, showSuccess } from '../../helpers';
-import { renderNumber, renderQuota } from '../../helpers/render';
+import {
+  renderNumber,
+  renderQuota,
+  renderQuotaWithAmount,
+} from '../../helpers/render';
 import {
   Col,
   Layout,
@@ -12,6 +16,7 @@ import {
   Divider,
   Space,
   Modal,
+  Toast,
 } from '@douyinfe/semi-ui';
 import Title from '@douyinfe/semi-ui/lib/es/typography/title';
 import Text from '@douyinfe/semi-ui/lib/es/typography/text';
@@ -20,7 +25,7 @@ import { Link } from 'react-router-dom';
 const TopUp = () => {
   const [redemptionCode, setRedemptionCode] = useState('');
   const [topUpCode, setTopUpCode] = useState('');
-  const [topUpCount, setTopUpCount] = useState(10);
+  const [topUpCount, setTopUpCount] = useState(0);
   const [minTopupCount, setMinTopUpCount] = useState(1);
   const [amount, setAmount] = useState(0.0);
   const [minTopUp, setMinTopUp] = useState(1);
@@ -76,11 +81,9 @@ const TopUp = () => {
       showError('管理员未开启在线充值!');
       return;
     }
-    if (amount === 0) {
-      await getAmount();
-    }
+    await getAmount();
     if (topUpCount < minTopUp) {
-      showInfo('充值数量不能小于' + minTopUp);
+      showError('充值数量不能小于' + minTopUp);
       return;
     }
     setPayWay(payment);
@@ -92,7 +95,7 @@ const TopUp = () => {
       await getAmount();
     }
     if (topUpCount < minTopUp) {
-      showInfo('充值数量不能小于' + minTopUp);
+      showError('充值数量不能小于' + minTopUp);
       return;
     }
     setOpen(false);
@@ -189,7 +192,8 @@ const TopUp = () => {
         if (message === 'success') {
           setAmount(parseFloat(data));
         } else {
-          showError(data);
+          setAmount(0);
+          Toast.error({ content: '错误:' + data, id: 'getAmount' });
           // setTopUpCount(parseInt(res.data.count));
           // setAmount(parseInt(data));
         }
@@ -222,7 +226,7 @@ const TopUp = () => {
             size={'small'}
             centered={true}
           >
-            <p>充值数量:{topUpCount}$</p>
+            <p>充值数量:{topUpCount}</p>
             <p>实付金额:{renderAmount()}</p>
             <p>是否确认充值?</p>
           </Modal>
@@ -274,21 +278,16 @@ const TopUp = () => {
                     disabled={!enableOnlineTopUp}
                     field={'redemptionCount'}
                     label={'实付金额:' + renderAmount()}
-                    placeholder={'充值数量,最低' + minTopUp + '$'}
+                    placeholder={
+                      '充值数量,最低 ' + renderQuotaWithAmount(minTopUp)
+                    }
                     name='redemptionCount'
                     type={'number'}
                     value={topUpCount}
-                    suffix={'$'}
-                    min={minTopUp}
-                    defaultValue={minTopUp}
-                    max={100000}
                     onChange={async (value) => {
                       if (value < 1) {
                         value = 1;
                       }
-                      if (value > 100000) {
-                        value = 100000;
-                      }
                       setTopUpCount(value);
                       await getAmount(value);
                     }}