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

This commit is contained in:
CaIon 2024-04-04 18:18:18 +08:00
parent 660b9b3c99
commit bc9cfa5da0
4 changed files with 73 additions and 33 deletions

View File

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

View File

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

View File

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

View File

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