Browse Source

修改提币页面、新增加载条

master
liaoxinyu 8 months ago
parent
commit
4ef7b0e26c
  1. 2
      api/member.js
  2. BIN
      assets/img/tishi.png
  3. BIN
      assets/img/zhuanzan.png
  4. 8
      element/index.js
  5. 18
      i18n/lang/en.json
  6. 16
      i18n/lang/zh-TW.json
  7. 13
      pages.json
  8. 442
      pages/assets/draw1.vue
  9. 70
      pages/assets/records.vue
  10. 110
      pages/auth/certification.vue
  11. 2
      pages/base/home.vue
  12. 1
      pages/base/mine.vue

2
api/member.js

@ -86,7 +86,7 @@ class Member {
*/
static uploadImage(data) {
return server.uploadFile(`/uploadImage`,data);
return server.uploadFile(`/uploadImage`,data,{loading:false});
}
// 页面底部信息

BIN
assets/img/tishi.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
assets/img/zhuanzan.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

8
element/index.js

@ -1,8 +1,12 @@
// 导入自己需要的组件
import { Slider } from 'element-ui'
import { Slider,Progress,Steps,Step,Select,Option } from 'element-ui'
const components = [Slider,Progress,Steps,Step,Select,Option]
const element = {
install: function (Vue) {
Vue.use(Slider)
// Vue.use(Slider)
components.forEach(component => {
Vue.use(component)
})
}
}
export default element

18
i18n/lang/en.json

@ -120,7 +120,21 @@
"c13": "Withdrawal password",
"c14": "Please fill in the withdrawal password",
"c15": "Reset withdrawal password",
"rejection":"Reason for rejection"
"rejection":"Reason for rejection",
"c16": "Send",
"c17": "Transfer Address",
"c18": "Transfer Amount",
"c19": "Recharge/Transfer",
"c20": "Contact Customer Service",
"c21": "Select Currency",
"c22": "Password and Email Verification Code",
"c23": "Estimated arrival time",
"c24": "Received quantity",
"c25": "Withdrawal",
"c26": "The transfer quantity cannot be greater than {name}",
"c27": "Transfer Records",
"c28": "confirm",
"c29": "Please check your withdrawal address carefully and make sure it is filled in correctly. If you miss or fill in the wrong information, you may lose your assets."
},
"base": {
"a0": "Title",
@ -753,7 +767,7 @@
"d1": "Whether to remove the current ad",
"d2": "OK",
"d3": "Cancel",
"d4": "Undo successfully",
"d4": "Cancel successful",
"d5": "Fiat currency account",
"d6": "Freeze",
"d7": "Alipay Account",

16
i18n/lang/zh-TW.json

@ -120,7 +120,21 @@
"c13": "提款密碼",
"c14": "請填写提款密碼",
"c15": "重置提款密碼",
"rejection":"拒絕理由"
"rejection":"拒絕理由",
"c16": "轉移",
"c17": "轉移地址",
"c18": "轉移金額",
"c19": "充值/轉移",
"c20": "聯絡客服",
"c21": "選擇幣種",
"c22": "密碼及邮箱驗證碼",
"c23": "預計到帳時間",
"c24": "到帳數量",
"c25": "提現",
"c26": "轉移數量不能大於{name}",
"c27": "轉移記錄",
"c28": "確認",
"c29": "請認真核對您的提幣地址,務必檢查是否正確填寫。如果您漏添或填錯,將有可能對您的資產造成損失"
},
"base": {
"a0": "標題",

13
pages.json

@ -179,6 +179,9 @@
{
"path" : "pages/auth/certification"
},
{
"path" : "pages/assets/draw1"
},
{
"path": "pages/service/index",
"style": {
@ -214,11 +217,11 @@
}
},
{
"path": "pages/assets/records",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
"path": "pages/assets/records"
// "style": {
// "navigationBarTitleText": "",
// "enablePullDownRefresh": false
// }
},
{
"path" : "pages/safe/withdrawals-pwd"

442
pages/assets/draw1.vue

@ -0,0 +1,442 @@
<template>
<v-page>
<v-header>
<template #title>
<view>
<!-- {{ $t("assets.b6") }} -->
{{ $t("common.c16") }}
<!-- <span class="color-theme-1">{{ coin }}</span> -->
</view>
</template>
<template #right>
<v-link :to="'/pages/assets/records?type='+type">
<van-icon class="fn-20 m-t-xs" name="todo-list-o" />
</v-link>
</template>
</v-header>
<view class="layout-main" style="background-color: #121212;padding: 20px;">
<el-steps direction="vertical" :active="active" style="min-height: 260px !important;width: 100%;box-sizing: border-box;">
<el-step :title="$t('common.c21')" style="flex-basis: 110px;">
<template slot="description">
<view class="d-flex justify-between m-t-md" @click="coinListShow=true" style="border: 1px solid #4e4e5d;padding: 10px;">
<view class="fn-20 color-light">{{ coin }}</view>
<view class="d-flex align-center">
{{ $t('recharge.a0') }}
<van-icon name="arrow"/>
</view>
</view>
</template>
</el-step>
<el-step :title="$t('common.c17')">
<template slot="description">
<view style="margin: 10px 0px;width: 540rpx;">
<v-input @input="addressnum" v-model="form.address" class="bg-form-panel-3 color-light w-max fn-13 rounded-xs" :placeholder="$t('assets.b9')"></v-input>
<el-select v-model="form.addressType" @change="enteraddressType" style="margin-top: 10px;width: 100%;" class="addressType" v-if="coin=='USDT'" :placeholder="$t('common.select')">
<el-option v-for="(item, index) in network" :key="index" :label="item.name" :value="item.id">
<span>{{ item.name }}</span>
</el-option>
</el-select>
</view>
</template>
</el-step>
<el-step :title="$t('common.c18')" v-if="form.address">
<template slot="description">
<view style="margin: 10px 0px;color: #fff;width: 540rpx;">
<v-input type="number" @input="amountnum" v-model="form.amount" :min="withdrawFee.withdrawal_min" :max="withdrawFee.withdrawal_max" class="color-light fn-13" :placeholder="$t('assets.c2')"></v-input>
<view class="d-flex justify-between align-end" style="margin: 10px 0px;">
<view style="width: 100%;">{{ $t("assets.c1") }}{{ withdrawFee.usable_balance }}{{ coin }}</view>
<view style="width: 100%;text-align: right;">{{$t('common.c23')}}{{timeFormat}}</view>
</view>
</view>
</template>
</el-step>
<el-step :title="$t('common.c13')" v-if="form.amount">
<template slot="description">
<view style="margin: 10px 0px;color: #fff;width: 540rpx;">
<v-input type="password" @input="withdrawalnum" v-model="form.withdrawal_psw" class="color-light w-max fn-13 rounded-xs" :placeholder="$t('common.c14')"></v-input>
</view>
</template>
</el-step>
<el-step :title="$t('safe.a5')" v-if="form.withdrawal_psw">
<template slot="description">
<view style="margin: 10px 0px;color: #fff;width: 540rpx;display: flex;">
<v-input type="text" v-model="form.emailcode" class="w-max color-light fn-13" :placeholder="$t('safe.a6')"></v-input>
<view class="d-flex" style="justify-content: space-between;align-items: center;">
<view style="width: 180rpx;text-align: center;" class="all color-light m-l-md flex-shrink fn-12 getCode" @click="getEmailCode">
<text v-if="!getEmailCodeLock">{{ $t("common.getCode") }}</text>
<text v-else>{{ daojishi }}</text>
</view>
</view>
</view>
</template>
</el-step>
</el-steps>
<view style="margin: 20px 32px;border-top: 2px solid #444;">
<view style="display: flex;align-items: center;padding-top: 10px;">{{$t('common.c24')}}<img src="@/assets/img/zhuanzan.png" alt width="20" style="margin-left: 5px;"/></view>
<view style="display: flex;justify-content: space-between;align-items: center;">
<view>
<view style="font-size: 30px;font-weight: bold;max-width: 540rpx;">
<span style="overflow-wrap: anywhere;">{{price1(quantity)}}</span>
</view>
<view>{{$t('assets.c4')}}: {{coin=='USDT'&&form.addressType==3?withdrawFee.trc20:withdrawFee.withdrawal_fee }} {{coin}}</view>
</view>
<view></view>
</view>
<view style="display: flex;margin-top: 10px;">
<view :class="!form.emailcode?'fontWithdrawal':'fontWithdrawal1'" @click="toDraw">
{{$t('common.c25')}}
</view>
</view>
</view>
<view class="form bg-panel-3 p-x-lg p-y-md" style="background-color: #121212;">
<ul class="fn-md rounded-md m-y-xs line-height-2">
<li>·{{ $t("assets.c5") }}{{lang=='zh-TW'||lang=='jp'?'。':'.'}}</li>
<li>·{{ $t("assets.c6") }}{{lang=='zh-TW'||lang=='jp'?'。':'.'}}</li>
<li>·{{ $t("assets.c7") }}{{lang=='zh-TW'||lang=='jp'?'。':'.'}}</li>
</ul>
</view>
</view>
<coin-list ref="coinList" v-model="coin" @close="coinListShow = false" v-show="coinListShow"/>
<view v-show="promptaddress" class="modal-overlay">
<view class="modal-content">
<view style="margin-top: 25px;padding: 0px 10px;">
<img src="@/assets/img/tishi.png" alt="" width="60" />
<view style="margin: 20px 0px;">{{$t('common.c29')}}</view>
<view class="losure" @click="closeModal">{{$t('common.c28')}}</view>
</view>
</view>
</view>
</v-page>
</template>
<script>
import coinList from "./coin-list";
import Wallet from "@/api/wallet";
import Member from "@/api/member";
import formData from "@/utils/class/date";
import Profile from "@/api/profile";
export default {
components: {
coinList,
},
data() {
return {
type: 'draw',
coin: "",
lang:"",
active:1,
JStime: 0,
tiemr: null,
indexshow:0,
quantity:"0.00",
timeFormat:"",
rechargeType: 2,
withdrawFee: {},
coinListShow: false,
promptaddress:false,
getEmailCodeLock: false,
lang: uni.getStorageSync('language'),
network:[{id:2,name:"ERC20"},{id:3,name:"TRC20"}],
form: {
coin_id: "",
amount: "",
withdrawal_psw:"",
address: "",
addressType: "",
code_type: 1,
code: '',
emailcode: '',
gr_code: '',//Graphic verification code
},
}
},
created() {
this.lang = localStorage.getItem('lang')
this.updateTimeFormat()
this.timeUpdateInterval = setInterval(this.updateTimeFormat, 36000);
},
computed: {
activeCoin() {
if (!this.coin) return {};
return this.$refs.coinList.coinList.find(
(item) => item.coin_name == this.coin
);
},
daojishi(){
return '('+this.JStime + 's' + ')';
}
},
watch: {
coin(n) {
if (n) {
this.active = 2
this.form.address = "";
if (this.coin != "USDT") {
this.form.addressType = 1;
} else {
this.rechargeType = 2;
}
this.withdrawalBalance();
}
},
},
methods: {
price1(item){
if (item) {
let price = item.toString();
let parts = price.split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join(".");
}
},
addressnum(e){
if(e&&this.indexshow!==1){
this.indexshow++;
this.promptaddress = true;
this.active = 3
}
// console.log(e);
},
closeModal(){
this.promptaddress = false;
},
//
withdrawalBalance() {
let address_type = 1
let data = {
coin_name: this.coin,
address_type: this.rechargeType
};
Wallet.withdrawalBalance(data).then((res) => {
// console.info(res)
this.withdrawFee = res.data;
});
},
enteraddressType(e){
if(e&&this.form.amount){
const num = this.coin=='USDT'&&this.form.addressType==3?this.withdrawFee.trc20:this.withdrawFee.withdrawal_fee
this.quantity = this.form.amount - num
}
},
//
getEmailCode(){
if (!this.form.address) {
this.$toast(this.$t('assets.b9'))
return
}
if (!this.form.amount) {
this.$toast(this.$t('assets.c2'))
return
}
if (!this.form.withdrawal_psw) {
this.$toast(this.$t('common.c14'))
return
}
// if (!this.form.gr_code) {
// this.$toast(this.$t('common.GraphicValidation'))
// return
// }
if(this.getEmailCodeLock){return};
this.JStime = 300;
this.tiemr = setInterval(()=>{
if(this.JStime===0){
this.getEmailCodeLock = false;
clearInterval(this.tiemr);
return;
}
this.JStime--;
}, 1000)
this.getEmailCodeLock = true;
Member.getWdcode({bt:this.coin,baddr:this.form.address,bnum:this.form.amount}).then(res=>{
// console.log(res);
if(res.code=='4001'){
this.$toast(res.message);
}else{
this.$toast(this.$t('common.sendSuccess'));
}
})
},
//
toDraw() {
if (!this.form.address) {
this.$toast(this.$t('assets.b9'))
return
}
if (!this.form.amount) {
this.$toast(this.$t('assets.c2'))
return
}
if(!this.form.withdrawal_psw){
this.$toast(this.$t('common.c14'))
return
}
if (!this.form.emailcode) {
this.$toast(this.$t('safe.a6'))
return
}
let data = this.withdrawFee
if (data.withdraw_switch == 1) {
this.secondaryShow = true
if (data.google_status == 1) {
this.form.code_type = 3;
} else if (data.phone_status == 1) {
this.form.code_type = 1;
this.$nextTick(() => {
this.$refs.mobileCode.send();
});
} else if (data.email_status == 1) {
this.form.code_type = 2;
this.$nextTick(() => {
this.$refs.emailCode.send();
});
}
} else {
this.draw()
}
},
draw() {
// if(this.status!=2){
// this.$toast(this.$t('common.withdrawal2'));
// }
// this.form.addressType = this.rechargeType;
this.form.coin_id = this.activeCoin.coin_id;
Wallet.withdraw(this.form, {btn: this.$refs.btn})
.then((res) => {
this.secondaryShow = false
this.form.code = ''
if (res.code == 4001) {
this.$toast(res.message);
// this.reGetGraphChe();//
} else {
this.$toast.success(this.$t("assets.d5") + "!");
this.form.amount = ''
setTimeout(()=>{
uni.navigateTo({
url:'/pages/assets/records?type='+this.type
})
}, 1500)
// setTimeout(()=>{
// this.getWithdrawRecords();
// }, 2000)
// setTimeout(()=>{
// this.getWithdrawRecords();
// }, 3000)
}
})
.catch(() => {
});
},
amountnum(){
if(this.form.amount){
this.active = 4
const num = this.coin=='USDT'&&this.form.addressType==3?this.withdrawFee.trc20:this.withdrawFee.withdrawal_fee
this.quantity = this.form.amount - num
if(this.quantity < 0){
this.quantity = "0.00"
}
}else{
this.quantity = "0.00"
}
},
withdrawalnum(){
this.active = 5
},
updateTimeFormat() {
// datatimeFormat
this.timeFormat = this.getTimeFormat();
},
getCurrentUSTime() {
const now = new Date();
const offset = -4 * 60; // UTC-4
// getTimezoneOffset() UTC
const usTime = new Date(now.getTime() + (now.getTimezoneOffset() * 60000) + (offset * 60000));
return usTime;
},
// 01...6
getDayOfWeek(date) {
return date.getDay();
},
// 12H24H
getTimeFormat() {
const usTime = this.getCurrentUSTime();
const dayOfWeek = this.getDayOfWeek(usTime);
return dayOfWeek >= 1 && dayOfWeek <= 5 ? '12H' : '24H';
},
}
}
</script>
<style lang="scss">
</style>
<style scoped lang="scss">
.el-steps--vertical{
height: auto;
}
::v-deep .el-step__title.is-wait {
color: #303133 !important;
}
::v-deep .el-input__inner{
background-color: #242424;
}
::v-deep .is-process .el-step__icon.is-text{
border-color: #C0C4CC;
}
.modal-overlay {
z-index: 999999999999;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background-color: #1f1f1f;
padding: 20px;
border-radius: 5px;
width: 550rpx;
text-align: center;
position: relative;
}
.losure{
color: #fff;
width: 100%;
height: 40px;
font-size: 16px;
line-height: 40px;
cursor: pointer;
border-radius: 5px;
background-color: #77abff;
}
.getCode{
color: #fff;
margin: 10px 0px;
padding: 5px 10px;
border-radius: 5px;
align-items: center;
border: 1px solid #4e4e5d;
}
.fontWithdrawal{
color: #737475;
cursor: pointer;
padding: 10px 40px;
border-radius: 5px;
background-color: #3f4651;
}
.fontWithdrawal1{
color: #fff;
cursor: pointer;
padding: 10px 40px;
border-radius: 5px;
background-color: #1c52bc;
}
</style>

70
pages/assets/records.vue

@ -30,7 +30,8 @@
{{ item.datetime | parseTime }}
</view>
<view v-if="type=='draw'" style="width: 20%;">
<view>{{ item.status_text }}</view>
<view :class="item.status==0?'status_text':item.status==2?'status_text1':''">{{ item.status_text }}</view>
<view v-if="item.status==0">{{updateTimer(item)}}</view>
</view>
<view v-if="type=='recharge'">
<view v-if="item.status==0">{{$t('assets.d1')}}</view>
@ -47,7 +48,10 @@
</view>
</view>
<view class="p-l-md" v-if="item.remark" style="color:red;word-wrap: break-word;width:680rpx;">
{{$t('common.rejection')}}{{item.remark}}
<view>{{$t('common.rejection')}}{{item.remark}}</view>
<view style="display: flex;">
<view class="updated" v-if="!remarktext(item.updated_at)" @click="onservice">{{$t('common.c20')}}</view>
</view>
</view>
</tr>
<!-- <tr v-if="loadMore">
@ -73,7 +77,8 @@ import formData from "@/utils/class/date";
type: '',
list: [],
page: 1,
loadMore: true
loadMore: true,
timer: null,
}
},
filters: {
@ -121,6 +126,36 @@ import formData from "@/utils/class/date";
this.getWithdrawRecords()
})
},
onservice(){
this._router.push("/pages/oncs/onservice");
},
updateTimer(val){
const nowInMilliseconds = Date.now(); //
const twelveHoursInSeconds = 43200; // 12
const nowInSeconds = Math.floor(nowInMilliseconds / 1000); //
const adjustedNowInSeconds = nowInSeconds - twelveHoursInSeconds; //
//
const adjustedNowInMilliseconds = adjustedNowInSeconds * 1000;
const timer = val.newdatetime * 1000
const diff = timer - adjustedNowInMilliseconds;
if (diff <= 0) {
return '00:00:00';
}
const hours = Math.floor(diff / 3600000)
const minutes = Math.floor((diff % 3600000) / 60000)
const seconds = Math.floor((diff % 60000) / 1000)
return `${hours < 10 ? '0'+hours: hours}:${minutes < 10 ? '0'+minutes: minutes}:${seconds < 10 ? '0'+seconds: seconds}`;
},
remarktext(val){
const now = new Date()
const target = new Date(Date.parseTime(Date.parse(val)))
const diff = now.getTime() - target.getTime()
return diff > 12 * 60 * 60 * 1000
}
},
onLoad(e) {
// console.log('---------',e);
@ -130,10 +165,35 @@ import formData from "@/utils/class/date";
}else if(e.type=='recharge'){
this.depositHistory();
}
this.timer = setInterval(() => {
this.list.forEach((item) => {
if (item.status === 0) {
// Vue
this.$forceUpdate();
}
});
}, 1000);
}
}
</script>
<style>
<style scoped lang="scss">
.status_text{
font-size: 14px;
color: #53b987;
text-shadow: 1px 1px rgba(83, 185, 135, 0.8);
}
.status_text1{
font-size: 14px;
color: #D31027;
}
.updated{
color: #fff;
display: flex;
padding: 5px;
cursor: pointer;
border-radius: 5px;
background-color: #0089ff;
text-align: center;
}
</style>

