mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-21 17:56:38 +08:00
feat: 钱包兼容非货币形式显示额度
This commit is contained in:
parent
660b9b3c99
commit
bc9cfa5da0
@ -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)})
|
||||||
}
|
}
|
||||||
|
@ -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'
|
||||||
|
@ -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');
|
||||||
|
@ -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);
|
||||||
}}
|
}}
|
||||||
|
Loading…
Reference in New Issue
Block a user