转增代理功能-完善转增历史,金币转增页面

This commit is contained in:
chenruiye
2025-04-21 16:22:15 +08:00
parent e847572886
commit 99b2641be4
8 changed files with 636 additions and 11 deletions

View File

@@ -34,3 +34,27 @@ export const gitGiveRecordList = (params) => {
params: params
})
}
// 金币
export const getpurse = (params) => {
return request({
url: '/purse/query',
method: 'get',
params: params
})
}
// 支付
export const giveDiamond = (params) => {
return request({
url: '/user/diamond/give',
method: 'post',
params: params
})
}
// 用户转赠历史
export const getDiamondHistory = (params) => {
return request({
url: '/user/diamond/history',
method: 'get',
params: params
})
}

View File

@@ -1,6 +1,6 @@
const ar = {
myTransfer:{
我的转增:'my'
}
}
export default ar

View File

@@ -1,6 +1,6 @@
const tr = {
myTransfer:{
我的转增:'my'
}
}

View File

@@ -1,6 +1,6 @@
const zh = {
myTransfer:{
我的转增:'my'
}
}
export default zh

View File

@@ -8,6 +8,8 @@ var routers = new Router({
routes: [
{ path: '/myTransfer', name: 'myTransfer', component: () => import('@/view/myTransfer.vue') },
{ path: '/transferTo', name: 'transferTo', component: () => import('@/view/transferTo.vue') },
{ path: '/conversionHistory', name: 'conversionHistory', component: () => import('@/view/conversionHistory.vue') },
]
});

View File