110
pages/auth/certification.vue

@ -76,7 +76,7 @@
<v-input v-model="form.phone" :placeholder="$t('auth.d0')"></v-input>
</view>
</view>
<div class="form-item border-b p-md">
<div class="form-item border-b p-md" style="padding-bottom: 30px !important;position: relative;">
<div class="color-light p-b-xs">1{{$t('auth.b5')}}</div>
<div class="d-flex justify-between m-t-md ">
<div class="examples m-r-xs bg-panel-4 p-md rounded-sm">
@ -88,8 +88,15 @@
<img v-else :src="form.front_img" alt />
</div>
</div>
<el-progress
v-if="boll"
:percentage="uploadProgress"
:status="uploadStatus"
:stroke-width="10"
class="my-2"
></el-progress>
</div>
<div class="form-item border-b p-md">
<div class="form-item border-b p-md" style="padding-bottom: 30px !important;position: relative;">
<div class="color-light p-b-xs">2{{$t('auth.b6')}}</div>
<div class="d-flex justify-between m-t-md">
<div class="examples m-r-xs bg-panel-4 p-md rounded-sm">
@ -101,6 +108,13 @@
<img v-else :src="form.back_img" alt />
</div>
</div>
<el-progress
v-if="boll1"
:percentage="uploadProgress1"
:status="uploadStatus1"
:stroke-width="10"
class="my-2"
></el-progress>
</div>
<view class="p-md ">
<v-button block type="white" class="w-max rounded-md" ref="btn"
@ -146,6 +160,15 @@
value: 2,
text: this.$t('auth.d3')
}],
uploadProgress: 0, //
uploadStatus: null,//
progressInterval: null,
boll:false,
uploadProgress1: 0, //
uploadStatus1: null,//
boll1:false,
continueUploading:true,
continueUploading1:true
};
},
computed: {
@ -167,10 +190,73 @@
},
//
upLoadImg(chooseImageRes, name) {
if(name=='front_img'){
this.uploadStatus = null //
this.uploadProgress = 0 //
this.boll = true
}else{
this.uploadStatus1 = null //
this.uploadProgress1 = 0 //
this.boll1 = true
}
clearInterval(this.progressInterval); //
this.progressInterval = setInterval(() => {
if (this.uploadProgress < 100&&name=='front_img'&&this.continueUploading) {
this.uploadProgress += Math.floor(Math.random() * 3) + 1;
setTimeout(() => {
this.continueUploading = false;
// 3
setTimeout(() => {
this.continueUploading = true;
}, 3000); // 30003
}, 1000);
}else if(this.uploadProgress1 < 100&&name=='back_img'&&this.continueUploading1){
this.uploadProgress1 += Math.floor(Math.random() * 4) + 1;
setTimeout(() => {
this.continueUploading1 = false;
// 3
setTimeout(() => {
this.continueUploading1 = true;
}, 2600); // 30003
}, 1000);
}
}, 50);
Member.uploadImage(chooseImageRes).then((res) => {
this.form[name] = res.data.url;
this.$toast.success(this.$t('auth.c1'));
});
if(res.data.url){
if(name=='front_img'){
setTimeout(() => {
this.uploadStatus = 'success'
this.uploadProgress = 100
clearInterval(this.progressInterval); //
setTimeout(() => {
this.boll = false
},3000)
}, 2000)
}else{
setTimeout(() => {
this.uploadStatus1 = 'success'
this.uploadProgress1 = 100
clearInterval(this.progressInterval); //
setTimeout(() => {
this.boll1 = false
},3000)
}, 2000)
}
}
// this.$toast.success(this.$t('auth.c1'));
}).catch(() => {
if(name=='front_img'){
this.uploadStatus = 'exception'
this.uploadProgress = 100
}else{
this.uploadStatus1 = 'exception'
this.uploadProgress1 = 100
}
});
},
getAuthInfo() {
Profile.getAuthInfo().then((res) => {
@ -379,4 +465,20 @@
// object-fit: cover;
}
}
.el-progress {
position: absolute;
bottom: 8px;
right:-15px;
width: 300rpx;
// margin-top: 10px;
&-bar {
padding-right: 45px;
}
&__text {
font-size: 12px!important;
}
}
</style>

2
pages/base/home.vue

@ -1285,7 +1285,7 @@
if (this.isLogin) {
this.chatcount = setInterval(()=>{
this.chat()
},2000)
},5000)
this.createWalletAddress();
this.getAuthInfo()
this.personalAssets();

1
pages/base/mine.vue

@ -429,6 +429,7 @@ export default {
},
methods: {
price1(item,index){
if (this.hideMoney) return "******";
if (item) {
let price = item.toFixed(index).toString();
let parts = price.split(".");

Loading…
Cancel
Save