Files
Portal/pages/user/index.vue
T
2026-01-17 17:39:51 +08:00

262 lines
6.1 KiB
Vue

<template>
<view class="user">
<view class="card">
<view class="uid">ID:{{ userInfo.username }}</view>
<u--image
class="logo"
:showLoading="true"
:src="loginLogo"
width="50px"
height="auto"
mode="widthFix"
></u--image>
<view class="box">
<view class="text">{{ $lang.userBalance }}</view>
<view class="money">{{ money }}</view>
</view>
<u--image
:showLoading="false"
:src="require('static/images/card_bg.png')"
width="100%"
height="auto"
mode="widthFix"
></u--image>
</view>
<view class="content">
<view
class="cell"
v-for="(item, index) in userMenu"
:key="index"
@click="goPath(item)"
>
<view class="lab">{{ item.name }}</view>
<u-icon
class="icon"
name="arrow-right"
color="#757272"
size="16"
></u-icon>
</view>
<view class="logout" @tap="modalShow = true">{{ $lang.logout }}</view>
</view>
<u-picker
:title="$lang.languageSettings"
closeOnClickOverlay
:defaultIndex="defaultIndex"
:show="show"
:columns="langList"
:cancelText="$lang.cancel"
:confirmText="$lang.confirm"
keyName="name"
@close="show = false"
@cancel="show = false"
@confirm="confirm"
></u-picker>
<u-modal
:show="modalShow"
:title="$lang.tip"
:confirmText="$lang.confirm"
:cancelText="$lang.cancel"
@confirm="confirmLogout"
@cancel="modalShow = false"
:showCancelButton="true"
ref="uModal"
:asyncClose="true"
>
<view style="text-align: center">{{ $lang.logoutTip }}</view>
</u-modal>
<view class="mb60"></view>
</view>
</template>
<script>
import { mapState } from "vuex";
export default {
data() {
return {
show: false,
modalShow: false,
defaultIndex: [0],
langList: [
[
{ key: "en", name: "English" },
{ key: "tw", name: "繁體中文" },
{ key: "cn", name: "简体中文" },
{ key: "yn", name: "Việt nam" },
{ key: "kr", name: "한국어" },
{ key: "tl", name: "แบบไทย" },
{ key: "in", name: "Indonesia" },
],
],
money:0
};
},
computed: {
...mapState({
userInfo: (state) => state.app.userInfo,
language: (state) => state.app.language,
$lang: (state) => state.app.lang[state.app.language],
loginLogo: (state) => state.app.loginLogo,
userMenu: (state) => {
let list = [];
const lang = state.app.lang[state.app.language];
const userInfo = state.app.userInfo;
if (userInfo.pay_channel) {
list = lang.userMenu.filter(
(v) => v.id != 1
);
} else {
list = lang.userMenu.filter(
(v) => v.id != 1 && v.id != 2 && v.id != 4 && v.id != 5
);
}
return list;
},
}),
},
onLoad() {
this.langList[0].forEach((v, i) => {
if (v.key == this.language) {
this.defaultIndex = [i];
}
});
this.getUserMoneyData()
},
methods: {
confirm(item) {
this.$store.commit("app/updateLanguage", item.value[0].key);
this.show = false;
},
goPath(item) {
if (item.id == 0) {
this.show = true;
} else if (item.id == 4 || item.id == 5 || item.id == 6) {
uni.switchTab({
url: item.path,
});
} else {
if (this.userInfo.is_sw == 1) {
this.$toast({
message: this.$lang.is_sw,
duration: 2000,
});
} else {
uni.navigateTo({
url: item.path,
});
}
}
},
confirmLogout() {
localStorage.removeItem("userInfo");
this.$router.replace({ path: "/" });
},
getUserMoneyData() {
var that = this
const params = {
user_id: this.userInfo.id,
api_token: this.userInfo.api_token,
};
this.$api['getUserMoney'](params)
.then((res) => {
if (res.Success) {
that.money = parseFloat(res.Data.money).toFixed(2)
} else {
this.$toast({
message: res.Msg,
duration: 2000,
});
}
})
.catch((err) => {
console.log(err);
});
}
},
};
</script>
<style lang="scss" scoped>
.user {
background: #0b1520;
width: 100%;
min-height: 100vh;
.card {
width: 100%;
padding: 10px;
box-sizing: border-box;
position: relative;
.uid {
position: absolute;
left: 30px;
top: 25px;
z-index: 3;
font-size: 14px;
color: #573d14;
}
.logo {
position: absolute;
right: 25px;
top: 20px;
z-index: 3;
}
.box {
position: absolute;
left: 50%;
top: 50%;
z-index: 3;
transform: translate(-50%, -50%);
font-size: 18px;
font-weight: 600;
color: #573d14;
text-align: center;
.money {
padding-left: 38px;
padding-right: 36px;
padding-top: 10px;
padding-bottom: 4px;
background: url("/static/images/balance_icon.png") no-repeat;
background-size: 33px auto;
background-position: left top;
}
}
}
.content {
margin: 20px 15px;
border-radius: 5px;
overflow: hidden;
.cell {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 16px;
padding: 15px 10px;
color: #deb366;
border-bottom: 1px solid #594522;
background: #151617;
&:active {
opacity: 0.8;
}
&:last-child {
border-bottom: none;
}
}
.logout {
width: 100%;
height: 48px;
line-height: 48px;
text-align: center;
font-size: 16px;
background: #e5b932;
font-weight: 600;
margin: 20px auto;
border-radius: 5px;
&:active {
opacity: 0.8;
}
}
}
}
</style>