@@ -0,0 +1,320 @@
<template>
<div>
<navigation v-if="!this.$store.state.isApp" title="转增历史" rightTitle></navigation>
<div>
<!-- <van-tabs v-model="activeTab" scrollspy sticky>
<van-tab title="标签 1"></van-tab>
<van-tab title="标签 2"></van-tab>
</van-tabs> -->
<div class="tabs">
<div class="tabs-item" :class="{ 'active': parmars.periodType == 1 }" @click="changePeriodType(1)">
本周期
<div class="line" v-show="parmars.periodType == 1"></div>
</div>
<div class="tabs-item" :class="{ 'active': parmars.periodType == 2 }" @click="changePeriodType(2)">
上周期
<div class="line" v-show="parmars.periodType == 2"></div>
</div>
</div>
<div class="cycleDateStr">{{ pageData.cycleDateStr }}</div>
<div class="type_change" v-if="partitionId == 2">
<div class="tab" :class="{ 'active': parmars.type == 1 }" @click="changeType(1)">ÜS Settlement</div>
<div class="tab" :class="{ 'active': parmars.type == 2 }" @click="changeType(2)">Transfer Coins</div>
</div>
<div class="title_top">Total Amount of Coin Transfers</div>
<div class="totalGiveGold">{{ pageData.totalGiveGold }}
<img src="../assets/img/coins.png" alt="">
</div>
<div class="grouped_data" v-for="(item, index) in groupedData" :key="index">
<div class="createTime">{{ index }}</div>
<div class="wrap" v-for="(itemTwo, indexTwo) in item" :key="indexTwo">
<div class="left">
<img :src="itemTwo.targetAvatar" alt="">
<div>
<div class="targetNick">
{{ itemTwo.targetNick }}
</div>
<div class="targetErbanNo">
ID:{{ itemTwo.targetErbanNo }}
</div>
</div>
</div>
<div class="right">
<div class="diamondNum">{{ itemTwo.diamondNum }}
<img src="../assets/img/coins.png" alt="">
</div>
<div class="createTimeStr">{{ itemTwo.createTimeStr }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import navigation from "@/components/navigation.vue";
import { getDiamondHistory } from "@/api/index";
export default {
components: { navigation },
data() {
return {
activeTab: 0,
parmars: {
pageNo: 1,
pageSize: 10,
periodType: 1,
pub_uid: window.sessionStorage.getItem("uid"),
type: 1
},
pageData: {
diamondGiveHistoryVoList: []
},
groupedData: {},
lock: false,
partitionId:this.$route.query.partitionId
}
},
mounted() {
this.getList();
},
methods: {
getList() {
if (this.lock) return
getDiamondHistory(this.parmars).then(res => {
if (res.data.code == 200) {
this.pageData.diamondGiveHistoryVoList = [...this.pageData.diamondGiveHistoryVoList, ...res.data.data.diamondGiveHistoryVoList];
this.pageData.cycleDateStr = res.data.data.cycleDateStr;
this.pageData.totalGiveGold = res.data.data.totalGiveGold;
// const groupedData = {};
this.pageData.diamondGiveHistoryVoList.forEach(item => {
item.createTime = item.createTimeStr.substring(0, 10);
});
// 使用 reduce 方法进行分类
this.groupedData = this.pageData.diamondGiveHistoryVoList.reduce((acc, item) => {
const key = item.createTime; // 使用 createTimeStr 作为键
// 如果键不存在,则初始化为空数组
if (!acc[key]) {
acc[key] = [];
}
// 将值 push 到对应的数组中
acc[key].push(item);
return acc;
}, {});
if (res.data.data.diamondGiveHistoryVoList.length < 10) {
this.lock = true
} else {
this.parmars.pageNo += 1;
this.getList()
}
}
});
}, changePeriodType(type) {
this.parmars.periodType = type;
this.parmars.pageNo = 1;
this.pageData.diamondGiveHistoryVoList = [];
this.lock = false;
this.getList();
},
changeType(type){
this.parmars.type = type;
this.parmars.pageNo = 1;
this.pageData.diamondGiveHistoryVoList = [];
this.lock = false;
this.getList();
}
}
}
</script>
<style lang="scss" scoped>
.tabs {
display: flex;
margin: 10px 16px;
.tabs-item {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 16px;
color: #AFB1B3;
text-align: center;
font-style: normal;
text-transform: none;
margin-right: 30px;
display: flex;
flex-direction: column;
align-items: center;
.line {
width: 13px;
height: 4px;
background: linear-gradient(270deg, #E29030 0%, #FCC074 100%);
border-radius: 504px 504px 504px 504px;
margin-top: 4px;
}
}
.active {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 16px;
color: #313131;
text-align: center;
font-style: normal;
text-transform: none;
}
}
.cycleDateStr {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 12px;
color: #7B7B7D;
text-align: left;
font-style: normal;
text-transform: none;
margin: 6px 16px 0;
}
.type_change{
background: #F7F7F7;
border-radius: 205px 205px 205px 205px;
display: flex;
margin: 12px 16px;
.tab{
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 13px;
color: #AFB1B3;
text-align: center;
font-style: normal;
text-transform: none;
padding: 8px 40px;
}
.active{
background: #FF8C03;
color: #FFFFFF;
border-radius: 205px 205px 205px 205px;
}
}
.title_top {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 14px;
color: #313131;
text-align: left;
font-style: normal;
text-transform: none;
margin: 6px 16px 0;
}
.totalGiveGold {
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 26px;
color: #FF8C03;
text-align: left;
font-style: normal;
text-transform: none;
margin: 10px 16px 16px;
display: flex;
align-items: center;
img {
width: 30px;
height: 30px;
margin-left: 4px;
}
}
.grouped_data {
.createTime {
background: #F4F4F4;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 14px;
color: #313131;
text-align: left;
font-style: normal;
text-transform: none;
padding: 10px 16px;
}
.wrap {
margin: 12px 16px 0;
padding-bottom: 12px;
border-bottom: 1px solid #F4F4F4;
display: flex;
justify-content: space-between;
align-items: center;
.left {
display: flex;
align-items: center;
img {
width: 49px;
height: 49px;
border-radius: 50%;
margin-right: 10px;
}
.targetNick {
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 15px;
color: #313131;
text-align: left;
font-style: normal;
text-transform: none;
}
.targetErbanNo {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 13px;
color: #7B7B7D;
text-align: left;
font-style: normal;
text-transform: none;
margin-top: 6px;
}
}
.right {
.diamondNum {
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 16px;
color: #FF8C03;
text-align: right;
font-style: normal;
text-transform: none;
display: flex;
align-items: center;
justify-content: flex-end;
img {
width: 22px;
height: 22px;
margin-left: 4px;
}
}
.createTimeStr {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 13px;
color: #7B7B7D;
text-align: right;
font-style: normal;
text-transform: none;
margin-top: 8px;
}
}
}
}
</style>

View File

@@ -25,7 +25,7 @@
{{ userInfo.totalGiveGold }}
<img src="../assets/img/coins.png" alt="">
</div>
<div class="right">
<div class="right" @click="goHistory">
View details
<img src="../assets/img/rightjt.png" alt="">
</div>
@@ -51,7 +51,7 @@
<p class="targetErbanNo">{{ item.targetErbanNo }}</p>
</div>
<div class="operation">
<div class="Transfer">Transfer</div>
<div class="Transfer" @click="goTransfer(item)">Transfer</div>
<div class="History">History</div>
</div>
</div>
@@ -120,6 +120,22 @@ export default {
validateInput(value) {
this.erbanNo = value.replace(/\D/g, '');
},
goTransfer(obj){
this.$router.push({
path: '/transferTo',
query: {
toUserInfo: JSON.stringify(obj)
}
})
},
goHistory(){
this.$router.push({
path: '/conversionHistory',
query: {
partitionId: this.userInfo.partitionId
}
})
}
}
}
</script>

View File

@@ -3,30 +3,129 @@
<navigation v-if="!this.$store.state.isApp" :title="this.$t(`myTransfer.我的转增`)" rightTitle></navigation>
<div class="toUserInfo">
<div class="avatar">
<img :src="toUserInfo.avatar" alt="">
<img :src="toUserInfo.avatar || toUserInfo.targetAvatar" alt="">
</div>
<div class="right">
<p class="nick">{{ toUserInfo.nick }}</p>
<p class="erbanNo">ID:{{ toUserInfo.erbanNo }}</p>
<p class="nick">{{ toUserInfo.nick || toUserInfo.targetNick }}</p>
<p class="erbanNo">ID:{{ toUserInfo.erbanNo || toUserInfo.targetErbanNo
}}</p>
</div>
</div>
<div class="tab_list">
<div class="txt">Gift Coins</div>
<div class="line"></div>
</div>
<div class="input_conis">
<img src="../assets/img/coins.png" alt="">
<van-field placeholder="0" v-model="parmars.diamondNum" type="number" />
</div>
<div class="my_coins">
My Coins:{{ purseData.diamonds }}
<img src="../assets/img/coins.png" alt="">
</div>
<div class="confirm_btn" :class="parmars.diamondNum != '' ? 'active' : ''" @click="confirm">OK</div>
<van-popup v-model="confirmShow" round>
<div class="confirm_popup">
<div class="title">Gift to Easua</div>
<div class="content">
<img src="../assets/img/coins.png" alt="">
{{ parmars.diamondNum }}
</div>
<div class="btn" @click="confirmPayment">Confirm Payment</div>
</div>
</van-popup>
<van-popup v-model="passwordInputShow" position="bottom">
<!-- 密码输入框 -->
<div class="password_input">
<div class="title">Please enter payment password</div>
<van-password-input :value="parmars.payPwd" :gutter="10" :length="6" />
</div>
<!-- 数字键盘 -->
<van-number-keyboard v-model="parmars.payPwd" :show="true" :maxlength="6"/>
</van-popup>
</div>
</template>
<script>
import navigation from "@/components/navigation.vue";
import { getpurse,giveDiamond } from "@/api/index";
import { encryptDes } from "@/utils/des.js";
export default {
components: { navigation },
data() {
return {
toUserInfo: JSON.parse(this.$route.query.toUserInfo)
toUserInfo: JSON.parse(this.$route.query.toUserInfo),
purseData: {},
confirmShow: false,
passwordInputShow: false,
parmars:{
payPwd:'',
diamondNum: '',
touid: ''
},
showKeyboard:true
}
},
mounted() {
console.log(this.toUserInfo)
console.log(this.toUserInfo,'-------')
this.getpurse()
this.parmars.touid = this.toUserInfo.uid || this.toUserInfo.targetUid
},
watch: {
'parmars.payPwd'(newValue) {
console.log("Password changed:", newValue);
// 检查密码是否为 6 位
if (newValue.length === 6) {
console.log("Password is complete");
this.submitTransfer();
}
}
},
methods: {
getpurse() {
getpurse().then(res => {
if (res.data.code == 200) {
this.purseData = res.data.data
}
})
},
confirm() {
if (this.parmars.diamondNum == '') return
this.confirmShow = true
},
confirmPayment() {
this.passwordInputShow = true
},
submitTransfer() {
let payPwd = encryptDes(
this.parmars.payPwd,
"1ea53d260ecf11e7b56e00163e046a26"
);
const params = {
toUid: this.parmars.touid,
diamondNum: this.parmars.diamondNum,
payPwd,
uid: window.sessionStorage.getItem("uid")
};
giveDiamond(params).then(res => {
if (res.data.code === 200) {
// 关闭弹窗
this.confirmShow = false;
this.passwordInputShow = false;
// 清空输入框
this.parmars.payPwd = '';
this.parmars.diamondNum = '';
this.$toast('转账成功');
this.$router.go(-1);
}
}).catch(err => {
this.$toast(err.message);
this.parmars.payPwd = '';
this.parmars.diamondNum = '';
});
},
}
}
</script>
@@ -39,6 +138,7 @@ export default {
align-items: center;
margin: 0 14px;
padding: 12px;
.avatar {
img {
width: 59px;
@@ -72,4 +172,167 @@ export default {
}
}
}
.tab_list {
padding: 12px 0 0;
display: inline-block;
margin: 0 14px;
margin-top: 4px;
.txt {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 15px;
color: #313131;
text-align: left;
font-style: normal;
text-transform: none;
}
.line {
width: 14px;
height: 4px;
background: linear-gradient(270deg, #E29030 0%, #FCC074 100%);
border-radius: 34px;
margin: 4px auto 0;
}
}
.input_conis {
background: #FFF7D6;
border-radius: 12px 12px 12px 12px;
margin: 10px 14px;
padding: 10px;
display: flex;
align-items: center;
img {
width: 32px;
height: 32px;
margin-right: 12px;
}
}
.van-field {
background-color: transparent;
padding: 0;
}
.my_coins {
font-family: PingFang SC, PingFang SC;
font-weight: 400;
font-size: 13px;
color: #7B7B7D;
text-align: left;
font-style: normal;
text-transform: none;
display: flex;
align-items: center;
margin: 0 14px;
img {
width: 20px;
height: 20px;
margin-left: 4px;
}
}
.confirm_btn {
background: linear-gradient(270deg, #E29030 0%, #FCC074 100%);
border-radius: 117px 117px 117px 117px;
opacity: 0.3;
margin: 20px 14px;
padding: 10px 0;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 16px;
color: #FFFFFF;
text-align: center;
font-style: normal;
text-transform: none;
display: flex;
align-items: center;
justify-content: center;
}
.active {
// background: linear-gradient( 270deg, #FCC074 100% ,#E29030 0%,);
opacity: 1;
}
.confirm_popup {
// margin: 16px 50px;
width: 290px;
// border-radius: 16px 16px 16px 16px;
.title {
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 16px;
color: #313131;
text-align: center;
font-style: normal;
text-transform: none;
margin-top: 16px;
}
.content {
margin-top: 30px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 36px;
height: 36px;
margin-right: 8px;
}
font-family: PingFang SC,
PingFang SC;
font-weight: 600;
font-size: 30px;
color: #313131;
text-align: left;
font-style: normal;
text-transform: none;
}
.btn {
background: linear-gradient(270deg, #E29030 0%, #FCC074 100%);
border-radius: 117px 117px 117px 117px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
font-size: 14px;
color: #FFFFFF;
text-align: center;
font-style: normal;
text-transform: none;
display: flex;
align-items: center;
justify-content: center;
padding: 10px 0;
margin: 24px;
}
}
.password_input{
margin-bottom: 260px;
margin-top:16px;
.title{
font-family: PingFang SC, PingFang SC;
font-weight: 600;
font-size: 16px;
color: #313131;
text-align: center;
font-style: normal;
text-transform: none;
margin-bottom: 22px;
}
}
.van-password-input__item{
background-color: #F4F4F4;
border-radius: 10px 10px 10px 10px;
}
</style>