Browse Source

初始化

master
前端-胡立永 1 year ago
commit
130413ec72
524 changed files with 52742 additions and 0 deletions
  1. +13
    -0
      .gitignore
  2. +16
    -0
      .hbuilderx/launch.json
  3. +56
    -0
      App.vue
  4. +36
    -0
      README.en.md
  5. +39
    -0
      README.md
  6. +55
    -0
      components/base/m-navbar.vue
  7. +134
    -0
      components/base/tabBar.vue
  8. +458
    -0
      components/center/center.vue
  9. +136
    -0
      components/changeLanguage/changeLanguage.vue
  10. +88
    -0
      components/luckyAnimation/luckyAnimation.vue
  11. +81
    -0
      components/pageInit/loading.vue
  12. +57
    -0
      components/pageInit/pageInit.vue
  13. +190
    -0
      components/review/review.vue
  14. +72
    -0
      components/serviceList/serviceList.vue
  15. +145
    -0
      components/turntable.vue
  16. +20
    -0
      index.html
  17. +37
    -0
      interceptor/interceptor.js
  18. +304
    -0
      locale/en.js
  19. +268
    -0
      locale/en不知道什么的英语.js
  20. +320
    -0
      locale/es.js
  21. +20
    -0
      locale/index.js
  22. +56
    -0
      main.js
  23. +89
    -0
      manifest.json
  24. +19
    -0
      package.json
  25. +134
    -0
      pages.json
  26. +58
    -0
      pages/certificate/certificate.vue
  27. +446
    -0
      pages/home/home.vue
  28. +145
    -0
      pages/instructions/instructions.vue
  29. +135
    -0
      pages/invitationList/invitationList.vue
  30. +91
    -0
      pages/login/contactCustomerService.vue
  31. +281
    -0
      pages/login/login.vue
  32. +94
    -0
      pages/loginRecord/loginRecord.vue
  33. +165
    -0
      pages/modifyUser/modifyUser.vue
  34. +266
    -0
      pages/order/order.vue
  35. +210
    -0
      pages/personalInfo/personalInfo.vue
  36. +591
    -0
      pages/prizeDraw/prizeDraw.vue
  37. +265
    -0
      pages/purse/purse.vue
  38. +344
    -0
      pages/register/register.vue
  39. +120
    -0
      pages/runningWater/runningWater.vue
  40. +360
    -0
      pages/signIn/signIn.vue
  41. +149
    -0
      pages/winningRecord/winningRecord.vue
  42. +308
    -0
      pages/withdraw/withdraw.vue
  43. +27
    -0
      plugin/index.js
  44. +28
    -0
      plugin/toast/index.js
  45. +73
    -0
      plugin/toast/index.vue
  46. BIN
      static/center/10.png
  47. BIN
      static/center/11.png
  48. BIN
      static/center/12.png
  49. BIN
      static/center/13.png
  50. BIN
      static/center/2.png
  51. BIN
      static/center/20.png
  52. BIN
      static/center/5.png
  53. BIN
      static/center/6.png
  54. BIN
      static/center/7.png
  55. BIN
      static/center/8.png
  56. BIN
      static/center/9.png
  57. BIN
      static/center/fans.png
  58. BIN
      static/center/login.png
  59. BIN
      static/center/winning-record.png
  60. BIN
      static/certificate/certificate.png
  61. BIN
      static/drone/230.png
  62. BIN
      static/drone/29.png
  63. BIN
      static/drone/30.png
  64. BIN
      static/drone/45.png
  65. BIN
      static/drone/46.png
  66. BIN
      static/drone/48.png
  67. BIN
      static/drone/49.png
  68. BIN
      static/drone/50.png
  69. BIN
      static/drone/5db810a1868a7230.png
  70. BIN
      static/home/About-us.png
  71. BIN
      static/home/Event.png
  72. BIN
      static/home/FAQ.png
  73. BIN
      static/home/TC.png
  74. BIN
      static/home/bg.png
  75. BIN
      static/home/current.png
  76. BIN
      static/home/logo.png
  77. BIN
      static/home/menu.png
  78. BIN
      static/home/menu1.png
  79. BIN
      static/home/menu2.png
  80. BIN
      static/home/menu3.png
  81. BIN
      static/home/menu4.png
  82. BIN
      static/home/sign.png
  83. BIN
      static/home/vip1.png
  84. BIN
      static/home/vip2.png
  85. BIN
      static/home/vip3.png
  86. BIN
      static/home/vip4.png
  87. BIN
      static/instructions/desc.png
  88. BIN
      static/loading/logo.png
  89. BIN
      static/login/bg.png
  90. BIN
      static/login/language.png
  91. BIN
      static/login/logo.png
  92. BIN
      static/logo.png
  93. BIN
      static/music/c.mp3
  94. BIN
      static/music/click.mp3
  95. BIN
      static/order/1.jpg
  96. BIN
      static/personalInfo/bg.png
  97. BIN
      static/personalInfo/user-image.png
  98. BIN
      static/prizeDraw/23.png
  99. BIN
      static/prizeDraw/6.png
  100. BIN
      static/prizeDraw/bj.jpg

+ 13
- 0
.gitignore View File

@ -0,0 +1,13 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
.idea
package-lock.json
node_modules/
unpackage/
pages/index/index.vue

+ 16
- 0
.hbuilderx/launch.json View File

@ -0,0 +1,16 @@
{ // launch.json configurations app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtypelocalremote, localremote
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}

+ 56
- 0
App.vue View File

@ -0,0 +1,56 @@
<script>
export default {
onLaunch: function() {
if(!uni.getStorageSync('language')){
this.$i18n.locale = 'en'
//#ifdef H5
this.$router.go(0);
//#endif
//#ifdef APP-PLUS
//#endif
uni.setStorage({
key: 'language',
data: 'en'
})
uni.setLocale('en')
}
uni.$resMessage = this.$t('message')
},
onShow: function() {
},
onHide: function() {
}
}
</script>
<style lang="scss">
/*每个页面公共css */
@import '@/uni_modules/uview-ui/theme.scss';
body{
// background-color: #000;
}
uni-toast {
z-index: 100000000;
}
.u-modal{
// background-color: #000;
}
.u-modal__title{
color: #fff !important;
}
@media screen and (min-width: 960px) {
.bx{ //
// max-width: 960px;
max-width: 375px;
// max-width: 765px;
margin: 0px auto;
}
}
</style>

+ 36
- 0
README.en.md View File

@ -0,0 +1,36 @@
# mobile-shop-uniapp
#### Description
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 39
- 0
README.md View File

@ -0,0 +1,39 @@
# mobile-shop-uniapp
#### 介绍
{**以下是 Gitee 平台说明,您可以替换此简介**
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 55
- 0
components/base/m-navbar.vue View File

@ -0,0 +1,55 @@
<template>
<view class="navbar bx">
<div class="leftClick"
v-if="leftClick"
@click="leftClick();$play()">
<uni-icons color="#B0C73B" type="left" size="30rpx"></uni-icons>
</div>
<div>{{ title }}</div>
</view>
</template>
<script>
export default {
name:"m-navbar",
props : ['leftClick', 'title'],
data() {
return {
};
},
methods : {
}
}
</script>
<style scoped lang="scss">
.navbar{
position: sticky;
top: 0;
width: 100%;
height: 90rpx;
// background: linear-gradient(to right, #4899a6, #6fc6ad);
background: black;
border-bottom: 1px solid #ccc;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
font-size: 26rpx;
z-index: 9999;
.leftClick{
position: absolute;
left: 0px;
top: 0;
width: 80rpx;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
}
.navbar-b{
height: 90rpx;
}
</style>

+ 134
- 0
components/base/tabBar.vue View File

@ -0,0 +1,134 @@
<template>
<view class="list">
<view
:class="{item : true, active : select == index}"
@click="toPath(item, index)"
v-for="(item, index) in list">
<view class="icon">
<image :src="select == index ? item.selectedIconPath : item.iconPath" class="icon-image" mode=""></image>
</view>
<view class="title">
{{ $t(item.title) }}
</view>
</view>
</view>
</template>
<!-- "tabBar": {
"backgroundColor": "white",
"selectedColor": "#cd0000",
"list": [
{
"selectedIconPath": "/static/tabbar/2.png",
"iconPath": "/static/tabbar/1.png",
"pagePath": "pages/home/home",
"text": "%tabbar.title.1%"
},{
"selectedIconPath": "/static/tabbar/4.png",
"iconPath": "/static/tabbar/3.png",
"pagePath": "pages/cart/cart",
"text": "%tabbar.title.2%"
},{
"selectedIconPath": "/static/tabbar/6.png",
"iconPath": "/static/tabbar/5.png",
"pagePath": "pages/order/order",
"text": "%tabbar.title.3%"
}
]
} -->
<script>
export default {
props : ['select'],
data() {
return {
"list": [
{
"selectedIconPath": "/static/tabbar/2.png",
"iconPath": "/static/tabbar/1.png",
"pagePath": "/pages/home/home",
"title": "tabbar.title.1"
},{
"selectedIconPath": "/static/tabbar/4.png",
"iconPath": "/static/tabbar/3.png",
"pagePath": "/pages/prizeDraw/prizeDraw",
"title": "tabbar.title.2"
},{
"selectedIconPath": "/static/tabbar/6.png",
"iconPath": "/static/tabbar/5.png",
"pagePath": "/pages/order/order",
"title": "tabbar.title.3"
}
]
}
},
methods: {
toPath(item, index){
if(index == this.select){
return
}
this.$play()
uni.redirectTo({
url: item.pagePath
})
},
}
}
</script>
<style scoped lang="scss">
.list{
position: fixed;
width: 100vw;
// background-color: #aec438;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
height: 120rpx;
z-index: 999;
font-size: 20rpx;
bottom: 0;
left: 0;
line-height: 50rpx;
color: #000;
.item:nth-child(2){
.icon{
.icon-image{
width: 95rpx;
height: 95rpx;
margin-top: -55rpx;
}
}
}
.item{
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.icon{
width: 100%;
height: 50%;
display: flex;
justify-content: center;
align-items: center;
.icon-image{
width: 40rpx;
height: 40rpx;
}
}
.icon-image{
width: 100%;
height: 50%;
}
.title{
overflow:hidden;
white-space: nowrap;
text-overflow: ellipsis;
-o-text-overflow:ellipsis;
}
}
}
.active{
color: #fff !important;
}
</style>

+ 458
- 0
components/center/center.vue View File

@ -0,0 +1,458 @@
<template>
<u-popup :show="show" mode="left" width="70%" bgColor="#000" @close="$emit('close')" @open="open">
<view style="justify-content: center;display: flex;width: 600rpx;" v-if="loading">
<u-loading-icon
mode="semicircle"
size="30"></u-loading-icon>
</view>
<view class="center" v-if="!loading">
<view class="line" style="margin-top: 30rpx;
position: relative;">
<view style="position: absolute;left: 20rpx;"
@click="$emit('close')">
x
</view>
<view class="">
<img src="/static/center/20.png" width="120rpx" />
</view>
</view>
<view class="line">
<img src="/static/center/5.png" width="80rpx" />
</view>
<view style="font-size: 22rpx;font-weight: bold;" class="line">{{ userInfo.account }}</view>
<view class="line">
<view style="background-color: #6c7a25;padding: 5rpx 20rpx;">
{{ $t('page.center.invtantion_code') }}:{{ userInfo.invitationCode }}
</view>
<view style="margin-left: 20rpx;" @click="copy(userInfo.invitationCode)">
<img src="/static/center/2.png" width="23rpx" />
</view>
</view>
<view class="line">
<view style="color: #afc056;padding: 0 10rpx;font-size: 22rpx;font-weight: 600;">
{{ $t('page.center.cradibiliy_value') }}
</view>
<view style="flex: 1;padding-right: 20rpx;">
<u-line-progress
:percentage="userInfo.contribution"
activeColor="#afc638" height="16"></u-line-progress>
</view>
<!-- <view style="flex: 1;">
<view style="background-color: #afc056;
text-align:center;border-radius: 20rpx;
margin-right: 20rpx;
">{{ userInfo.contribution }}%</view>
</view> -->
</view>
<view class="line">
<view class="box">
<view style="color: #afc056;font-weight: 900;
display: flex;justify-content: space-between;font-size: 28rpx;">
<view class="">
{{ $t('page.center.account_balance') }}
</view>
<view class="">
USDT {{ userInfo.belece }}
</view>
</view>
<view style="font-size: 22rpx;margin-top: 20rpx;">
{{ $t('page.center.account_balance_info') }}
</view>
</view>
</view>
<view class="line">
<view class="box">
<view style="color: #afc056;font-weight: 900;
display: flex;justify-content: space-between;font-size: 28rpx;">
<view class="">
{{ $t('page.center.wallet_amount') }}
</view>
<view class="">
USDT {{ userInfo.money }}
</view>
</view>
</view>
</view>
<!-- 充值 -->
<u-cell @click="toPurse" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/6.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.deposit') }}
</view>
</u-cell>
<!-- 提现 -->
<u-cell @click="toWithdraw" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/7.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.withdraw') }}
</view>
</u-cell>
<!-- 用户信息 -->
<u-cell @click="toPersonalInfo" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/8.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.personal_info') }}
</view>
</u-cell>
<!-- 交易记录 -->
<u-cell @click="toRunningWater" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/9.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.Transaction') }}
</view>
</u-cell>
<!-- 提现地址 -->
<u-cell @click="revealAddress" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/10.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.wallet') }}
</view>
</u-cell>
<!-- 粉丝列表 -->
<u-cell @click="toInvitationList" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/fans.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.fanList') }}
</view>
</u-cell>
<!-- 中奖记录 -->
<u-cell @click="toWinningRecord" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/winning-record.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.winningRecord') }}
</view>
</u-cell>
<!-- 语言 -->
<u-cell @click="showLanguage = true;$play()" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/11.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.language') }}
</view>
</u-cell>
<!-- 客服 -->
<u-cell @click="revealServiceList" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/12.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.customer_serivce') }}
</view>
</u-cell>
<!-- 登录记录 -->
<u-cell @click="toLoginRecord" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/login.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.loginRecord') }}
</view>
</u-cell>
<!-- 退出登录 -->
<u-cell @click="logout" color="#fff" isLink>
<view slot="icon">
<img src="/static/center/13.png" width="23rpx" />
</view>
<view slot="title" style="color: #eee;padding: 20rpx 0;">
{{ $t('page.center.logout') }}
</view>
</u-cell>
</view>
<!-- 填写地址弹框 -->
<u-popup :show="showAddress" mode="center" bgColor="black"
@close="showAddress=false;$play()">
<view class="address-content">
<view class="address-top">
<view class="title">{{ $t('page.center.Tips') }}</view>
<uni-icons @click="showAddress=false;$play()"
class="close-icon"
color="#B0C73B" type="close"
size="40rpx"></uni-icons>
</view>
<view class="address-detail">
<view class="title">{{ $t('page.center.Address') }}:</view>
<textarea v-model="moneyAddress"
:placeholder="$t('page.center.type-address')"></textarea>
</view>
<view @click="editMoneyAddress"
class="save">{{ $t('page.center.save') }}</view>
</view>
</u-popup>
<!-- 选择语言弹框 -->
<changeLanguage :show.sync="showLanguage" @close="closeLanguage"></changeLanguage>
<!-- 客服列表 -->
<serviceList :show="showService" :serverList="serverList" @close="closeServiceList"></serviceList>
</u-popup>
</template>
<script>
import changeLanguage from '@/components/changeLanguage/changeLanguage.vue'
import serviceList from '@/components/serviceList/serviceList.vue'
export default {
name: "center",
components : { changeLanguage , serviceList },
data() {
return {
list: [{
}],
showAddress: false,
showLanguage : false,
showService : false,
serverList : [],
moneyAddress : '',
loading : false,
};
},
props : {
userInfo : {
type : Object,
default : function() {
return {}
}
},
show : {
type : Boolean,
default : false
}
},
methods: {
open() {
this.forgetPass()
this.moneyAddress=this.userInfo.moneyAddress
},
//
revealAddress() {
this.$play()
this.showAddress = true;
},
//
closeLanguage(){
this.$play()
this.showLanguage = false;
},
//
toPurse(){
this.$play()
uni.navigateTo({
url: '/pages/purse/purse'
})
},
//
toWithdraw(){
this.$play()
uni.navigateTo({
url: '/pages/withdraw/withdraw'
})
},
//
toPersonalInfo(){
this.$play()
uni.navigateTo({
url: '/pages/personalInfo/personalInfo'
})
},
//
toRunningWater(){
this.$play()
uni.navigateTo({
url: '/pages/runningWater/runningWater'
})
},
//
revealServiceList(){
this.$play()
this.showService = true;
},
//
closeServiceList(){
this.$play()
this.showService = false;
},
//退
logout(){
this.$play()
localStorage.removeItem('token')
uni.navigateTo({
url: "/pages/login/login"
})
},
//()
forgetPass(){
this.request('forgetPass').then(res => {
if(res.code == 200){
this.serverList = res.result
}
})
},
//
editMoneyAddress(){
this.$play()
if(this.userInfo.moneyAddress){
return uni.showToast({ title: this.$t('page.center.cannotModified'), icon: 'none' })
}
this.request('editMoneyAddress',{},{moneyAddress : this.moneyAddress}).then(res => {
if(res.code == 200){
this.showAddress = false;
uni.showToast({ title: this.$t('message.15'), icon: 'none' })
}
})
},
//
copy(text){
this.$play()
uni.setClipboardData({
data: text,
success: () => {
uni.showToast({
title: this.$t('success-operation'),
icon: 'none',
})
}
})
},
//
toInvitationList(){
this.$play()
uni.navigateTo({
url: '/pages/invitationList/invitationList'
})
},
//
toLoginRecord(){
this.$play()
uni.navigateTo({
url: '/pages/loginRecord/loginRecord'
})
},
//
toWinningRecord(){
this.$play()
uni.navigateTo({
url: '/pages/winningRecord/winningRecord'
})
}
}
}
</script>
<style scoped lang="scss">
.center {
width: 600rpx;
overflow: scroll;
height: 100vh;
.line {
display: flex;
justify-content: center;
align-items: center;
margin-top: 40rpx;
flex-shrink: 1;
.box {
border: 1px solid #777;
box-sizing: border-box;
width: 100%;
padding: 20rpx;
}
}
}
.address-content {
box-sizing: border-box;
border: 1px solid #ccc;
padding: 15rpx;
width: 700rpx;
.address-top {
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-top: 10rpx;
.title {
font-size: 44rpx;
color: #afc638;
font-weight: bold;
}
.close-icon {
position: absolute;
top: 50%;
right: 30rpx;
transform: translateY(-50%);
}
}
.address-detail {
.title {
color: #afc638;
margin-bottom: 20rpx;
font-size: 28rpx;
}
textarea {
border: 1px solid #afc638;
color: #afc638;
border-radius: 25rpx;
height: 150rpx;
width: 100%;
text-indent: 1em;
font-size: 28rpx;
}
}
.save{
display: flex;
align-items: center;
justify-content: center;
background: #afc638;
height: 80rpx;
margin: 20rpx auto;
border-radius: 30rpx;
color: black;
font-size: 34rpx;
}
}
</style>

+ 136
- 0
components/changeLanguage/changeLanguage.vue View File

@ -0,0 +1,136 @@
<template>
<view class="change-language">
<!-- 选择语言弹出框 -->
<u-popup :show="show" mode="bottom" @close="$emit('close');$play()" bgColor="black">
<view class="language-list">
<view v-for="item in languageList" :key="item.key" class="language" :class="{ activeLanguage : currentLanguageKey === item.key}" @click="select(item)">{{ item.name }}</view>
</view>
<view class="language-btns">
<view @click="$emit('close');$play()" class="btn">{{ $t('page.changeLanguage.cancel') }}</view>
<view @click="changeLanguage(currentLanguage)" class="btn">{{ $t('page.changeLanguage.confirm') }}</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
data(){
return {
languageList: [
{
name:'English',
key : "en"
},
{
name:'español',
key : "es"
}
],
currentLanguage : {},
currentLanguageKey : this.$i18n.locale
}
},
props : {
show : {
type : Boolean,
default : false
}
},
methods : {
//
select(item){
this.$play()
this.currentLanguage = item;
this.currentLanguageKey = item.key
},
//
changeLanguage(res){
this.$play()
//#ifdef H5
this.$router.go(0); //validate.js
//#endif
//#ifdef APP-PLUS
uni.navigateTo({
url: '/pages/home/home' //
});
//#endif
if(!res.key){
return
}
this.curLanguage = res.key;
// this.$store.commit('changeLanguage', res.key.code);
uni.setStorage({
key: 'language',
data: res.key
})
this.$i18n.locale = res.key
uni.setLocale(res.key) //this.$i18n.localeappbug
this.$emit('close')
uni.$resMessage = this.$t('message')
}
}
}
</script>
<style lang="scss" scoped>
.change-language{
.language-list{
border: 1px solid #ccc;
width: 96%;
margin: 0rpx auto 20rpx auto;
.language{
position: relative;
display: flex;
justify-content: center;
align-items: center;
color: #B0C73B;
height: 100rpx;
border-bottom: 1px solid #ccc;
font-size: 32rpx;
&:last-child{
border: none;
}
}
.activeLanguage{
&::after{
position: absolute;
top: 50%;
right: 20rpx;
content: "";
width: 30rpx;
height: 30rpx;
border-radius: 50%;
box-shadow: 0rpx 0rpx 30rpx #B0C73B;
background: #B0C73B;
transform: translateY(-50%);
}
}
}
.language-btns{
display: flex;
justify-content: space-between;
flex-wrap: wrap;
color: #ffffff80;
width: 96%;
margin: 0rpx auto 20rpx auto;
.btn{
display: flex;
align-items: center;
justify-content: center;
width: calc(50% - 15rpx);
border: 1px solid #ccc;
height: 80rpx;
}
}
}
</style>

+ 88
- 0
components/luckyAnimation/luckyAnimation.vue View File

@ -0,0 +1,88 @@
<!-- 抽奖动画 -->
<template>
<view v-if="show" class="luckyAnimation">
<div class="loader"></div>
</view>
</template>
<script>
export default {
data() {
return {
num : 1,
show : false
}
},
destroyed() {
if (this.interval) {
clearInterval(this.interval);
}
},
methods: {
start() {
this.show = true;
this.num = 1;
this.interval = setInterval(() => {
if (this.num <= 0) {
this.show = false
this.$emit('close')
clearInterval(this.interval);
}
this.num--;
}, 500)
},
}
}
</script>
<style lang="scss" scoped>
.luckyAnimation {
position: fixed;
left: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
width: 100%;
z-index: 200;
.loader {
height: 15px;
aspect-ratio: 4;
--_g: no-repeat radial-gradient(farthest-side, #aec438 90%, #0000);
background:
var(--_g) left,
var(--_g) right;
background-size: 25% 100%;
display: grid;
}
.loader:before,
.loader:after {
content: "";
height: inherit;
aspect-ratio: 1;
grid-area: 1/1;
margin: auto;
border-radius: 50%;
transform-origin: -100% 50%;
background: #fff;
animation: l49 1s infinite linear;
}
.loader:after {
transform-origin: 200% 50%;
--s: -1;
animation-delay: -.5s;
}
@keyframes l49 {
58%,
100% {
transform: rotate(calc(var(--s, 1)*1turn))
}
}
}
</style>

+ 81
- 0
components/pageInit/loading.vue View File

@ -0,0 +1,81 @@
<!-- 加载动画页面 -->
<template>
<view v-if="loading" class="loading">
<div class="loader"></div>
</view>
</template>
<script>
export default {
data() {
return {
num : 4, //2(bug,22)
interval : null
}
},
created(){
this.interval = setInterval(() => {
if(this.num <= 0){
this.num = 4;
this.$emit('close');
clearInterval(this.interval)
}
this.num--;
},1000)
},
destroyed(){
if(this.interval){
clearInterval(this.interval)
}
},
props : {
loading : {
type : Boolean,
default : true
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.loading {
display: flex;
justify-content: center;
.loader {
width: 50px;
aspect-ratio: 1;
display: grid;
}
.loader::before,
.loader::after {
content: "";
grid-area: 1/1;
--c: no-repeat radial-gradient(farthest-side, #B0C73B 92%, #0000);
background:
var(--c) 50% 0,
var(--c) 50% 100%,
var(--c) 100% 50%,
var(--c) 0 50%;
background-size: 12px 12px;
animation: l12 1s infinite;
}
.loader::before {
margin: 4px;
filter: hue-rotate(45deg);
background-size: 8px 8px;
animation-timing-function: linear
}
@keyframes l12 {
100% {
transform: rotate(.5turn)
}
}
}
</style>

+ 57
- 0
components/pageInit/pageInit.vue View File

@ -0,0 +1,57 @@
<!-- 页面初始界面 -->
<template>
<view v-show="show" class="pageInit bx">
<image src="@/static/loading/logo.png" mode="aspectFit"></image>
</view>
</template>
<script>
export default {
data() {
return {
show: true,
num: 1,
interval: null
}
},
created() {
this.interval = setInterval(() => {
if (this.num <= 0) {
this.show = false;
this.num = 1;
clearInterval(this.interval);
}
this.num--;
}, 1000)
},
destroyed() {
if (this.interval) {
clearInterval(this.interval);
}
},
methods: {
}
}
</script>
<style lang="scss" scoped>
.pageInit{
display: flex;
align-items: center;
justify-content: center;
position: fixed;
left: 50%;
top: 0;
width: 100%;
height: 100vh;
background: black;
margin: 0rpx auto;
z-index: 999;
transform: translateX(-50%);
image {
width: calc(750rpx / 2);
}
}
</style>

+ 190
- 0
components/review/review.vue View File

@ -0,0 +1,190 @@
<template>
<view v-if="show" class="review">
<view class="review-main">
<!-- 标题 -->
<view class="review-title">{{ $t('page.review.title') }}</view>
<!-- 选项列表 -->
<view class="options">
<u-radio-group v-model="checkedOption" placement="column">
<view v-for="(item,index) in evaluateList" class="option">
<view class="option-top">
<view class="option-top-left">
<u-radio :customStyle="{marginBottom: '8px'}"
activeColor="#aec438" :label="item.optionValue"
:name="item.optionValue" />
</view>
<view class="option-top-right">
<u-rate :count="5"
active-color="#EEBF72"
v-model="item.num"></u-rate>
</view>
</view>
<view class="option-content"> {{ item[type[$i18n.locale]] }}</view>
</view>
</u-radio-group>
</view>
</view>
</view>
</template>
<script>
import { play } from '@/utils/clickSound.js'
export default {
data() {
return {
checkedOption: '',
type : {
en : 'answerEnglish',
es : "answerSpanish"
},
// "A" : "This app has been with me since lstarted hiah school and continued unti!had my child, You deserve to have it.",
// "B" : "Very easy to use,l have recommendedt to my familly and friends.",
// "C" : "This APp is very suitable for beginnerso choose.",
// "D" : "This APP interface is very good.",
// "E" : "Not bad, but not good either, barelyworth usina."
// optionList: [{
// letter: 'A.',
// mark: 5,
// content: this.$t('page.review.A')
// },
// {
// letter: 'B.',
// mark: 4,
// content: this.$t('page.review.B')
// },
// {
// letter: 'C.',
// mark: 3,
// content: this.$t('page.review.C')
// },
// {
// letter: 'D.',
// mark: 2,
// content: this.$t('page.review.D')
// },
// {
// letter: 'E.',
// mark: 1,
// content: this.$t('page.review.E')
// }
// ],
evaluateList : []
}
},
props : {
show : {
type : Boolean,
default : true
},
oid : {
}
},
created(){
this.getEvaluateList()
},
methods: {
//
closeReviewProp(){
let data = {}
this.evaluateList.forEach(n => {
if(n.optionValue == this.checkedOption){
data = n
}
})
this.request('evaluate', {}, {
evaluateId : data.id,
id : this.oid,
num : data.num
}).then(res => {
if(res.code == 200){
this.$emit('close', this.checkedOption)
this.checkedOption = ''
}
})
},
getEvaluateList(){
this.request('getEvaluateList').then(res => {
if(res.code == 200){
this.evaluateList = res.result
}
})
},
async asyncLoading() { //
return new Promise((resolve, reject) => {
uni.showLoading({
title: this.$t('page.review.loading')
});
setTimeout(() => {
uni.hideLoading();
resolve()
}, 500)
})
},
},
watch : {
checkedOption : function(newVal){
if(this.checkedOption){
play()
this.asyncLoading().then(res => {
this.closeReviewProp()
})
}
}
}
}
</script>
<style lang="scss" scoped>
.review {
display: flex;
align-items: center;
justify-content: center;
position: fixed;
top: 0;
left: 0;
width: 750rpx;
height: 100vh;
margin: 0rpx auto;
z-index: 99999;
background-color: #00000099;
.review-main {
background: black;
width: 600rpx;
color: white;
border-radius: 10rpx;
padding: 15rpx;
border: 1px solid #ccc;
.review-title {
font-size: 34rpx;
padding: 15rpx 0rpx;
text-align: center;
}
.options {
margin-top: 20rpx;
.option {
margin-bottom: 15rpx;
.option-top {
display: flex;
justify-content: space-between;
}
.option-content{
color: #747474;
}
}
}
}
}
</style>

+ 72
- 0
components/serviceList/serviceList.vue View File

@ -0,0 +1,72 @@
<!-- 客服列表页面 -->
<template>
<view class="service-list">
<u-popup :show="show" mode="bottom" @close="$emit('close');$play()" bgColor="black">
<view class="list">
<view @click="toServer(item.url)" v-for="(item,index) in serverList" :key="index" class="server">{{ item.name }}</view>
</view>
<view @click="$emit('close');$play()" class="cancel">{{ $t('page.serviceList.cancel') }}</view>
</u-popup>
</view>
</template>
<script>
export default {
props : {
show : {
type : Boolean,
default : false
},
serverList : {
type : Array,
default : function(){
return []
}
}
},
methods : {
//
toServer(url){
this.$play()
window.open(url)
this.$emit('close')
}
}
}
</script>
<style lang="scss" scoped>
.service-list{
.list{
border: 1px solid #ccc;
width: 96%;
margin: 0rpx auto 20rpx auto;
.server{
position: relative;
display: flex;
justify-content: center;
align-items: center;
color: #ccc;
height: 100rpx;
border-bottom: 1px solid #ccc;
&:last-child{
border: none;
}
}
}
.cancel{
width: 96%;
margin: 0rpx auto 20rpx auto;
display: flex;
justify-content: center;
align-items: center;
color: #ffffff80;
height: 100rpx;
border: 1px solid #ccc;
}
}
</style>

+ 145
- 0
components/turntable.vue View File

@ -0,0 +1,145 @@
<template>
<u-popup :show="show"
mode="center"
bgColor="transparent"
@close="$emit('close');$play()">
<view class="box">
<view class="turntable"
:style="{transform: `rotate(${360 * rotate + link}deg)`}">
<view class="item"
:style="{transform: `translate(-50%) rotate(${(360 / 8) * index}deg)`}"
v-for="(item, index) in list">
<view>
{{ $t(`page.turntable.${item.name}`)}}
</view>
<view style="margin-top: 20rpx;">
USDT {{ item.money }}
</view>
</view>
</view>
<view class="z"
@click="start">
<view class="text">
<view style="font-size: 28rpx;font-weight: 900;">
{{ $t(`page.turntable.go`)}}
</view>
<view style="font-size: 20rpx;line-height: 30rpx;">
<!-- 剩余{{ info.bigNum }} -->
{{ $t(`page.turntable.num`, [info.bigNum])}}
</view>
</view>
</view>
</view>
</u-popup>
</template>
<script>
export default {
name:"turntable",
props : ['show', 'info'],
data() {
return {
rotate : 0,
list : [],
link : 0,
inter : null,
};
},
created() {
this.getTurntable()
},
methods : {
start(){
if(this.inter || this.info.bigNum <= 0){
return
}
this.$play()
this.request('clickTurntable').then(res => {
if(res.code == 200){
clearInterval(this.inter)
this.list.forEach((n,i) => {
if(n.id == res.result.id){
this.link = -(360 / 8 * i)
}
})
setTimeout(() => this.inter = null, 1500)
}
this.$emit('start')
}).catch(err => {
clearInterval(this.inter)
setTimeout(() => this.inter = null, 1500)
})
this.link = 0
this.rotate += 6
this.inter = setInterval(() => {
this.rotate += 1
}, 200)
},
getTurntable(){
this.request('getTurntableList').then(res => {
if(res.code == 200){
this.list = res.result
}
})
},
async asyncLoading() { //
return new Promise((resolve, reject) => {
uni.showLoading({
title: this.$t('page.turntable.loading')
});
setTimeout(() => {
uni.hideLoading();
resolve()
}, 500)
})
},
}
}
</script>
<style scoped lang="scss">
.box{
position: relative;
.turntable{
position: relative;
width: 700rpx;
height: 700rpx;
background-image: url(/static/drone/5db810a1868a7230.png);
background-size: 100% 100%;
transition: transform 1.5s;
.item{
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 50rpx;
transform-origin: 50% 300rpx;
text-align: center;
font-size: 22rpx;
width: 180rpx;
}
}
.z{
position: absolute;
top: 200rpx;
left: 260rpx;
width: 180rpx;
height: 180rpx;
// background-image: url(/static/drone/68a7230.png);
background-image: url(/static/drone/230.png);
background-size: 100% 100%;
.text{
position: absolute;
top: 90rpx;
margin-left: 10rpx;
text-align: center;
line-height: 50rpx;
width: 160rpx;
}
}
}
</style>

+ 20
- 0
index.html View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

+ 37
- 0
interceptor/interceptor.js View File

@ -0,0 +1,37 @@
let needLogin = [
// "/pages/user/user",
]
let list = [];
// let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
console.log(item, 'router list item')
uni.addInterceptor(item, {
invoke(e) { // 调用前拦截
//获取用户的token
console.log(e, 'routerjs invoke')
const token = localStorage.getItem('token')
//获取当前页面路径(即url去掉"?"和"?"后的参数)
console.log(token, 'router index token')
const url = e.url.split('?')[0]
console.log(url, 'router index url')
console.log(needLogin.includes(url))
//判断要打开的页面是否需要验证登录
if (needLogin.includes(url) && !token) {
uni.showToast({
title: '该页面需要登录才能访问,请先登录',
icon: 'none'
})
uni.navigateTo({
url: "/pages/login/login"
})
return false
}
return true
},
fail(err) { // 失败回调拦截
console.log(err);
},
})
})

+ 304
- 0
locale/en.js View File

@ -0,0 +1,304 @@
export default {
"language": "language",
"language.cancel": "cancel",
"page.login.title": "login",
"tabbar.title.1": "Home",
"tabbar.title.2": "STARTING",
"tabbar.title.3": "Order",
"nav.login": "Login",
"nav.register": "Register",
"nav.home": "Home",
"nav.order": "Orders",
"myToactTitle": "Tips",
"$": "$",
"toHome": "Back to home page",
"success-operation": "Operation successful",
"message": {
"1": "The account field cannot be left blank",
"2": "The password field cannot be left blank",
"3": "User does not exist",
"4": "Incorrect password",
"5": "Login successful",
"6": "The confirm password field cannot be left blank",
"7": "The payment password field cannot be left blank",
"8": "The verify payment password field cannot be left blank",
"9": "Passwords do not match",
"10": "Payment passwords do not match",
"11": "Invitation code error",
"12": "Registration successful",
"13": "The account has been disabled",
"14": "Query successful",
"15": "Operation successful",
"16": "Incorrect password",
"17": "Password cannot be empty",
"18": "Confirm password cannot be empty",
"19": "Passwords do not match",
"20": "Withdrawal amount cannot be empty",
"21": "Payment password cannot be empty",
"22": "Unfortunately, you did not win the lottery",
"23": "Today's lottery attempts have been exhausted",
"24": "Review successful",
"25": "Review identifier cannot be empty",
"26": "Review score cannot be empty",
"27": "Payment successful",
"28": "Insufficient balance",
"29": "Order created successfully",
"30": "User transactions have been disabled. Please contact customer service",
"31": "You have an unpaid order",
"32": "Mission complete. Contact customer service",
"33" : "Since your funds are large and exceed the withdrawal amount of ordinary users, please consider upgrading your VIP level!",
"34" : "Sign in today",
"35" : "Sign in successfully",
"36" : "The user amount is less than the vip limit amount, please recharge",
"37" : "The balance is insufficient to perform the task",
"500": "The system is busy! Please contact customer service",
"512": "The account is already registered",
"511": "The account or password is incorrect"
},
page: {
"home": {
"CustomerService": "Customer Service",
"Certifcate": "Certificate",
"Deposit": "Deposit",
"Withdraw": "Withdrawal",
"equity_item_1": "Receive a set of {0} apps data tasks",
"equity_item_2": "Profit of {0}% per application",
"equity_item_3": "Activate with a {0} USDT",
"agreement_item_1": "Terms & Conditions",
"agreement_item_2": "Event",
"agreement_item_3": "FAQ",
"agreement_item_4": "About Us"
},
"prizeDraw": {
"title_1": "Starting",
"profit": "Profit",
"title_2": "TOP APPS THIS WEEK",
"Start": "Start",
"frozen_amount": "Extra bonus",
"today_profit": "Today's Profit",
"title_3": "It will be updated daily. Only today's profits are shown here",
"title_4": "Every rating's profit will add to total assets",
"account_balance": "Account Balance",
"important_notice": "Important Notice",
"notice_item_1": "·Business Hours: 00:00:00-23:59:59",
"notice_item_2": "·For further assistance, please contact Customer Service",
"submit": "Submit",
"rating_submission": "Rating Submission",
"Total_Amount": "Total Amount",
"Creation_time": "Creation Time",
"Rating_No": "Rating No.",
"loading" : "loading..."
},
"order": {
"records": "Records",
"Submit_New": "Submit New",
"Speedip": "Speedip",
"Total_Amount": "Total Amount",
"Profit": "Profit",
"no-Order": "No Order",
"take-stroll": "Take a Stroll",
"class_1": "ALL",
"class_2": "Unpaid",
"class_3": "Paid",
"class_4": "Rated",
"pay" : "Immediate payment",
"confirm_pay" : "Do you confirm payment?",
"ok" : "Confirm",
"no" : "Cancel",
},
"center": {
"invtantion_code": "Invitation Code",
"cradibiliy_value": "Credibility Value",
"account_balance": "Account Balance",
"account_balance_info": "The system will automatically update the daily earnings:",
"wallet_amount": "Wallet Amount",
"deposit": "Deposit",
"withdraw": "Withdrawal",
"personal_info": "Personal Info",
"Transaction": "Transaction",
"wallet": "Wallet",
"language": "Language",
"customer_serivce": "Customer Service",
"logout": "Logout",
"type-address": "Type Address",
"Tips": "Tips",
"Address": "Address",
"save": "Save",
"fanList": "Fan List",
"cannotModified": "Cannot be modified",
"winningRecord": "Winning Record",
"loginRecord" : "Entry record"
},
"loginRecord" : {
"title" : "Entry record",
"Norecord" : "No record",
"login_time" : "login time",
"login_address" : "login address",
},
"purse": {
"recharge": "Recharge",
"account": "Account Amount US",
"unit": "USDT",
"deposit-now": "Deposit Now",
"security-pin": "Security PIN",
"success": "Recharge successful",
"moneyEmpty": "Please fill in the recharge amount",
"AmountThan0": "The recharge amount must be greater than 0",
"payPassEmpty": "Please fill in the payment code"
},
"withdraw": {
"title": "Withdrawal",
"account": "Account Amount US",
"unit": "USDT",
"withdraw-amount": "Withdrawal Amount",
"withdraw-descript": "Withdrawal will be transferred to cryptocurrency wallet",
"withdrawal-all": "Withdraw All",
"deposit-now": "Deposit Amount",
"pin": "Security PIN",
"submit": "Submit",
"noBalance": "Your balance is 0",
"successfulWithdrawal": "Successful withdrawal",
"insufficientBalance": "Insufficient balance",
"creditLimit": "The withdrawal amount must be greater than 0",
"payPassEmpty": "Please enter the withdrawal amount",
"warn": "Warning",
"warn-detail": "Since your funds are large and exceed the withdrawal amount of ordinary users, please consider upgrading your VIP level!",
"ok": "OK"
},
"login": {
"title": "Login",
"please-login": "Please login to access more content",
"username": "Username",
"username-placeholder": "username",
"password": "Password",
"password-placeholder": "password",
"forgot-password": "Forgot Password",
"login": "Login Now",
"register": "Register Now",
"accountEmpty": "Please fill in the account",
"passEmpty": "Please fill in the password"
},
"register": {
"title": "Register",
"please-register": "Please register to access more content",
"username": "Username",
"username-placeholder": "username",
"password": "Password",
"password-placeholder": "password",
"confirm-password": "Confirm Password",
"PaymentPassword": "Payment Password",
"PaymentPassword-placeholder": "payment password",
"confirm-PaymentPassword": "Confirm Payment Password",
"invitation-code": "Invitation Code",
"forgot-password": "Forgot Password",
"register": "Register Now",
"login": "Login Now",
"agreen": "Agree to",
"agreement": "《User Registration Agreement》",
"accountEmpty": "Please fill in the account",
"passEmpty": "Please fill in the password",
"okPassEmpty": "Please fill in the password again",
"passInconsistency": "Password inconsistency",
"payPassEmpty": "Please fill in the payment code",
"okPayPassEmpty": "Please fill in the payment password again",
"payPassInconsistency": "The payment password is inconsistent",
"tickProtocol": "Please tick the agreement"
},
"persionalInfo": {
"title": "Personal Info",
"profle-image": "Profile Image",
"username": "Username",
"change-pin": "Change Security PIN",
"change-password": "Change Login Password"
},
"changeLanguage": {
"cancel": "Cancel",
"confirm": "Confirm"
},
"runningWater": {
"title": "Transaction History"
},
"serviceList": {
"cancel": "Cancel"
},
"instructions": {
"tcTitle": "T&C",
"eventTitle": "Event",
"faqTitle": "FAQs",
"aboutTtitle": "About Us",
"certificate": "Certificate",
"agreementTitle": "Agreement",
"agreement": `<view>Welcome to Blueprint!</view><br/><br/><view>To protect the security of the site and the items created by the user 'Services and Items', you should review the 'Services and Items License' section thoroughly before creating an account. Pay particular attention to the terms of service, limitations, and any other relevant terms. You must individually assess and accept or reject each term and condition.</view><br/><br/><view>If you are 18 years of age or older, becoming a user of the website implies that you have read and agreed to the agreement and related terms and conditions. Otherwise, you do not have the right to download and install the software or access the services.</view><br/><br/><view>(I) Protection of Users' Personal Information</view><br/><br/><view>1.(1) The fundamental principle of this website is to protect users' and creators' personal information. All information is professionally encrypted to ensure user safety. In case of any unauthorized disclosure of information, the website reserves the right to take legal action.</view><br/><br/><view>1.(2) Users are required to provide certain necessary information during the registration process, including their mobile phone number, and
agree to abide by the relevant terms and conditions. Insufficient information provided by the user may result in denial of access.</view><br/><br/><view>1.(3) Under normal circumstances, users can modify submitted data at any time. However, personal information cannot be changed after registration.</view><br/><br/><view>1.(4) Teoco employs various security processes and technologies, as well as a comprehensive management system, to protect users' personal information and prevent any unauthorized use or misuse. Any violations will result in legal action.</view><br/><br/><view>1.(5) App Radar will not disclose user information to any companies or organizations other than App Radar without the user's consent under any circumstances.</view><br/><br/><view>1.(6) Individuals under the age of 18 require written consent from a parent or legal guardian before accessing the services on this website.</view><br/><br/><view>(B) User Responsibilities</view><br/><br/><view>2.(1) Users must fulfill a set of tasks before they can request withdrawals.</view><br/><br/><view>2.(2) Users are not permitted to request withdrawals while tasks are pending optimization.</view><br/><br/><view>2.(3) Users cannot cancel or skip
tasks once initiated.</view><br/><br/><view>2.(4) Withdrawals exceeding 200,000,000 VND in the user's account require a 20% fee, which will be refunded immediately after the withdrawal is processed.</view><br/><br/><view>(C) Terms and Conditions</view><br/><br/><view>3.(1) Agreement: The User Satisfaction Agreement and Terms of Service are governed by the terms and conditions outlined on the user's account. Users must provide relevant information and documents as requested on the site, and they are bound by the terms of the contract.</view><br/><br/><view>3.(2) This website provides services to all users in accordance with the terms and conditions. For any important questions or requests, please contact the appropriate department for assistance.</view>`
},
"modifyUser": {
"editPinTitle": "Change Security PIN",
"editPasswordTitle": "Change Login Password",
"oldPassword": "Old Password",
"oldPasswordPlaceholder": "Type old Password",
"newPassword": "New Password",
"newPasswordPlaceholder": "Type new Password",
"confirmNewPassword": "Confirm New Password",
"confirm": "Confirm",
"pinTips": "If you forgot the old Security PIN, please contact customer service to retrieve it.",
"passwordTips": "If you forgot the old password, please contact customer service to retrieve it.",
"oldPasswordToast": "The old password cannot be empty",
"newPasswordToast": "The new password cannot be empty",
"confirmNewPasswordToast": "Confirm that the password cannot be empty",
"notPasswordToast": "The passwords do not match"
},
"review": {
"title": "PLEASE SELECT",
"loading" : "loading..."
},
"invitationList": {
"title": "Fan List",
"noFans": "Have no fans"
},
"turntable": {
"1": "Thank you for your patronage",
"2": "First Prize",
"3": "Second Prize",
"4": "Third Prize",
"5": "Fourth Prize",
"6": "Fifth Prize",
"7": "Sixth Prize",
"8": "Seventh Prize",
"num": "Remaining {0} times",
"go": "Go",
"loading" : "loading..."
},
"winningRecord": {
"title": "Winning Record",
"1": "Thank you for your patronage",
"2": "First Prize",
"3": "Second Prize",
"4": "Third Prize",
"5": "Fourth Prize",
"6": "Fifth Prize",
"7": "Sixth Prize",
"8": "Seventh Prize",
"money": "Money",
"noPrizesHaveBeenWon": "No prizes have been won"
},
"signIn" : {
"title" : "arcsky",
"sign" : "{0} days in a row this month",
"SignSuccessfully" : "Sign in successfully",
"0" : "January ",
"1" : "February ",
"2" : "March ",
"3" : "April ",
"4" : "May",
"5" : "June ",
"6" : "July ",
"7" : "August ",
"8" : "September ",
"9" : "October ",
"10" : "November ",
"11" : "December ",
"day" : "Day {0}"
}
}
}

+ 268
- 0
locale/en不知道什么的英语.js View File

@ -0,0 +1,268 @@
export default {
"language": "language",
"language.cancel": "cancel",
"page.login.title": "login",
"tabbar.title.1": "Home",
"tabbar.title.2": "STARTING",
"tabbar.title.3": "Order",
"nav.login": "Login",
"nav.register": "Register",
"nav.home": "Home",
"nav.order": "Orders",
"myToactTitle": "Tips",
"$": "$",
"toHome": "Back to home page",
"success-operation": "Successful operation",
"message": {
"1": "The account cannot be empty",
"2": "The password cannot be empty",
"3": "User does not exist",
"4": "Password error",
"5": "Login successful",
"6": "Confirm that the password cannot be empty",
"7": "The payment password cannot be empty",
"8": "Verify that the payment password cannot be empty",
"9": "Password inconsistency",
"10": "The payment password is inconsistent",
"11": "Invitation code error",
"12": "Registered successfully",
"13": "The account has been disabled",
"14": "Query successful",
"15": "Operation successful",
"16": "Incorrect password",
"17": "Password cannot be empty",
"18": "Confirm password cannot be empty",
"19": "Passwords do not match",
"20": "Withdrawal amount cannot be empty",
"21": "Payment password cannot be empty",
"22": "Unfortunately, you did not win the lottery",
"23": "Today's lottery attempts have been used up",
"24": "Review successful",
"25": "Review identifier cannot be empty",
"26": "Review score cannot be empty",
"27": "Payment successful",
"28": "Insufficient balance",
"29": "Order created successfully",
"30": "User transactions have been disabled. Please contact customer service",
"31": "You have an order unpaid",
"32" : "Mission complete. Contact customer service",
"500": "The system is busy! Please contact customer service",
"512": "The account was also registered",
"511": "The account or password is incorrect"
},
"page": {
"home": {
"CustomerService": "CustomerService",
"Certifcate": "Certifcate",
"Deposit": "Deposit",
"Withdraw": "Withdraw",
"equity_item_1": "Receive a set of {0} apps data tasks",
"equity_item_2": "Proft of {0}% per application",
"equity_item_3": "Activate with a {0} USDT",
"agreement_item_1": "T&C",
"agreement_item_2": "Event",
"agreement_item_3": "FAQ",
"agreement_item_4": "About us"
},
"prizeDraw": {
"title_1": "Starting",
"profit": "profit",
"title_2": "TOP APPS THIS WEEK",
"Start": "Start",
"frozen_amount": "Frozen Amount",
"today_profit": "Today profit",
"title_3": "It will be updated daily. Only today profits are shown here",
"title_4": "Every rating's profit will. add to total assets",
"account_balance": "Account Balance",
"important_notice": "Important Notice",
"notice_item_1": "·Business Hours:00:00:00-23:59:59",
"notice_item_2": "·For further assistance, please contact Customer Service",
"submit": "Submit",
"rating_submission": "Rating Submission",
"Total_Amount": "Total Amount",
"Creation_time": "Creation time",
"Rating_No": "Rating No"
},
"order": {
"records": "Records",
"Submit_New": "Submit new",
"Speedip": "Speedip",
"Total_Amount": "Total Amount",
"Profit": "Profit",
"no-Order": "No Order",
"take-stroll": "Take Stroll",
"class_1" : "ALL",
"class_2" : "No-pay",
"class_3" : "Have-pay",
"class_4" : "Rated",
},
"center": {
"invtantion_code": "Invitation code",
"cradibiliy_value": "cradibiliy Value",
"account_balance": "Account Balance",
"account_balance_info": "The system will automatic update the daily earnings:",
"wallet_amount": "Wallet Amount",
"deposit": "Deposit",
"withdraw": "Withdraw",
"personal_info": "Personal info",
"Transaction": "transaction",
"wallet": "Wallet",
"language": "Language",
"customer_serivce": "Customer Serivce",
"logout": "Logout",
"type-address": "Type Address",
"Tips": "Tips",
"Address": "Address",
"save": "save",
"fanList": "Fan list",
"cannotModified": "Cannot be modified",
"winningRecord" : "Winning record"
},
"purse": {
"recharge": "recharge",
"account": "Account AmountUS",
"unit": "USDT",
"deposit-now": "Deposit Now",
"security-pin": "Security PIN",
"success": "recharge successfully",
"moneyEmpty": "Please fill in the recharge amount",
"AmountThan0": "The recharge amount must be greater than 0",
"payPassEmpty": "Please fill in the payment code"
},
"withdraw": {
"title": "withdraw",
"account": "Account AmountUS",
"unit": "USDT",
"withdraw-amount": "Withdraw Amount",
"withdraw-descript": "Withdraw will be transferred to cryptocurrency wallet",
"withdrawal-all": "Withdrawal All",
"deposit-now": "Deposit Amount",
"pin": "Security PIN",
"submit": "Submit",
"noBalance": "Your balance is 0",
"successfulWithdrawal": "Successful withdrawal",
"insufficientBalance": "Insufficient balance",
"creditLimit": "The withdrawal amount must be greater than 0",
"payPassEmpty": "Please enter the withdrawal amount",
"warn": "warn",
"warn-detail": "Since your funds are large and exceed the withdrawal amount of ordinary users, please consider upgrading your VIP level!",
"ok": "OK"
},
"login": {
"title": "Login",
"please-login": "Please login to access more content",
"username": "Username",
"username-placeholder": "username",
"password": "Password",
"password-placeholder": "password",
"forgot-password": "Forgot Password",
"login": "Login Now",
"register": "Register Now",
"accountEmpty": "Please fill in the account",
"passEmpty": "Please fill in the password"
},
"register": {
"title": "Register",
"please-register": "Please register to access more content",
"username": "Username",
"username-placeholder": "username",
"password": "Password",
"password-placeholder": "password",
"confirm-password": "confirm password",
"PaymentPassword": "Payment Password",
"PaymentPassword-placeholder": "payment password",
"confirm-PaymentPassword": "confirm Payment Password",
"invitation-code": "invitationCode",
"forgot-password": "Forgot Password",
"register": "Register Now",
"login": "Login Now",
"agreen": "Agree with",
"agreement": "《User Registration Agreement》",
"accountEmpty": "Please fill in the account",
"passEmpty": "Please fill in the password",
"okPassEmpty": "Please fill in the password again",
"passInconsistency": "Password inconsistency",
"payPassEmpty": "Please fill in the payment code",
"okPayPassEmpty": "Please fill in the payment password again",
"payPassInconsistency": "The payment password is inconsistent",
"tickProtocol": "Please tick Protocol"
},
"persionalInfo": {
"title": "Personal lnfo",
"profle-image": "Profle lmage",
"username": "Username",
"change-pin": "Change Security PlN",
"change-password": "Change Login Password"
},
"changeLanguage": {
"cancel": "Cancel",
"confirm": "Confirm"
},
"runningWater": {
"title": "Running water"
},
"serviceList": {
"cancel": "Cancel"
},
"instructions": {
"tcTitle": "T&C",
"eventTitle": "Event",
"faqTitle": "FAQS",
"aboutTtitle": "About Us",
"certificate": "certificate",
"agreementTitle": "Agreement",
"agreement":
`<view>Welcome to Blueprint!</view><br/><br/><view>To protect the security of the site and the items created by the user 'Services and Items', you should review the 'Services and Items License' section thoroughly before creating an account. Pay particular attention to the terms of service, limitations, and any other relevant terms. You must individually assess and accept or reject each term and condition.</view><br/><br/><view>If you are 18 years of age or older, becoming a user of the website implies that you have read and agreed to the agreement and related terms and conditions. Otherwise, you do not have the right to download and install the software or access the services.</view><br/><br/><view>(I) Protection of Users' Personal Information</view><br/><br/><view>1.(1) The fundamental principle of this website is to protect users' and creators' personal information. All information is professionally encrypted to ensure user safety. In case of any unauthorized disclosure of information, the website reserves the right to take legal action.</view><br/><br/><view>1.(2) Users are required to provide certain necessary information during the registration process, including their mobile phone number, and
agree to abide by the relevant terms and conditions. Insufficient information provided by the user may result in denial of access.</view><br/><br/><view>1.(3) Under normal circumstances, users can modify submitted data at any time. However, personal information cannot be changed after registration.</view><br/><br/><view>1.(4) Teoco employs various security processes and technologies, as well as a comprehensive management system, to protect users' personal information and prevent any unauthorized use or misuse. Any violations will result in legal action.</view><br/><br/><view>1.(5) App Radar will not disclose user information to any companies or organizations other than App Radar without the user's consent under any circumstances.</view><br/><br/><view>1.(6) Individuals under the age of 18 require written consent from a parent or legal guardian before accessing the services on this website.</view><br/><br/><view>(B) User Responsibilities</view><br/><br/><view>2.(1) Users must fulfill a set of tasks before they can request withdrawals.</view><br/><br/><view>2.(2) Users are not permitted to request withdrawals while tasks are pending optimization.</view><br/><br/><view>2.(3) Users cannot cancel or skip
tasks once initiated.</view><br/><br/><view>2.(4) Withdrawals exceeding 200,000,000 VND in the user's account require a 20% fee, which will be refunded immediately after the withdrawal is processed.</view><br/><br/><view>(C) Terms and Conditions</view><br/><br/><view>3.(1) Agreement: The User Satisfaction Agreement and Terms of Service are governed by the terms and conditions outlined on the user's account. Users must provide relevant information and documents as requested on the site, and they are bound by the terms of the contract.</view><br/><br/><view>3.(2) This website provides services to all users in accordance with the terms and conditions. For any important questions or requests, please contact the appropriate department for assistance.</view>`
},
"modifyUser": {
"editPinTitle": "Change Security PIN",
"editPasswordTitle": "Change Login Password",
"oldPassword": "Old Password",
"oldPasswordPlaceholder": "Type old Password",
"newPassword": "New Password",
"newPasswordPlaceholder": "Type new Password",
"confirmNewPassword": "Confirm New Password",
"confirm": "Confirm",
"pinTips": "Forgot the old Security PIN,please contact customer service to retrieve it.",
"passwordTips": "Forget the old password, please contact customer service retrieve it.",
"oldPasswordToast": "The old password cannot be empty",
"newPasswordToast": "The new password cannot be empty",
"confirmNewPasswordToast": "Confirm that the password cannot be empty",
"notPasswordToast": "Confirm that the passwords are inconsistent"
},
"review": {
"title": "PLEASE SELECT"
},
"invitationList": {
"title": "Fan list",
"noFans": "Have no fans"
},
"turntable": {
"1": "Thank you for your patronage",
"2": "First Prize",
"3": "Second Prize",
"4": "Third Prize",
"5": "Fourth Prize",
"6": "Fifth Prize",
"7": "Sixth Prize",
"8": "Seventh Prize",
"num" : "Remaining {0} times",
"go" : "Go"
},
"winningRecord" : {
"title" : "Winning record",
"1": "Thank you for your patronage",
"2": "First Prize",
"3": "Second Prize",
"4": "Third Prize",
"5": "Fourth Prize",
"6": "Fifth Prize",
"7": "Sixth Prize",
"8": "Seventh Prize",
"money" : "money",
"noPrizesHaveBeenWon" : "No prizes have been won"
},
}
}

+ 320
- 0
locale/es.js View File

@ -0,0 +1,320 @@
export default {
"language": "idioma",
"language.cancel": "cancelar",
"page.login.title": "iniciar sesión",
"tabbar.title.1": "Inicio",
"tabbar.title.2": "COMIENZO",
"tabbar.title.3": "Orden",
"nav.login": "Iniciar sesión",
"nav.register": "Registrar",
"nav.home": "Inicio",
"nav.order": "Ordenes",
"myToactTitle": "Consejos",
"$": "$",
"toHome": "Volver a la página de inicio",
"success-operation": "Operación exitosa",
"message": {
"1": "La cuenta no puede estar vacía",
"2": "La contraseña no puede estar vacía",
"3": "El usuario no existe",
"4": "Error de contraseña",
"5": "Inicio de sesión exitoso",
"6": "Confirmar que la contraseña no puede estar vacía",
"7": "La contraseña de pago no puede estar vacía",
"8": "Verificar que la contraseña de pago no puede estar vacía",
"9": "Incoherencia de contraseña",
"10": "La contraseña de pago es inconsistente",
"11": "Error de código de invitación",
"12": "Registrado exitosamente",
"13": "La cuenta ha sido deshabilitada",
"14": "Consulta exitosa",
"15": "Operación exitosa",
"16": "Contraseña incorrecta",
"17": "La contraseña no puede estar vacía",
"18": "Confirmar contraseña no puede estar vacía",
"19": "Las contraseñas no coinciden",
"20": "El monto de retirada no puede estar vacío",
"21": "La contraseña de pago no puede estar vacía",
"22": "Lamentablemente, no ganaste la lotería",
"23": "Los intentos de lotería de hoy se han agotado",
"24": "Revisión exitosa",
"25": "El identificador de revisión no puede estar vacío",
"26": "La puntuación de la revisión no puede estar vacía",
"27": "Pago exitoso",
"28": "Saldo insuficiente",
"29": "Orden creada exitosamente",
"30": "Las transacciones de usuario han sido deshabilitadas. Por favor, contacte el servicio de atención al cliente",
"31": "Tiene una orden sin pagar",
"32": "Misión completa. Contacte el servicio de atención al cliente",
"33": "¡Debido a sus grandes fondos, superando el monto de retiro de los usuarios comunes, ¡ considere actualizar su nivel vip!",
"34": "Se ha firmado hoy",
"35": "Registro exitoso",
"36": "El importe del usuario es menor que el límite vip, por favor recargue",
"37": "Balance insuficiente para llevar a cabo la misión",
"500": "¡El sistema está ocupado! Por favor, contacte el servicio de atención al cliente",
"512": "La cuenta también fue registrada",
"511": "La cuenta o la contraseña son incorrectas"
},
"page": {
"home": {
"CustomerService": "Servicio al Cliente",
"Certifcate": "Certificado",
"Deposit": "Depósito",
"Withdraw": "Retiro",
"equity_item_1": "Recibe un conjunto de tareas de datos de {0} aplicaciones",
"equity_item_2": "Ganancia del {0}% por aplicación",
"equity_item_3": "Activa con {0} USDT",
"agreement_item_1": "T&C",
"agreement_item_2": "Evento",
"agreement_item_3": "FAQ",
"agreement_item_4": "Acerca de nosotros"
},
"prizeDraw": {
"title_1": "Comienzo",
"profit": "ganancias",
"title_2": "LAS APLICACIONES MÁS POPULARES DE ESTA SEMANA",
"Start": "Inicio",
"frozen_amount": "Un bonus extra",
"today_profit": "Ganancias de hoy",
"title_3": "Se actualizará diariamente. Sólo se muestran las ganancias de hoy aquí",
"title_4": "Las ganancias de cada calificación se sumarán a los activos totales",
"account_balance": "Saldo de la cuenta",
"important_notice": "Aviso Importante",
"notice_item_1": "·Horario Comercial: 00:00:00-23:59:59",
"notice_item_2": "·Para mayor asistencia, por favor contacte Servicio al Cliente",
"submit": "Enviar",
"rating_submission": "Envío de Calificación",
"Total_Amount": "Cantidad Total",
"Creation_time": "Tiempo de creación",
"Rating_No": "Número de Calificación",
"loading": "carga..."
},
"order": {
"records": "Registros",
"Submit_New": "Enviar nuevo",
"Speedip": "Speedip",
"Total_Amount": "Cantidad Total",
"Profit": "Ganancias",
"no-Order": "Sin Orden",
"take-stroll": "Paseo",
"class_1": "TODOS",
"class_2": "No-pago",
"class_3": "Pagado",
"class_4": "Calificado",
"pay": "pago inmediato",
"confirm_pay": "¿Confirma el pago?",
"ok": "confirmar",
"no": "cancelar",
},
"center": {
"invtantion_code": "Código de invitación",
"cradibiliy_value": "Valor de credibilidad",
"account_balance": "Saldo de cuenta",
"account_balance_info": "El sistema actualizará automáticamente las ganancias diarias:",
"wallet_amount": "Cantidad en la billetera",
"deposit": "Depósito",
"withdraw": "Retiro",
"personal_info": "Información personal",
"Transaction": "Transacción",
"wallet": "Billetera",
"language": "Idioma",
"customer_serivce": "Servicio al Cliente",
"logout": "Salir",
"type-address": "Escriba la dirección",
"Tips": "Consejos",
"Address": "Dirección",
"save": "guardar",
"fanList": "Lista de fans",
"cannotModified": "No puede ser modificado",
"winningRecord": "Registro de ganancias",
"loginRecord" : "Registro de entrada"
},
"loginRecord" : {
"title" : "Registro de entrada",
"Norecord" : "No hay registro",
"login_time" : "Tiempo de inicio de sesión",
"login_address" : "Dirección de inicio de sesión",
},
"purse": {
"recharge": "recarga",
"account": "Cantidad en cuenta US",
"unit": "USDT",
"deposit-now": "Deposita ahora",
"security-pin": "PIN de seguridad",
"success": "recarga exitosa",
"moneyEmpty": "Por favor, ingresa la cantidad de recarga",
"AmountThan0": "La cantidad de recarga debe ser mayor a 0",
"payPassEmpty": "Por favor, ingresa el código de pago"
},
"withdraw": {
"title": "Retiro",
"account": "Cantidad en cuenta US",
"unit": "USDT",
"withdraw-amount": "Cantidad de retiro",
"withdraw-descript": "El retiro será transferido a la billetera de criptomonedas",
"withdrawal-all": "Retirar todo",
"deposit-now": "Cantidad de depósito",
"pin": "PIN de seguridad",
"submit": "Enviar",
"noBalance": "Su saldo es 0",
"successfulWithdrawal": "Retiro exitoso",
"insufficientBalance": "Saldo insuficiente",
"creditLimit": "La cantidad de retiro debe ser mayor que 0",
"payPassEmpty": "Por favor, ingrese la cantidad de retiro",
"warn": "Advertencia",
"warn-detail": "Debido a que sus fondos son grandes y exceden la cantidad de retiro de usuarios comunes, ¡considere actualizar su nivel VIP!",
"ok": "OK"
},
"login": {
"title": "Inicio de sesión",
"please-login": "Por favor, inicie sesión para acceder a más contenido",
"username": "Nombre de usuario",
"username-placeholder": "nombre de usuario",
"password": "Contraseña",
"password-placeholder": "contraseña",
"forgot-password": "Olvidé mi contraseña",
"login": "Iniciar sesión ahora",
"register": "Registrarse ahora",
"accountEmpty": "Por favor, complete la cuenta",
"passEmpty": "Por favor, ingrese la contraseña"
},
"register": {
"title": "Registrar",
"please-register": "Por favor, registrese para acceder a más contenido",
"username": "Nombre de usuario",
"username-placeholder": "nombre de usuario",
"password": "Contraseña",
"password-placeholder": "contraseña",
"confirm-password": "confirmar contraseña",
"PaymentPassword": "Contraseña de pago",
"PaymentPassword-placeholder": "contraseña de pago",
"confirm-PaymentPassword": "confirmar contraseña de pago",
"invitation-code": "código de invitación",
"forgot-password": "Olvidé mi contraseña",
"register": "Registrarse ahora",
"login": "Iniciar sesión ahora",
"agreen": "Estoy de acuerdo con",
"agreement": "《Acuerdo de registro de usuario》",
"accountEmpty": "Por favor, complete la cuenta",
"passEmpty": "Por favor, ingrese la contraseña",
"okPassEmpty": "Por favor, ingrese la contraseña nuevamente",
"passInconsistency": "Inconsistencia en la contraseña",
"payPassEmpty": "Por favor, ingrese el código de pago",
"okPayPassEmpty": "Por favor, ingrese la contraseña de pago nuevamente",
"payPassInconsistency": "La contraseña de pago es inconsistente",
"tickProtocol": "Por favor, marque el protocolo"
},
"persionalInfo": {
"title": "Información Personal",
"profle-image": "Imagen de Perfil",
"username": "Nombre de Usuario",
"change-pin": "Cambiar PIN de Seguridad",
"change-password": "Cambiar Contraseña de Inicio de Sesión"
},
"changeLanguage": {
"cancel": "Cancelar",
"confirm": "Confirmar"
},
"runningWater": {
"title": "Agua Corriente"
},
"serviceList": {
"cancel": "Cancelar"
},
"instructions": {
"tcTitle": "T&C",
"eventTitle": "Evento",
"faqTitle": "FAQs",
"aboutTtitle": "Acerca de Nosotros",
"certificate": "certificado",
"agreementTitle": "Acuerdo",
"agreement": `
<view>¡Bienvenido a Blueprint!</view><br/><br/>
<view>Para proteger la seguridad del sitio y los elementos creados por el usuario "Servicios y Elementos", debe revisar detenidamente la sección "Licencia de Servicios y Elementos" antes de crear una cuenta. Preste especial atención a los términos de servicio, limitaciones y cualquier otro término relevante. Debe evaluar individualmente y aceptar o rechazar cada término y condición.</view><br/><br/>
<view>Si tiene 18 años o más, al ser usuario del sitio web, implica que ha leído y aceptado el acuerdo y los términos y condiciones relacionados. De lo contrario, no tiene derecho a descargar e instalar el software o acceder a los servicios.</view><br/><br/>
<view>(I) Protección de la Información Personal de los Usuarios</view><br/><br/>
<view>1.(1) El principio fundamental de este sitio web es proteger la información personal de los usuarios y creadores. Toda la información está encriptada profesionalmente para garantizar la seguridad del usuario. En caso de cualquier divulgación no autorizada de información, el sitio web se reserva el derecho de tomar medidas legales.</view><br/><br/>
<view>1.(2) Los usuarios deben proporcionar cierta información necesaria durante el proceso de registro, incluido su número de teléfono móvil, y aceptar cumplir con los términos y condiciones relevantes. La información insuficiente proporcionada por el usuario puede resultar en la denegación de acceso.</view><br/><br/>
<view>1.(3) En circunstancias normales, los usuarios pueden modificar los datos enviados en cualquier momento. Sin embargo, la información personal no puede ser cambiada después del registro.</view><br/><br/>
<view>1.(4) Teoco emplea diversos procesos y tecnologías de seguridad, así como un sistema de gestión integral, para proteger la información personal de los usuarios y prevenir cualquier uso no autorizado o mal uso. Cualquier violación dará lugar a acciones legales.</view><br/><br/>
<view>1.(5) App Radar no divulgará la información del usuario a ninguna otra empresa u organización distinta de App Radar sin el consentimiento del usuario bajo ninguna circunstancia.</view><br/><br/>
<view>1.(6) Las personas menores de 18 años requieren el consentimiento por escrito de un padre o tutor legal antes de acceder a los servicios de este sitio web.</view><br/><br/>
<view>(B) Responsabilidades del usuario</view><br/><br/>
<view>2.(1) Los usuarios deben cumplir con un conjunto de tareas antes de poder solicitar retiros.</view><br/><br/>
<view>2.(2) Los usuarios no pueden solicitar retiros mientras las tareas están pendientes de optimización.</view><br/><br/>
<view>2.(3) Los usuarios no pueden cancelar o saltarse tareas una vez iniciadas.</view><br/><br/>
<view>2.(4) Los retiros que exceden los 200.000.000 VND en la cuenta del usuario requieren una tarifa del 20%, que se reembolsará inmediatamente después de que se procese el retiro.</view><br/><br/>
<view>(C) Términos y condiciones</view><br/><br/><view>3.(1) Acuerdo: El Acuerdo de Satisfacción del Usuario y los Términos de Servicio se rigen por los términos y condiciones descritos en la cuenta del usuario. Los usuarios deben proporcionar la información y los documentos relevantes según lo solicitado en el sitio, y están obligados por los términos del contrato.</view><br/><br/>
<view>3.(2) Este sitio web proporciona servicios a todos los usuarios de acuerdo con los términos y condiciones. Para cualquier pregunta o solicitud importante, por favor, póngase en contacto con el departamento correspondiente para obtener ayuda.</view>
`
},
"modifyUser": {
"editPinTitle": "Cambiar PIN de seguridad",
"editPasswordTitle": "Cambiar contraseña de inicio de sesión",
"oldPassword": "Contraseña antigua",
"oldPasswordPlaceholder": "Escribe la contraseña antigua",
"newPassword": "Nueva contraseña",
"newPasswordPlaceholder": "Escribe la nueva contraseña",
"confirmNewPassword": "Confirmar nueva contraseña",
"confirm": "Confirmar",
"pinTips": "Si has olvidado el antiguo PIN de seguridad, ponte en contacto con el servicio de atención al cliente para recuperarlo.",
"passwordTips": "Si has olvidado la antigua contraseña, ponte en contacto con el servicio de atención al cliente para recuperarla.",
"oldPasswordToast": "La antigua contraseña no puede estar vacía",
"newPasswordToast": "La nueva contraseña no puede estar vacía",
"confirmNewPasswordToast": "La confirmación de la contraseña no puede estar vacía",
"notPasswordToast": "La confirmación de las contraseñas no coincide"
},
"review": {
"title": "POR FAVOR, SELECCIONA",
"loading": "carga..."
},
"invitationList": {
"title": "Lista de fans",
"noFans": "No tienes fans"
},
"turntable": {
"1": "Gracias por tu patrocinio",
"2": "Primer premio",
"3": "Segundo premio",
"4": "Tercer premio",
"5": "Cuarto premio",
"6": "Quinto premio",
"7": "Sexto premio",
"8": "Séptimo premio",
"num": "Quedan {0} intentos",
"go": "Ir",
"loading": "carga..."
},
"winningRecord": {
"title": "Registro de premios",
"1": "Gracias por tu patrocinio",
"2": "Primer premio",
"3": "Segundo premio",
"4": "Tercer premio",
"5": "Cuarto premio",
"6": "Quinto premio",
"7": "Sexto premio",
"8": "Séptimo premio",
"money": "dinero",
"noPrizesHaveBeenWon": "No se han ganado premios"
},
"signIn": {
"title": "arcsky",
"sign": "{0} días consecutivos de fichajes este mes",
"SignSuccessfully" : "Registro exitoso",
"0": "Enero ",
"1": "Febrero ",
"2": "Marzo ",
"3": "Abril ",
"4": "Mayo ",
"5": "Junio ",
"6": "Julio",
"7": "Agosto",
"8": "Septiembre ",
"9": "Octubre ",
"10": "Noviembre ",
"11": "Diciembre ",
"day" : "el {0} día"
}
}
}

+ 20
- 0
locale/index.js View File

@ -0,0 +1,20 @@
import en from './en.js'//英语语言包
import es from './es.js'//西班牙语言包
import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const lang = uni.getStorageSync('language') || 'en';//获取缓存中的语言
// const lang = 'en';
// VueI18n构造函数所需要的配置
const i18nConfig = {
locale: lang,//当前语言
// 所需要用的语言包
messages:{
en,
es
}
}
const i18n = new VueI18n(i18nConfig)
export default i18n

+ 56
- 0
main.js View File

@ -0,0 +1,56 @@
import App from './App'
// #ifndef VUE3
import i18n from './locale/index.js'
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
import request from './utils/request'
Vue.prototype.$api = 'http://124.71.12.219:8085/'
Vue.prototype.request = request
import store from './store/index.js'
import uView from '@/uni_modules/uview-ui'
Vue.use(uView)
import './plugin'
import 'interceptor/interceptor.js'
//后端返回数据格式过滤
window.parseList = function(data) {
if (!data) {
return [];
} else if (data.length || data.length == 0) {
return data
} else {
return [data]
}
}
const app = new Vue({
...App,
i18n,
store,
})
app.$mount()
// #endif
// #ifdef VUE3
import {
createSSRApp
} from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif

+ 89
- 0
manifest.json View File

@ -0,0 +1,89 @@
{
"name" : "drone-shop",
"appid" : "__UNI__3E7CFD4",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
"h5" : {
"devServer" : {
"https" : false,
"proxy" : {
"/api" : {
"target" : "http://admin.shop996.top/shop_demo/",
"ws" : true,
"pathRewrite" : {
"^/api" : "/api"
}
}
}
},
"sdkConfigs" : {
"maps" : {}
}
},
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios" : {},
/* SDK */
"sdkConfigs" : {}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2"
}

+ 19
- 0
package.json View File

@ -0,0 +1,19 @@
{
"name": "mobile-shop-uniapp",
"version": "1.0.0",
"description": "{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://gitee.com/huliyong/mobile-shop-uniapp.git"
},
"author": "",
"license": "ISC",
"dependencies": {
"dayjs": "^1.11.12",
"vuex": "^3.6.2"
}
}

+ 134
- 0
pages.json View File

@ -0,0 +1,134 @@
{
"easycom": {
"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
},
"pages": [ //pageshttps://uniapp.dcloud.io/collocation/pages
{
"path": "pages/home/home",
"style": {
"navigationBarTitleText": ""
}
},
{
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/register/register",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/order/order",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/login/contactCustomerService",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/purse/purse",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/withdraw/withdraw",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/personalInfo/personalInfo",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/runningWater/runningWater",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/certificate/certificate",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/instructions/instructions",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path": "pages/modifyUser/modifyUser",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
},
{
"path" : "pages/prizeDraw/prizeDraw",
"style" :
{
"navigationBarTitleText" : ""
}
},
{
"path" : "pages/invitationList/invitationList",
"style" :
{
"navigationBarTitleText" : ""
}
},
{
"path" : "pages/winningRecord/winningRecord",
"style" :
{
"navigationBarTitleText" : ""
}
},
{
"path" : "pages/signIn/signIn",
"style" :
{
"navigationBarTitleText" : ""
}
},
{
"path" : "pages/loginRecord/loginRecord",
"style" :
{
"navigationBarTitleText" : ""
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8",
"navigationStyle": "custom",
"rpxCalcMaxDeviceWidth": 960
},
"uniIdRouter": {}
}

+ 58
- 0
pages/certificate/certificate.vue View File

@ -0,0 +1,58 @@
<!-- 证书页面 -->
<template>
<view class="certificate bx">
<navbar :leftClick="leftClick" :title="$t('page.certificate.title')"></navbar>
<!-- 证书图片 -->
<view class="certificate-image">
<image src="@/static/certificate/certificate.png" mode="aspectFit"></image>
</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components : { navbar },
data(){
return {
}
},
created(){
},
methods : {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
}
}
}
</script>
<style lang="scss" scoped>
.certificate{
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
.certificate-image{
width: 96%;
margin: 0rpx auto;
padding-top: 30rpx;
image{
width: 100%;
height: 50vh;
background-size: 100% !important;
}
}
}
</style>

+ 446
- 0
pages/home/home.vue View File

@ -0,0 +1,446 @@
<!-- 首页 -->
<template>
<view class="home bx">
<!-- 首页顶部 -->
<view class="home-top content">
<view class="menu-icon" @click="centerShow = true;$play()">
<image src="@/static/home/menu.png" mode="aspectFit"></image>
</view>
<view class="logo">
<image src="../../static/home/logo.png" mode="widthFix"></image>
</view>
<view class="sign">
<image @click="toSignin" src="../../static/home/sign.png" mode="widthFix"></image>
</view>
</view>
<!-- 通知 -->
<view class="notification">
<u-notice-bar :text="notification[notificationType[$i18n.locale]] || ''" bgColor="#000"
color="white"></u-notice-bar>
</view>
<!-- 用户信息 -->
<view class="user-info content">
<view class="user-name">{{ userInfo.account }}</view>
<view class="member-image">
<image :src="vipInfo.icon" mode="aspectFit"></image>
</view>
</view>
<!-- 菜单列表 -->
<view class="menu-list content">
<view v-for="(item,index) in onList" :key="index" @click="clickMenu(index)" class="menu-item">
<image :src="item.icon" mode="aspectFit"></image>
<view class="menu-descript">{{ $t(`page.home.${menuTitles[index]}`) }}</view>
</view>
</view>
<!-- 会员等级信息 -->
<view class="member-list content">
<view class="member-item" v-for="(item, index) in vipList" :key="index">
<view class="status-icon">
<view v-if="item.current" class="current">current</view>
<uni-icons v-else type="locked" size="20" color="#aec438"></uni-icons>
</view>
<view class="img-box">
<image :src="item.icon" mode="aspectFit"></image>
</view>
<view class="menber-descript">{{ item.title }}</view>
<!-- 权益列表 -->
<view class="equity-list">
<view class="equity-item">
<!-- Receive a set of 40 apps data tasks -->
{{ $t('page.home.equity_item_1', [item.num]) }}
</view>
<view class="equity-item">
{{ $t('page.home.equity_item_2', [item.percentage]) }}
</view>
<view class="equity-item">
{{ $t('page.home.equity_item_3', [item.price]) }}
</view>
</view>
</view>
</view>
<!-- 协议列表 -->
<view class="agreement-list">
<view v-for="(item,index) in outList" :key="index" @click="toinstructions(index)" class="agreement-item">
<image :src="item.icon" mode="aspectFit"></image>
<view class="agreement-descript">{{ $t(`page.home.${agreementTitles[index]}`) }}</view>
</view>
</view>
<sTabbar select="0" />
<center :show="centerShow" :userInfo="userInfo" @close="centerShow = false;$play()" />
<!-- 客服列表 -->
<serviceList :show="showService" :serverList="serverList" @close="closeServiceList"></serviceList>
</view>
</template>
<script>
import sTabbar from '@/components/base/tabBar.vue'
import center from '@/components/center/center.vue'
import serviceList from '@/components/serviceList/serviceList.vue'
export default {
components: {
sTabbar,
center,
serviceList
},
data() {
return {
notification: {},
centerShow: false,
showService: false,
menuTitles: ['CustomerService', 'Certifcate', 'Deposit', 'Withdraw'],
agreementTitles: ['agreement_item_1', 'agreement_item_2', 'agreement_item_3', 'agreement_item_4'],
serverList: [],
onList: [],
outList: [],
vipList: [],
userInfo: {},
vipInfo: {},
notificationType: {
en: 'keyEnglish',
es: "keySpanish",
"zh": "keyChinese"
},
}
},
onShow() {
this.getIndexIcon()
this.getNotice()
this.getUserInfo()
this.forgetPass()
},
methods: {
//
toCertificate() {
uni.navigateTo({
url: `/pages/instructions/instructions?index=1&type=onList`
})
},
//
toPurse() {
uni.navigateTo({
url: '/pages/purse/purse'
})
},
//
toWithdraw() {
uni.navigateTo({
url: '/pages/withdraw/withdraw'
})
},
//
revealServiceList() {
this.showService = true;
},
//
closeServiceList() {
this.showService = false;
},
//()
toinstructions(index) {
this.$play()
uni.navigateTo({
url: `/pages/instructions/instructions?index=${index}`
})
},
//
getIndexIcon() {
this.request('indexIcon').then(res => {
if (res.code == 200) {
this.onList = res.result.onList;
this.outList = res.result.outList;
}
})
},
//vip
getVipShop() {
this.request('vipShop').then(res => {
if (res.code == 200) {
res.result.forEach(item => {
if (this.vipInfo && item.id == this.vipInfo.id) {
item.current = true
}
})
this.vipList = res.result
}
})
},
//
getNotice() {
this.request('indexNotice').then(res => {
if (res.code == 200) {
this.notification = res.result
}
})
},
//
clickMenu(index) {
this.$play()
if (index == 0) {
this.revealServiceList()
}
if (index == 1) {
this.toCertificate()
}
if (index == 2) {
this.toPurse()
}
if (index == 3) {
this.toWithdraw()
}
},
//
getUserInfo() {
this.request('userInfo').then(res => {
if (res.code == 200) {
this.userInfo = res.result.userInfo
this.vipInfo = res.result.vip
this.getVipShop()
}
})
},
//()
forgetPass() {
this.request('forgetPass').then(res => {
if (res.code == 200) {
this.serverList = res.result
}
})
},
//
toSignin() {
this.$play()
uni.navigateTo({
url: '/pages/signIn/signIn'
})
}
}
}
</script>
<style lang="scss" scoped>
.home {
width: 750rpx;
min-height: 100vh;
margin: 0 auto;
// background-color: black;
// background-image: url('@/static/home/bg.png');
background-size: 100%;
background-repeat: no-repeat;
// color: white;
padding-bottom: 200rpx;
.content {
width: 96%;
margin: 0 auto;
}
.home-top {
display: flex;
justify-content: space-between;
align-items: center;
height: 60rpx;
padding: 20rpx 0rpx;
.menu-icon {
image {
width: 50rpx;
height: 50rpx;
}
}
.logo {
image {
width: 260rpx;
}
}
.sign {
image {
width: 60rpx;
}
}
}
.user-info {
display: flex;
flex-direction: column;
align-items: center;
margin: 20rpx 0rpx;
.user-name {
font-size: 34rpx;
}
.member-image {
image {
width: 150rpx;
height: 110rpx;
}
}
}
.menu-list,
.agreement-list {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
text-align: center;
.menu-item,
.agreement-item {
display: flex;
flex-direction: column;
align-items: center;
width: calc(25% - 20px);
flex-shrink: 0;
image {
width: 110rpx;
height: 110rpx;
}
.menu-descript {
box-sizing: border-box;
width: 100%;
text-align: center;
word-break: break-all;
font-size: 24rpx;
margin: 10rpx 0rpx;
padding: 0rpx 12rpx;
}
}
.agreement-item {
font-size: 19rpx;
image {
width: 90rpx;
height: 90rpx;
}
}
}
.agreement-list {
padding-bottom: 40rpx;
}
.member-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin: 20rpx auto;
.member-item {
position: relative;
box-sizing: border-box;
padding: 15rpx;
width: calc(50% - 10rpx);
border-radius: 10rpx;
border: 1px solid #00000080;
margin-bottom: 25rpx;
.status-icon {
box-sizing: border-box;
position: absolute;
width: 100%;
display: flex;
justify-content: flex-end;
padding: 0rpx 20rpx;
.current {
display: flex;
align-items: center;
justify-content: center;
width: 120rpx;
background-image: url('@/static/home/current.png');
background-size: 100%;
background-repeat: no-repeat;
color: black;
font-size: 25rpx;
}
}
.img-box {
display: flex;
justify-content: center;
width: 150rpx;
height: 110rpx;
overflow: hidden;
margin: 20rpx auto;
image {
width: 150rpx;
height: 110rpx;
}
}
.menber-descript {
text-align: center;
color: $uni-bg-color-app;
font-size: 28rpx;
margin-bottom: 10rpx;
}
.equity-list {
// color: white;
font-size: 20rpx;
padding-bottom: 40rpx;
.equity-item {
padding-left: 15rpx;
position: relative;
word-break: break-all;
&::before {
position: absolute;
left: 0;
top: 10rpx;
content: '';
width: 5rpx;
height: 5rpx;
background: white;
border-radius: 50%;
}
}
}
}
}
}
</style>

+ 145
- 0
pages/instructions/instructions.vue View File

@ -0,0 +1,145 @@
<!-- 说明页面(四合一) -->
<template>
<view class="instructions bx">
<navbar :leftClick="leftClick" :title="title"></navbar>
<!-- T&C -->
<!-- <view v-if="$route.query.index==0" class="t-c content">
1. UAV Boost Sales Tasks1.1) Reset account minimum deposit of $100.ll. Cash Withdrawal2.1)The maximum
withdrawal amount for ViP1 users is$20,000, and there is no maximum withdrawal limit forVIP2 and above.2.2)
After completing all tasks, users can apply for fulwithdrawal.2.3) During the process of boosting sales,
users cannotapply for cash withdrawals or refunds.2.4)Users need to submit a cash withdrawal applicatioto
the platform in order to receive payment.ll. Funds(3.1) All user funds will be kept safely in the
useraccount, and you can apply for full withdrawal after thesales promotion is completed(3.2) In order to
avoid loss of funds, all funds will behandled by the system, not manually.(3.3)lf any accidental loss of
funds, the platform wilassume full responsibility.IV. Account Security4.1) Each user can only apply for one
workstationaccount.4.2)Please do not disclose your password to othersand the Platform wil not be responsible
for any loss caused by this.(4.3)Users are not recommended to set their birthdaypassword, lD number or cell
phone number as thewithdrawal password or login password.(4.4) lf you forget your login password or
withdrawalpassword, you can contact online customer service toreset it.(4.5)User and Merchant Confdentiality
Agreement(4.5.1)The tasks to be accomplished on this platformare all data completed by real users in real
time, sousers must ensure the confdentiality of the tasks andthe security of the platform.
</view> -->
<!-- Event -->
<!-- <view v-if="$route.query.index==1" class="event content">
<image src="@/static/instructions/desc.png" mode="aspectFit"></image>
<view class="event-content">
As a platform user, users can use the invitation code toinvite others to join your team after becoming a
VIP3member.In return, referrers will receive a percentage oreferral fees, which will be credited
directly to users viaplatform accounts or team reports.Notice!All users and their referrals will receive
a percentage olreferral fees and bonuses User and Business NonDisclosureAgreementAs the tasks to be
completed on this platform are realtime data done by real usersTherefore, the users must ensure the
tasksconfdentiality and platform.
</view>
</view> -->
<!-- FAQ -->
<!-- <view v-if="$route.query.index==2" class="faq content">
1. UAV Boost Sales Tasks1.1) Reset account minimum deposit of $100.ll. Cash Withdrawal2.1)The maximum withdrawal amount for ViP1 users is$20,000, and there is no maximum withdrawal limit forVIP2 and above.2.2) After completing all tasks, users can apply for fulwithdrawal.2.3) During the process of boosting sales, users cannotapply for cash withdrawals or refunds.2.4)Users need to submit a cash withdrawal applicatioto the platform in order to receive payment.ll. Funds(3.1) All user funds will be kept safely in the useraccount, and you can apply for full withdrawal after thesales promotion is completed(3.2) In order to avoid loss of funds, all funds will behandled by the system, not manually.(3.3)lf any accidental loss of funds, the platform wilassume full responsibility.IV. Account Security4.1) Each user can only apply for one workstationaccount.4.2)Please do not disclose your password to othersand the Platform wil not be responsible for any loss caused by this.(4.3)Users are not recommended to set their birthdaypassword, lD number or cell phone number as thewithdrawal password or login password.(4.4) lf you forget your login password or withdrawalpassword, you can contact online customer service toreset it.(4.5)User and Merchant Confdentiality Agreement(4.5.1)The tasks to be accomplished on this platformare all data completed by real users in real time, sousers must ensure the confdentiality of the tasks andthe security of the platform.
</view> -->
<!-- About -->
<!-- <view v-if="$route.query.index==3" class="about-us content">
Fueled by a passion to solve real world problemsArcsky was founded by Wilson Lau and Justin Squire in 2019 in Minneapolis, Minnesota. Originating from ashared interest in applying targeted electrical andmechanical engineering solutions to common problemsfaced by modern day drone use, the company wasfounded around the idea of practical solutions to extenflight time, payload capacity, and transmission range,while maintaining a strict focus on effciency, sensibilityand coherence in desian. Our industrial drones offersome of the highest performance in their class, with aflexibility that is unmatched.We continue to push the boundaries and work towards innovative solutions that help redefne how unmannedvehicles can beneft the world.
</view> -->
<view class="content">
<view v-if="$route.query.index == 4" v-html="$t('page.instructions.agreement')"></view>
<u-parse v-else :content="info[type[$i18n.locale]]"></u-parse>
</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components: {
navbar
},
computed : {
info(){
let data = this[this.$route.query.type || 'outList'][this.$route.query.index]
if(!data) return {}
return data
},
title(){
let key = this.$route.query.type == 'onList' ? 'onTitleList' : 'titleList'
return this.$t(`page.instructions.${this[key][this.$route.query.index]}`)
}
},
data() {
return {
titleList: ['tcTitle', 'eventTitle', 'faqTitle', 'aboutTtitle','agreementTitle'],
onTitleList: ['', 'certificate'],
onList : [],
outList : [],
type : {
en : 'englishValue',
es : "spanishValue",
"zh" : "chineseValue"
},
}
},
onShow() {
if(this.$route.query.index != 4){ //
this.getIndexIcon()
}
},
methods: {
leftClick() {
let url = this.$route.query.index == 4 ? '/pages/register/register' : "/pages/home/home"
uni.navigateTo({
url
})
},
//
getIndexIcon(){
this.request('indexIcon').then(res => {
if(res.code == 200){
this.onList = res.result.onList;
this.outList = res.result.outList;
}
})
},
}
}
</script>
<style lang="scss" scoped>
.instructions {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
color: white;
.content {
width: 96%;
margin: 20rpx auto;
font-size: 28rpx;
}
.t-c,
.event,
.faq,
.about-us{
padding-top: 60rpx;
}
.event {
image {
width: 750rpx;
height: 1000rpx;
}
}
}
</style>

+ 135
- 0
pages/invitationList/invitationList.vue View File

@ -0,0 +1,135 @@
<template>
<view class="invitation-list bx">
<navbar :leftClick="leftClick" :title="$t('page.invitationList.title')"></navbar>
<!-- 粉丝列表 -->
<u-list v-if="fanList.length > 0" @scrolltolower="scrolltolower" height="calc(100vh - 90rpx)">
<view class="fan-list">
<view v-for="item in fanList" class="fan-item">
<view class="fan-item-left">
<image src="@/static/center/5.png" mode="aspectFit"></image>
<view class="username">{{ item.account}}</view>
</view>
<view class="fan-item-right">{{ item.createTime }}</view>
</view>
</view>
</u-list>
<!-- 无粉丝 -->
<view v-else class="noFans">{{ $t('page.invitationList.noFans') }}</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components: {
navbar
},
data() {
return {
queryparams : {
pageNo : 1,
pageSize : 10
},
fanList : []
}
},
onShow() {
this.getFanList()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
getFanList(){
this.request('fansPage', {}, this.queryparams).then(res => {
if (res.code == 200) {
this.fanList = res.result.records
}
})
},
//
scrolltolower(){
this.queryparams.pageSize += 10
this.getFanList()
}
}
}
</script>
<style lang="scss" scoped>
.invitation-list {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
color: white;
.noFans{
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: #ffffff80;
}
.fan-list{
width: 96%;
margin: 0rpx auto;
padding-top: 20rpx;
border: 1px solid #ffffff80;
margin-top: 20rpx;
.fan-item{
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #ffffff80;
padding: 20rpx;
box-sizing: border-box;
&:last-child{
border: none;
}
.fan-item-left{
width: 200rpx;
display: flex;
align-items: center;
overflow: hidden;
image{
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.username{
width: calc(100% - 120rpx);
margin-left: 20rpx;
white-space: normal;
text-overflow: ellipsis;
overflow: hidden;
}
}
.fan-item-right{
width: calc(100% - 200rpx);
text-align: right;
font-size: 20rpx;
color: #ccc;
}
}
}
}
</style>

+ 91
- 0
pages/login/contactCustomerService.vue View File

@ -0,0 +1,91 @@
<template>
<view class="contactCustomerService">
<u-navbar :title="$route.query.title">
<view slot="left" class="back">
<u-icon @click="toLogin()" name="arrow-left"></u-icon>
</view>
</u-navbar>
<view class="img">
<img width="200px" :src="kf.keyImage" alt="" />
</view>
<view class="text">
{{ $t('page.contactCustomerService.text') }}
</view>
<view class="text">
{{ kf.keyPhone }}
</view>
<button class="btn" @click="copy">
{{ $t('page.contactCustomerService.copy') }}
</button>
</view>
</template>
<script>
export default {
data() {
return {
kf: {}
};
},
onShow() {
this.getData()
},
methods: {
getData() {
this.request('getKeFu').then(res => {
this.kf = res.result
})
},
toLogin() {
let query = this.$route.query;
if (query.url && query.id) {
return uni.navigateTo({
url: query.url + '?id=' + query.id
})
}
uni.navigateTo({
url: '/pages/login/login'
})
},
copy() {
uni.setClipboardData({
data: this.kf.keyPhone,
success: () => {
uni.showToast({
title: this.$t('success-operation'),
icon: 'none'
})
}
})
}
}
}
</script>
<style lang="scss" scoped>
.contactCustomerService {
height: 100vh;
width: 100%;
background-color: #fff;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
flex-wrap: wrap;
.text {
box-sizing: border-box;
padding: 10px;
text-align: center;
}
.btn {
border-radius: 5px;
height: 30px;
font-size: 13px;
line-height: 30px;
background-color: #ED762F;
color: #fff;
}
}
</style>

+ 281
- 0
pages/login/login.vue View File

@ -0,0 +1,281 @@
<!-- 登录页面 -->
<template>
<view class="login bx">
<!-- 背景图片 -->
<view class="bg-box">
<image @click="showSelectLanguageProp" class="language" src="@/static/login/language.png" mode="aspectFit"></image>
<image src="@/static/login/logo.png" mode="aspectFit"></image>
</view>
<!-- 加载效果 -->
<loading :loading="loading" @close="closeLoading"></loading>
<view v-if="!loading" class="main">
<!-- 登录标题 -->
<view class="login-title">
<view class="title">{{ $t('page.login.title') }}</view>
<view class="login-descript">{{ $t('page.login.please-login') }}</view>
</view>
<!-- 输入框列表 -->
<view class="input-list">
<view class="input-item">
<view class="input-descript">{{ $t('page.login.username') }}</view>
<input v-model="form.account" type="text" :placeholder="$t('page.login.username-placeholder')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.login.password') }}</view>
<input v-model="form.pass" type="password" :placeholder="$t('page.login.password-placeholder')" />
</view>
</view>
<!-- 忘记密码 -->
<view class="forgot-password">
<text @click="forgetPass">{{ $t('page.login.forgot-password') }}</text>
</view>
<!-- 按钮组 -->
<view class="btns">
<view @click="Login" class="now-login-btn">{{ $t('page.login.login') }}</view>
<view @click="toRegister" class="now-register-btn">{{ $t('page.login.register') }}</view>
</view>
</view>
<!-- 切换语言 -->
<changeLanguage :show.sync="showSelectLanguage" @close="closeSelectLanguageProp"></changeLanguage>
<!-- 客服列表 -->
<serviceList :show="showService" :serverList="serverList" @close="closeServiceList"></serviceList>
<!-- 初始页面 -->
<pageInit></pageInit>
</view>
</template>
<script>
import changeLanguage from '../../components/changeLanguage/changeLanguage.vue';
import serviceList from '@/components/serviceList/serviceList.vue';
import pageInit from '@/components/pageInit/pageInit.vue'
import loading from '@/components/pageInit/loading.vue'
export default {
components : { changeLanguage , serviceList , pageInit , loading },
data() {
return {
form: {
account: '',
pass: '',
loginIp : ''
},
showSelectLanguage : false,
showService : false,
serverList : [],
loading : true
}
},
created() {
},
methods: {
//
Login() {
this.$play()
let _self = this;
let { account , pass } = this.form
if(account.trim() == ''){
return uni.showToast({title: this.$t('page.login.accountEmpty'),icon : 'none'});
}
if(pass.trim() == ''){
return uni.showToast({title: this.$t('page.login.passEmpty'),icon : 'none'});
}
return uni.request({
url: 'https://api.ipify.org?format=json',
success: function(res) {
_self.form.loginIp = res.data.ip;
_self.request('login', {}, _self.form).then(res => {
if(res.code == 200){
localStorage.setItem("userInfo",JSON.stringify(res.result.userInfo))
localStorage.setItem("token", res.result.token)
uni.navigateTo({
url: '/pages/home/home'
})
}
})
}
});
},
//
toRegister() {
this.$play()
uni.navigateTo({
url: '/pages/register/register'
})
},
//
showSelectLanguageProp(){
this.$play()
this.showSelectLanguage = true
},
//
closeSelectLanguageProp(){
this.showSelectLanguage = false
},
//
revealServiceList(){
this.$play()
this.showService = true;
},
//
closeServiceList(){
this.showService = false;
},
//
closeLoading(){
this.loading = false;
},
//
forgetPass(){
this.request('forgetPass').then(res => {
if(res.code == 200){
this.serverList = res.result
this.revealServiceList()
}
})
}
}
}
</script>
<style lang="scss" scoped>
.login {
width: 750rpx;
height: 100vh;
margin: 0px auto;
// background: black;
// background-image: url('@/static/login/bg.png');
background-size: 100%;
background-repeat: no-repeat;
box-sizing: border-box;
padding: 0rpx 20rpx;
.bg-box {
position: relative;
display: flex;
align-items: center;
justify-content: center;
height: 40%;
.language {
position: absolute;
top: 30rpx;
right: 30rpx;
width: 60rpx;
height: 60rpx;
z-index: 999;
}
}
.login-title {
padding: 0rpx 10rpx;
box-sizing: border-box;
.title {
font-size: 36rpx;
font-weight: bold;
color: $uni-bg-color-app;
margin-bottom: 10rpx;
}
.login-descript {
font-size: 32rpx;
color: white;
margin-bottom: 20rpx;
}
}
.input-list {
padding: 0rpx 10rpx;
box-sizing: border-box;
margin: 40rpx 0rpx;
.input-item {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid $uni-bg-color-app;
padding: 20rpx;
border-radius: 5rpx;
margin-bottom: 25rpx;
box-sizing: border-box;
font-size: 28rpx;
.input-descript {
color: $uni-bg-color-app;
}
input {
color: $uni-bg-color-app;
}
}
}
.forgot-password {
color: $uni-bg-color-app;
text-align: center;
text {
border-bottom: 1rpx solid #ccc;
}
}
.btns {
padding: 0rpx 10rpx;
margin-top: 40rpx;
color: $uni-bg-color;
.now-login-btn,
.now-register-btn {
background: $uni-bg-color-app;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
font-weight: bold;
}
.now-login-btn {
height: 90rpx;
font-size: 40rpx;
}
.now-register-btn {
height: 60rpx;
width: 90%;
font-size: 28rpx;
margin: 0 auto;
}
}
}
</style>

+ 94
- 0
pages/loginRecord/loginRecord.vue View File

@ -0,0 +1,94 @@
<template>
<view class="loginRecord">
<navbar :leftClick="leftClick" :title="$t('page.loginRecord.title')"></navbar>
<u-list
@scrolltolower="scrolltolower"
height="calc(100vh - 90rpx)">
<u-cell color="#fff"
v-for="(item, index) in loginRecord">
<view slot="title" class="title">
<view>
{{ $t('page.loginRecord.login_time') }}
</view>
<view>
{{ $t('page.loginRecord.login_address') }}
</view>
</view>
<view slot="value" class="value">
<view>
{{ item.createTime }}
</view>
<view>
{{ item.loginIp }}
</view>
</view>
</u-cell>
</u-list>
<view v-if="!loginRecord.length" class="noFans">
{{ $t('page.loginRecord.Norecord') }}
</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components : { navbar },
data() {
return {
loginRecord : [],
total : 0,
queryParams: {
pageNo: 1,
pageSize: 10
},
};
},
onShow(){
this.getIpLogPage()
},
methods : {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
getIpLogPage(){
this.request('getIpLogPage', {}, this.queryParams)
.then(res => {
if (res.code == 200) {
this.loginRecord = res.result.records
this.total = res.result.total
}
})
},
scrolltolower(){
this.queryParams.pageSize += 10
this.getIpLogPage()
},
}
}
</script>
<style lang="scss" scoped>
.loginRecord{
.title,
.value{
color: #fff;
&>view{
padding: 10rpx;
}
}
.noFans{
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: #ffffff80;
}
}
</style>

+ 165
- 0
pages/modifyUser/modifyUser.vue View File

@ -0,0 +1,165 @@
<!-- 修改用户信息(二合一) -->
<template>
<view class="modify-user">
<navbar :leftClick="leftClick" :title="$t(`page.modifyUser.${titles[$route.query.type]}`)"></navbar>
<!-- 修改pin -->
<view class="edit-user content">
<view class="edit-list">
<view class="edit-item">
<view class="title">{{ $t('page.modifyUser.oldPassword') }}</view>
<input type="text" :placeholder="$t('page.modifyUser.oldPasswordPlaceholder')" v-model="form.oldPassword"/>
</view>
<view class="edit-item">
<view class="title">{{ $t('page.modifyUser.newPassword') }}</view>
<input type="text" :placeholder="$t('page.modifyUser.newPasswordPlaceholder')" v-model="form.newPassword"/>
</view>
<view class="edit-item">
<view class="title">{{ $t('page.modifyUser.confirmNewPassword') }}</view>
<input type="text" :placeholder="$t('page.modifyUser.newPassword')" v-model="form.confirmNewPassword"/>
</view>
</view>
</view>
<!-- 提交按钮 -->
<view class="confirm content" @click="submit">{{ $t('page.modifyUser.confirm') }}</view>
<!-- 提示信息 -->
<view class="tips content">{{ $t(`page.modifyUser.${tips[$route.query.type]}`) }}</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components : { navbar },
data(){
return {
titles : ['editPinTitle','editPasswordTitle'],
tips : ['pinTips','passwordTips'],
form : {
oldPassword : '',
newPassword : '',
confirmNewPassword : '',
}
}
},
methods : {
leftClick() {
uni.navigateTo({
url: '/pages/personalInfo/personalInfo'
})
},
//
submit(){
this.$play()
if (this.form.oldPassword.trim() === '') return uni.$u.toast(this.$t('page.modifyUser.oldPasswordToast'))
else if (this.form.newPassword.trim() === '') return uni.$u.toast(this.$t('page.modifyUser.newPasswordToast'))
else if (this.form.confirmNewPassword.trim() === '') return uni.$u.toast(this.$t('page.modifyUser.confirmNewPasswordToast'))
else if (this.form.confirmNewPassword.trim() != this.form.newPassword.trim()) return uni.$u.toast(this.$t('page.modifyUser.notPasswordToast'))
if(this.$route.query.type == 0){ //pin
this.request('editPayPass', {}, {
oldPayPass : this.form.oldPassword,
payPass : this.form.newPassword,
okPayPass : this.form.confirmNewPassword,
}).then(res => {
if(res.code == 200){
console.log(res.message);
uni.$u.toast(this.$t(`message.${res.message}`))
setTimeout(() => uni.navigateTo({
url: '/pages/personalInfo/personalInfo'
}), 1000)
}
})
}else{ //
this.request('editPass', {}, {
oldPass : this.form.oldPassword,
password : this.form.newPassword,
okPassword : this.form.confirmNewPassword,
}).then(res => {
if(res.code == 200){
uni.$u.toast(this.$t(`message.${res.message}`))
setTimeout(() => uni.navigateTo({
url: '/pages/personalInfo/personalInfo'
}), 1000)
}
})
}
}
}
}
</script>
<style lang="scss" scoped>
.modify-user{
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
.content {
width: 96%;
margin: 0 auto;
}
.edit-user{
padding-top: 20rpx;
.edit-list{
border: 1px solid #ccc;
.edit-item{
box-sizing: border-box;
padding: 15rpx;
border-bottom: 1px solid #ccc;
&:last-child{
border: none;
}
.title{
color: #788a1c;
font-size: 28rpx;
}
input{
color: #afc638;
text-indent: 1em;
height: 60rpx;
font-size: 28rpx;
margin-top: 15rpx;
}
}
}
}
.confirm{
display: flex;
align-items: center;
justify-content: center;
background: #afc638;
margin: 30rpx auto;
border-radius: 20rpx;
height: 80rpx;
font-size: 40rpx;
font-weight: bold;
}
.tips{
color: rgb(191, 118, 112);
text-align: center;
font-size: 26rpx;
padding: 0rpx 20rpx;
box-sizing: border-box;
}
}
</style>

+ 266
- 0
pages/order/order.vue View File

@ -0,0 +1,266 @@
<template>
<view class="order bx">
<view style="position: fixed;
height: 210rpx;
width: 100%;
z-index: 99;
background: url(/static/home/bg.png);
background-color: #000;">
</view>
<view class="order-nav">
<navbar
style="background: transparent;position: fixed;"
:title="$t('page.order.records')"></navbar>
</view>
<u-sticky>
<view style="width: 100%;display: flex;padding: 20rpx 0rpx;font-size: 28rpx;">
<view style="flex: 1;
text-align: center;padding: 10rpx 0;
margin: 20rpx;"
:class="{act : currentIndex == index}"
@click="tabChange(index)"
v-for="(item, index) in classifyList">
{{ item.name }}
</view>
</view>
</u-sticky>
<view v-if="!noOrder" class="order-list">
<u-list @scrolltolower="scrolltolower" height="calc(100vh - 90rpx)">
<view v-for="(item,index) in productList" :key="index"
class="order-item">
<view class="top">
<view style="font-size: 28rpx;" class="time">
{{ item.createTime }}
</view>
<view style="color: #00b25e;border: 1px solid #00b25e;
padding: 7rpx 15rpx;font-size: 24rpx;"
v-if="item.state != 0">
{{ $t('page.order.Submit_New') }}
</view>
<view style="color: #f90;border: 1px solid #f90;
padding: 7rpx 15rpx;font-size: 24rpx;"
v-else @click="order = item;show = true;$play()">
{{ $t('page.order.pay') }}
</view>
</view>
<view class="con"
style="border-bottom: 1px solid #afc056;
padding: 20rpx 0;">
<view class="img-box" style="width: 150rpx;height: 150rpx;overflow: hidden;border-radius: 10rpx;display: flex;align-items: center;">
<image :src="item.image" mode="widthFix" style="width: 150rpx;"></image>
</view>
<view style="font-weight: 900;margin-left: 20rpx;font-size: 28rpx;">
{{ item.subTitle }}
</view>
</view>
<view class="con"
style="margin-top: 20rpx;font-size: 28rpx;font-weight: 500;">
<view style="flex: 1;">
{{ $t('page.order.Total_Amount') }}
</view>
<view style="flex: 1;">
{{ $t('page.order.Profit') }}
</view>
</view>
<view class="con"
style="margin-top: 10rpx;
color: #afc056;font-weight: 900;font-size: 28rpx;">
<view style="flex: 1;">
USDT {{ item.price }}
</view>
<view style="flex: 1;">
USDT {{ item.giveMoney }}
</view>
</view>
</view>
<view style="justify-content: center;display: flex;
margin-top: 150rpx;" v-if="loading">
<u-loading-icon
mode="semicircle"
size="30"></u-loading-icon>
</view>
</u-list>
</view>
<view v-else class="no-order">
<view class="box">
<view class="no-product-title">{{ $t('page.order.no-Order') }}</view>
<view @click="toHome()" class="to-home">{{ $t('page.order.take-stroll')}}</view>
</view>
</view>
<u-modal :show="show"
:title="$t('page.order.confirm_pay')"
:confirmText="$t('page.order.ok')"
:cancelText="$t('page.order.no')"
@cancel="show = false;$play()"
@confirm="payOrder"
:showCancelButton="true"
></u-modal>
<sTabbar select="2"/>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
import sTabbar from '@/components/base/tabBar.vue'
export default {
components: {
navbar,
sTabbar
},
data() {
return {
classifyList: [
{
name: this.$t('page.order.class_1')
},
{
name: this.$t('page.order.class_2')
},
{
name: this.$t('page.order.class_3')
},
{
name: this.$t('page.order.class_4')
},
],
productList: [],
currentIndex: 0, //index
queryParams: {
pageNo: 1,
pageSize: 10
},
noOrder: false,
loading : false,
show : false,
order : {}
}
},
onShow() {
this.getOrderList();
this.currentIndex = localStorage.getItem('orderIndex') ?
parseInt(localStorage.getItem('orderIndex')) : 0
localStorage.removeItem('orderIndex')
},
methods: {
getOrderList() { //
this.loading = true
let data = {
...this.queryParams,
}
if(this.currentIndex) data.state = this.currentIndex - 1
this.request('orderPage', {}, data).then(res => {
if(res.code == 200){
this.loading = false
this.productList = res.result.records
}
})
},
tabChange(index) {
if (index != this.currentIndex) {
this.currentIndex = index
this.$play()
this.getOrderList();
}
},
payOrder() {
this.$play()
uni.showLoading()
this.request('pay', {}, {
id : this.order.id
}).then(res => {
uni.hideLoading()
this.show = false
if (res.code == 200) {
this.getOrderList();
}
})
},
toHome(){ //
this.$play()
uni.switchTab({
url: '/pages/home/home'
})
},
scrolltolower(){
this.queryParams.pageSize += 10
this.getOrderList()
}
}
}
</script>
<style lang="scss" scoped>
body{
background-color: #000 !important;
}
.order {
padding-bottom: 200rpx;
background-color: black;
background-image: url('@/static/home/bg.png');
background-size: 100%;
color: white;
font-weight: bold;
min-height: 100vh;
padding-bottom: 200rpx;
.act{
background-color: #afc056;
border-radius: 10rpx;
color: black;
}
.order-list {
box-sizing: border-box;
margin-top: 50px;
.order-item {
position: relative;
background: white;
padding: 20rpx;
border-radius: 5px;
background-color: #333333;
margin: 0rpx 20rpx 20rpx 20rpx;
.top{
display: flex;
justify-content: space-between;
}
.con{
display: flex;
align-items: center;
}
}
}
.no-order {
height: calc(100vh - 138px);
display: flex;
align-items: center;
justify-content: center;
.box {
font-size: 26rpx;
text-align: center;
.to-home {
padding: 20rpx 140rpx;
border: 1px solid #ccc;
border-radius: 5px;
text-align: center;
margin: 20rpx 0px;
}
}
}
}
</style>

+ 210
- 0
pages/personalInfo/personalInfo.vue View File

@ -0,0 +1,210 @@
<!-- 用户信息界面 -->
<template>
<view class="personal-info bx">
<navbar :leftClick="leftClick"
:title="$t('page.persionalInfo.title')"></navbar>
<!-- 基本用户信息 -->
<view class="base-info content">
<view class="base-info-item">
<view class="title">{{ $t('page.persionalInfo.profle-image') }}</view>
<image :src="userInfo.headImage || headImage" mode="aspectFit"></image>
</view>
<view class="base-info-item">
<view class="title">{{ $t('page.persionalInfo.username') }}</view>
<view class="name">{{ userInfo.account }}</view>
</view>
</view>
<!-- 修改用户信息按钮组 -->
<view class="edit-user-info-btns content">
<view @click="toModifyUser(0)" class="edit-item">
<view class="edit-descript">{{ $t('page.persionalInfo.change-pin') }}</view>
<uni-icons color="#B0C73B" type="right" size="30rpx"></uni-icons>
</view>
<view @click="toModifyUser(1)" class="edit-item">
<view class="edit-descript">{{ $t('page.persionalInfo.change-password') }}</view>
<uni-icons color="#B0C73B" type="right" size="30rpx"></uni-icons>
</view>
</view>
<!-- 填写地址弹框 -->
<u-popup :show="showAddress" mode="center" bgColor="black"
@close="showAddress=false">
<view class="address-content">
<view class="address-top">
<view class="title">{{ $t('page.center.Tips') }}</view>
<uni-icons @click="showAddress=false"
class="close-icon"
color="#B0C73B" type="close"
size="40rpx"></uni-icons>
</view>
<view class="address-detail">
<view class="title">{{ $t('page.center.Address') }}:</view>
<textarea
:placeholder="$t('page.center.type-address')"></textarea>
</view>
<view
class="save">{{ $t('page.center.save') }}</view>
</view>
</u-popup>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components: {
navbar
},
data() {
return {
userInfo : {},
username : '',
headImage : '/static/personalInfo/user-image.png',
showAddress : false
}
},
onShow() {
this.getUserInfo()
},
methods: {
getUserInfo(){
this.request('userInfo').then(res => {
if(res.code == 200){
this.userInfo = res.result.userInfo
}
})
},
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
updateUser(){
this.request('userInfo').then(res => {
if(res.code == 200){
this.userInfo = res.result
}
})
},
//()
toModifyUser(type){
this.$play()
uni.navigateTo({
url: `/pages/modifyUser/modifyUser?type=${type}`
})
}
}
}
</script>
<style lang="scss" scoped>
.personal-info {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
// background-image: url('@/static/personalInfo/bg.png');
background-size: 100%;
background-repeat: no-repeat;
.content {
width: 96%;
margin: 0 auto;
}
.base-info , .edit-user-info-btns{
border: 1px solid #ffffff80;
margin: 20rpx auto 30rpx auto;
.base-info-item , .edit-item{
display: flex;
justify-content: space-between;
align-items: center;
height: 100rpx;
padding: 15rpx 10rpx;
border-bottom: 1px solid #ffffff80;
.title , .edit-descript{
color: #687527;
font-size: 28rpx;
}
image{
width: 100rpx;
height: 100rpx;
}
.name{
color: white;
font-size: 28rpx;
}
}
}
}
.address-content {
box-sizing: border-box;
border: 1px solid #ffffff80;
padding: 15rpx;
.address-top {
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding: 30rpx 0rpx;
.title {
font-size: 36rpx;
color: #afc638;
font-weight: bold;
}
.close-icon {
position: absolute;
top: 50%;
right: 30rpx;
transform: translateY(-50%);
}
}
.address-detail {
.title {
color: #afc638;
margin-bottom: 10rpx;
font-size: 28rpx;
}
textarea {
border: 1px solid #afc638;
color: #afc638;
border-radius: 25rpx;
height: 150rpx;
width: 560rpx;
text-indent: 1em;
}
}
.save{
display: flex;
align-items: center;
justify-content: center;
background: #afc638;
height: 80rpx;
margin: 20rpx auto;
border-radius: 20rpx;
color: black;
font-size: 34rpx;
}
}
</style>

+ 591
- 0
pages/prizeDraw/prizeDraw.vue View File

@ -0,0 +1,591 @@
<template>
<view class="prizeDraw bx">
<!-- <u-loading-page :loading="loading" loadingText="" style="z-index: 999;" bgColor="#000"></u-loading-page> -->
<!-- 初始页面 -->
<pageInit></pageInit>
<view class="title" style="margin-top: 10rpx;">
{{ $t('page.prizeDraw.title_1') }}
</view>
<view class="profit">
<view class="img-box">
<image :src="vipInfo.icon" mode="aspectFit"></image>
</view>
{{ userInfo.profit }}% {{ $t('page.prizeDraw.profit') }}
</view>
<view class="title">
{{ $t('page.prizeDraw.title_2') }}
</view>
<view class="prize_drone">
<scroll-view :scroll-left="scrollLeft"
scroll-x="true"
lower-threshold="6"
@scrolltolower="scrolltolower">
<view @mouseenter="cleanTime" class="banner" style="height: 370rpx;">
<view @click="gotoDetail(item.url)" v-for="(item, index) in banner" :key="index">
<img :src="item.image.split(',')[0]" width="100%" />
</view>
</view>
</scroll-view>
<view class="banner3d">
<view @click="gotoDetail(item.url)" v-for="(item, index) in
banner3d" :class="{['banner3d_item_' + item.index] : true}"
:key="item.id">
<img :src="item.image" width="100%" />
</view>
</view>
</view>
<view class="title" style="font-size: 38rpx;margin-top: 60rpx;">
({{ userInfo.encourageNum }} / {{ userInfo.encourageSum }})
</view>
<view class="btn" @click="submit">
{{ $t('page.prizeDraw.Start') }}
</view>
<view class="amount">
<view style="font-size: 28rpx;font-weight: normal;" class="">
{{ $t('page.prizeDraw.frozen_amount') }}
</view>
<view style="color: #afc638;">
USDT <text style="margin-left: 10rpx;font-size: 40rpx;">
{{ userInfo.freezeMoney }}
</text>
</view>
</view>
<view class="member-list">
<view class="member-item">
<view class="img-box">
<image src="/static/prizeDraw/23.png" mode="aspectFit"></image>
</view>
<view style="font-size: 28rpx;font-weight: normal;" class="title">
{{ $t('page.prizeDraw.today_profit') }}</view>
<view class="menber-descript">USDT {{ userInfo.todayMoney }}</view>
<view class="equity-list">
<view class="equity-item">
{{ $t('page.prizeDraw.title_3') }}
</view>
</view>
</view>
<view class="member-item">
<view class="img-box">
<image src="/static/prizeDraw/6.png" mode="aspectFit"></image>
</view>
<view style="font-size: 28rpx;font-weight: normal;" class="title">
{{ $t('page.prizeDraw.account_balance') }}</view>
<view class="menber-descript">USDT {{ userInfo.money }}</view>
<view class="equity-list">
<view class="equity-item">
{{ $t('page.prizeDraw.title_4') }}
</view>
</view>
</view>
</view>
<view class="notice">
<view style="
font-size: 36rpx;">
{{ $t('page.prizeDraw.important_notice') }}
</view>
<view class="notice-list">
<view style="font-size: 30rpx;" class="notice-item">
{{ $t('page.prizeDraw.notice_item_1') }}
</view>
<view style="font-size: 30rpx;" class="notice-item">
{{ $t('page.prizeDraw.notice_item_2') }}
</view>
</view>
</view>
<sTabbar select="1" />
<u-popup :show="show" mode="bottom" @close="show = false;$play()" bgColor="black">
<view style="color: #afc638;font-size: 35rpx;text-align: center;
font-weight: 900;padding: 20rpx;">
{{ $t(msg == '31' ? 'message.31' : 'page.prizeDraw.rating_submission') }}
</view>
<view style="display: flex;justify-content: center;">
<img :src="product.image" width="150rpx" />
</view>
<view style="color: #fff;font-size: 35rpx;text-align: center;
font-weight: 900;">
{{ product.subTitle }}
</view>
<view style="display: flex;justify-content: space-around;
color: #afc638;margin-top: 30rpx;">
<view>
{{ $t('page.prizeDraw.Total_Amount') }}
</view>
<view>
{{ $t('page.prizeDraw.profit') }}
</view>
</view>
<view style="display: flex;justify-content: space-around;
color: #afc638;margin-top: 30rpx;font-weight: 900;">
<view>
USDT <text style="font-size: 40rpx;">{{ product.price }}</text>
</view>
<view>
USDT <text style="font-size: 40rpx;">{{ product.giveMoney }}</text>
</view>
</view>
<view style="display: flex;justify-content: space-between;
border-top: 1px solid #555;padding: 30rpx;margin-top: 30rpx;">
<view class="">
{{ $t('page.prizeDraw.Creation_time') }}
</view>
<view class="">
{{ product.createTime }}
</view>
</view>
<view style="display: flex;justify-content: space-between;
border-top: 1px solid #555;border-bottom: 1px solid #555;
padding: 30rpx;align-items: center;">
<view class="">
{{ $t('page.prizeDraw.Rating_No') }}
</view>
<view class="">
{{ product.id }}
</view>
</view>
<view class="btn" @click="payOrder">
{{ $t('page.prizeDraw.submit') }}
</view>
</u-popup>
<review :show="reviewShow" @close="reviewClose" :oid="product.id" />
<turntable :show="turntableShow" @start="getUserInfo" :info="userInfo" @close="turntableShow = false" />
<luckyAnimation ref="an" @close="startSubmit"></luckyAnimation>
</view>
</template>
<script>
import sTabbar from '@/components/base/tabBar.vue'
import review from '@/components/review/review.vue';
import turntable from '@/components/turntable.vue';
import { debounce } from '@/utils/base.js'
import pageInit from '@/components/pageInit/pageInit.vue'
import luckyAnimation from '../../components/luckyAnimation/luckyAnimation.vue';
export default {
components: {
sTabbar,
review,
turntable,
pageInit,
luckyAnimation
},
data() {
return {
loading: false,
turntableShow: false,
scrollLeft: 0,
banner: [],
banner3d: [],
invt: null,
userInfo: {},
product: {},
show: false,
reviewShow: false,
vipInfo: {},
msg : null,
isSubmit : false,
index3d : 0,
}
},
onShow() {
this.getList();
this.getUserInfo()
},
onHide() {
this.end()
},
methods: {
getUserInfo() {
this.request('userInfo').then(res => {
if (res.code == 200) {
this.userInfo = res.result.userInfo
this.vipInfo = res.result.vip
}
})
},
scrolltolower(){
this.scrollLeft = 0
},
reviewClose(){
this.reviewShow = false;
if(this.userInfo.bigNum > 0){
this.turntableShow = true;
}
},
startSubmit : debounce(function(){
this.request('createOrder').then(res => {
this.getUserInfo()
this.isSubmit = false
if (res.code == 200) {
this.msg = res.message
this.product = res.result
this.show = true
}
}).catch(err => {
this.isSubmit = false
})
}, 500),
submit() {
this.$play()
if(this.isSubmit){
return
}
this.isSubmit = true
this.$refs.an.start()
},
payOrder() {
this.$play()
this.asyncLoading().then(res => {
this.request('pay', {}, {
id: this.product.id
}).then(res => {
this.show = false
if (res.code == 200) {
this.reviewShow = true
}
})
})
},
getList() {
this.end()
this.loading = true
this.banner = []
this.banner3d = []
Promise.all([this.getShopList(),this.getShopScroll()]).then(res => {
// this.loading = false
this.start()
})
},
//
getShopList(){
return this.request('getAppBanner', {}, this.queryParams).then(res => {
if (res.code == 200) {
this.banner = res.result
}
})
},
//App
getShopScroll(){
return this.request('appScroll').then(res => {
if (res.code == 200) {
res.result.map((item, index) => {
item.index = index
})
this.banner3d = res.result
}
})
},
async asyncLoading(){
return new Promise((resolve,reject) => {
//
uni.showLoading({
title: this.$t('page.prizeDraw.loading')
});
setTimeout(() => {
uni.hideLoading();
resolve()
},500)
})
},
start() {
this.banner.push(this.banner[0])
this.banner.push(this.banner[1])
let self = this
this.invt = setInterval(next, 20)
let i = 150
function next() {
//
self.scrollLeft++
// 3d
i++
if (i >= 60) {
i = 0
self.index3d++
self.index3d %= self.banner3d.length
self.banner3d.forEach(n => {
if(n.index != 4){
n.index = 4
}
})
//0
self.banner3d[self.index3d].index = 0
//6
self.banner3d[self.index3d != 0 ?
self.index3d - 1 :
self.banner3d.length - 1].index = 6
//5
self.banner3d[self.index3d >= 2 ?
self.index3d - 2 :
self.banner3d.length - 2].index = 5
//1
self.banner3d[(self.index3d + 1) % self.banner3d.length].index = 1
//2
self.banner3d[(self.index3d + 2) % self.banner3d.length].index = 2
//3
self.banner3d[(self.index3d + 3) % self.banner3d.length].index = 3
// self.banner3d.forEach(n => {
// n.index++
// n.index %= self.banner3d.length
// })
}
}
},
end() {
if (this.invt) {
clearInterval(this.invt)
this.invt = null
}
},
//
gotoDetail(url){
this.$play()
if(url){
window.open(url)
}
}
},
}
</script>
<style scoped lang="scss">
.prizeDraw {
color: #fff;
background-size: 100%;
background-repeat: no-repeat;
background-position: 0rpx -210rpx;
padding-bottom: 150rpx;
width: 750rpx;
background-image: url('@/static/prizeDraw/bj.jpg');
background-size: 100%;
/deep/ .uni-scroll-view::-webkit-scrollbar {
width: 0;
height: 0;
}
.title {
font-weight: 900;
text-align: center;
font-size: 28rpx;
}
.profit {
position: relative;
margin: 0 auto;
padding: 10rpx 50rpx;
font-weight: 900;
background-color: rgb(88, 99, 28);
width: fit-content;
border-radius: 20rpx;
margin: 30rpx auto;
.img-box {
display: flex;
justify-content: center;
width: 90rpx;
position: absolute;
top: 50%;
left: -40rpx;
transform: translateY(-50%);
image {
width: 70rpx;
height: 70rpx;
}
}
}
.prize_drone {
margin-top: 20rpx;
.banner {
display: flex;
&>view {
width: calc(50% - 20rpx);
flex-shrink: 0;
margin: 0 10rpx;
cursor: pointer;
img {
display: block;
width: 90%;
margin: 0rpx auto;
}
}
}
.banner3d {
position: relative;
height: 180rpx;
margin-top: 100rpx;
&>view {
width: 220rpx;
height: 220rpx;
position: absolute;
left: 265rpx;
transition: all .8s;
img {
display: block;
width: 85%;
height: 85%;
margin: 0rpx auto;
}
}
.banner3d_item_0 {
z-index: 20;
transform: translateX(0) scale(1.6);
}
.banner3d_item_1 {
z-index: 19;
transform: translateX(230rpx) scale(.9);
}
.banner3d_item_2 {
z-index: 17;
transform: translateX(130rpx) scale(.7);
}
.banner3d_item_3 {
z-index: 16;
transform: translateX(25rpx) scale(0.5);
}
.banner3d_item_4 {
z-index: 16;
transform: translateX(-25rpx) scale(0.01);
}
.banner3d_item_5 {
z-index: 18;
transform: translateX(-130rpx) scale(0.7);
}
.banner3d_item_6 {
z-index: 19;
transform: translateX(-230rpx) scale(.9);
}
}
}
.btn {
background-color: #afc638;
color: #000;
font-weight: 900;
margin: 20rpx 40rpx;
padding: 10rpx 20rpx;
font-size: 46rpx;
text-align: center;
border-radius: 24rpx;
}
.amount {
display: flex;
margin: 20rpx 40rpx;
justify-content: space-between;
border: 3px solid #777;
padding: 20rpx;
font-weight: 900;
color: #aaa;
align-items: center;
}
.member-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin: 10rpx 40rpx;
.member-item {
box-sizing: border-box;
padding: 15rpx;
width: calc(50% - 10rpx);
border-radius: 10rpx;
border: 3px solid #777;
.img-box {
display: flex;
justify-content: center;
width: 100%;
align-items: center;
padding-top: 20rpx;
image {
width: 130rpx;
height: 130rpx;
}
}
.menber-descript {
text-align: center;
color: #B0C73B;
font-size: 34rpx;
margin-top: 10rpx;
font-weight: 900;
}
.equity-list {
color: #fff;
text-align: center;
.equity-item {
position: relative;
font-size: 26rpx;
}
}
}
}
.notice {
margin: 20rpx 40rpx;
font-size: 32rpx;
.notice-list {
color: #fff;
}
}
}
</style>

+ 265
- 0
pages/purse/purse.vue View File

@ -0,0 +1,265 @@
<!-- 充值界面 -->
<template>
<view class="purse bx">
<navbar :leftClick="leftClick" :title="$t('page.purse.recharge')"></navbar>
<!-- 用户余额信息 -->
<view class="user-money content">
<view class="title">{{ $t('page.purse.account') }}</view>
<view class="money">
<view class="money-unit">{{ $t('page.purse.unit') }}</view>
<view class="money-detail">{{ money }}</view>
</view>
</view>
<!-- 充值方案列表 -->
<view class="recharge-list content">
<view @click="selectRecharge(index)" v-for="(item,index) in rechargeList" :key="item.id" class="recharge-item" :class="{ selectRecharge : index === active}">
<view class="money">{{ item.price }}</view>
<view class="unit">{{ $t('page.purse.unit') }}</view>
</view>
</view>
<!-- 输入框 -->
<view class="input content">
<input @input="moneyChange" v-model="form.money" class="input content" type="number" :placeholder="$t('page.purse.deposit-now')" />
</view>
<view class="input content">
<input v-model="form.payPass" class="input content" type="text" :placeholder="$t('page.purse.security-pin')" />
</view>
<!-- 按钮 -->
<view @click="recharge" class="btn content">{{ $t('page.purse.deposit-now') }}</view>
<!-- 客服列表 -->
<serviceList :show="showService" :serverList="serverList" @close="closeServiceList"></serviceList>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
import serviceList from '@/components/serviceList/serviceList.vue';
export default {
components: {
navbar,
serviceList
},
data() {
return {
rechargeList : [],
active : 0,
money : '',
form : {
money : '',
payPass : '',
id : ''
},
serverList : [],
showService : false
}
},
onShow() {
this.getUserInfo()
this.getTopUpScheme()
this.forgetPass()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
selectRecharge(index){
this.$play()
this.active = index
this.form.money = this.rechargeList[index].price
this.form.id = this.rechargeList[index].id
},
//
getUserInfo(){
this.request('userInfo').then(res => {
if(res.code == 200){
this.money = res.result.userInfo.money
}
})
},
//
getTopUpScheme(){
this.request('shopNo').then(res => {
if(res.code == 200){
this.rechargeList = res.result
this.form.money = res.result[0].price; //
}
})
},
//
recharge(){
this.$play()
let { money , payPass } = this.form
if(!money){
return uni.$u.toast(this.$t('page.purse.moneyEmpty'))
}
if(money <= 0){
return uni.$u.toast(this.$t('page.purse.AmountThan0'))
}
if(payPass.trim() == ''){
return uni.$u.toast(this.$t('page.purse.payPassEmpty'))
}
this.request('recharge',{},this.form).then(res => {
if(res.code == 200){
uni.$u.toast(this.$t('page.purse.success'))
this.cleanForm()
this.revealServiceList()
this.getUserInfo() //()
}
})
},
//
moneyChange(e){
this.active = ''
let inputValue= e.detail.value;
this.rechargeList.forEach((recharge,index) => {
if(parseInt(recharge.price) == inputValue){
this.active = index
}
})
},
//
revealServiceList(){
this.$play()
this.showService = true;
},
//
closeServiceList(){
this.showService = false;
},
//()
forgetPass(){
this.request('forgetPass').then(res => {
if(res.code == 200){
this.serverList = res.result
}
})
},
//
cleanForm(){
this.form = {}
}
}
}
</script>
<style lang="scss" scoped>
.purse {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-image: url('@/static/pruse/bg.png');
background-size: 100%;
background-repeat: no-repeat;
.content {
width: 96%;
margin: 0 auto;
}
.user-money {
background: rgba(176, 199, 59, .8);
margin: 20rpx auto 30rpx auto;
border: 4rpx solid #D3EA5E;
padding: 60rpx 0rpx;
font-size: 36rpx;
.title,
.money {
display: flex;
justify-content: center;
align-items: center;
height: 60rpx;
.money-unit {
margin-right: 15rpx;
font-size: 28rpx;
font-weight: bold;
}
.money-detail{
font-size: 50rpx;
font-weight: bold;
}
}
}
.recharge-list {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
color: #B0C73B;
.recharge-item {
box-sizing: border-box;
width: calc(50% - 7rpx);
border: 1px solid #636363;
text-align: center;
margin-bottom: 20rpx;
.money , .unit{
height: 60rpx;
line-height: 60rpx;
}
.money{
font-size: 44rpx;
}
.unit{
font-size: 28rpx;
}
}
.selectRecharge{
color: white;
border: 1px solid #D3EA5E;
background: rgba(176, 199, 59, .8);
}
}
.input{
margin: 30rpx auto;
input{
border: 1px solid #B0C73B;
height: 80rpx;
font-size: 34rpx;
color: #B0C73B;
text-indent: 15rpx;
border-radius: 10rpx;
}
}
.btn{
height: 90rpx;
display: flex;
align-items: center;
justify-content: center;
background: #B0C73B;
border-radius: 10rpx;
font-size: 40rpx;
font-weight: bold;
}
}
</style>

+ 344
- 0
pages/register/register.vue View File

@ -0,0 +1,344 @@
<!-- 注册页面 -->
<template>
<view class="register bx">
<!-- 背景图片 -->
<view class="bg-box">
<image @click="showSelectLanguageProp" class="language" src="@/static/login/language.png" mode="aspectFit">
</image>
<image src="@/static/login/logo.png" mode="aspectFit"></image>
</view>
<!-- 加载效果 -->
<loading :loading="loading" @close="closeLoading"></loading>
<view v-if="!loading" class="main">
<!-- 登录标题 -->
<view class="register-title">
<view class="title">{{ $t('page.register.title') }}</view>
<view class="register-descript">{{ $t('page.register.please-register') }}</view>
</view>
<!-- 输入框列表 -->
<view class="input-list">
<view class="input-item">
<view class="input-descript">{{ $t('page.register.username') }}</view>
<input v-model="form.account" type="text" :placeholder="$t('page.register.username-placeholder')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.register.password') }}</view>
<input v-model="form.password" type="password"
:placeholder="$t('page.register.password-placeholder')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.register.confirm-password') }}</view>
<input v-model="form.okPassword" type="password"
:placeholder="$t('page.register.confirm-password')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.register.PaymentPassword') }}</view>
<input v-model="form.payPass" type="password" :placeholder="$t('page.register.PaymentPassword-placeholder')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.register.confirm-PaymentPassword') }}</view>
<input v-model="form.okPayPass" type="password"
:placeholder="$t('page.register.PaymentPassword-placeholder')" />
</view>
<view class="input-item">
<view class="input-descript">{{ $t('page.register.invitation-code') }}</view>
<input v-model="form.invitationCode" :placeholder="$t('page.register.invitation-code')" />
</view>
</view>
<!-- 勾选协议 -->
<view class="check-box">
<u-checkbox-group v-model="agree" @change="$play">
<u-checkbox activeColor="#B0C73B"
shape="circle" :label="$t('page.register.agreen')"
name="agree"></u-checkbox>
</u-checkbox-group>
<view @click.stop="toAgreement" class="agreement-content">{{ $t('page.register.agreement') }}</view>
</view>
<!-- 忘记密码
<view class="forgot-password">
<text>{{ $t('page.register.forgot-password') }}</text>
</view> -->
<!-- 按钮组 -->
<view class="btns">
<view @click.stop="register" class="now-register-btn">{{ $t('page.register.register') }}</view>
<view @click.stop="toLogin" class="now-login-btn">{{ $t('page.register.login') }}</view>
</view>
</view>
<!-- 切换语言 -->
<changeLanguage :show.sync="showSelectLanguage" @close="closeSelectLanguageProp"></changeLanguage>
<!-- 初始页面 -->
<pageInit></pageInit>
</view>
</template>
<script>
import changeLanguage from '../../components/changeLanguage/changeLanguage.vue';
import pageInit from '@/components/pageInit/pageInit.vue'
import loading from '@/components/pageInit/loading.vue'
export default {
components: {
changeLanguage,
pageInit,
loading
},
data() {
return {
form: {
account: '',
password: '',
okPassword: '',
payPass: '',
okPayPass: '',
invitationCode: ''
},
agree: [],
showSelectLanguage: false,
loading: true
}
},
onShow() {
},
methods: {
//
register() {
this.$play()
if (this.verify()) {
this.request('register', {}, this.form).then(res => {
if (res.code == 200) {
this.toLogin(false)
}
})
}
},
//
toLogin(sound) { //
if(sound){this.$play()}
uni.navigateTo({
url: '/pages/login/login'
})
},
//
verify() {
let {
account,
password,
okPassword,
payPass,
okPayPass
} = this.form
if (account.trim() == '') {
uni.showToast({title: this.$t('page.register.accountEmpty'),icon : 'none'});
return false;
}
if (password.trim() == '') {
uni.showToast({title: this.$t('page.register.passEmpty'),icon : 'none'});
return false;
}
if (okPassword.trim() == '') {
uni.showToast({title: this.$t('page.register.okPassEmpty'),icon : 'none'});
return false;
}
if (password.trim() != okPassword.trim()) {
uni.showToast({title: this.$t('page.register.passInconsistency'),icon : 'none'});
return false;
}
if (payPass.trim() == '') {
uni.showToast({title: this.$t('page.register.payPassEmpty'),icon : 'none'});
return false;
}
if (okPayPass.trim() == '') {
uni.showToast({title: this.$t('page.register.okPayPassEmpty'),icon : 'none'});
return false;
}
if (payPass.trim() != okPayPass.trim()) {
uni.showToast({title: this.$t('page.register.payPassInconsistency'),icon : 'none'});
return false;
}
if (this.agree.length <= 0 && this.agree[0] != 'agree') {
uni.showToast({title: this.$t('page.register.tickProtocol'),icon : 'none'});
return false;
}
return true
},
//
showSelectLanguageProp() {
this.$play()
this.showSelectLanguage = true
},
//
closeSelectLanguageProp() {
this.showSelectLanguage = false
},
//
closeLoading() {
this.loading = false;
},
//
toAgreement(){
this.$play()
uni.navigateTo({
url: '/pages/instructions/instructions?index=4'
})
}
}
}
</script>
<style lang="scss" scoped>
.register {
width: 750rpx;
height: 100vh;
margin: 0px auto;
background: black;
background-image: url('@/static/login/bg.png');
background-size: 100%;
background-repeat: no-repeat;
box-sizing: border-box;
padding: 0rpx 20rpx;
.bg-box {
position: relative;
display: flex;
align-items: center;
justify-content: center;
height: 25%;
.language {
position: absolute;
top: 30rpx;
right: 30rpx;
width: 60rpx;
height: 60rpx;
z-index: 999;
}
}
.register-title {
padding: 0rpx 10rpx;
box-sizing: border-box;
.title {
font-size: 36rpx;
font-weight: bold;
color: #B0C73B;
margin-bottom: 10rpx;
}
.register-descript {
font-size: 32rpx;
color: white;
margin-bottom: 20rpx;
}
}
.input-list {
padding: 0rpx 10rpx;
box-sizing: border-box;
margin: 40rpx 0rpx;
.input-item {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #B0C73B;
padding: 20rpx;
border-radius: 5rpx;
margin-bottom: 25rpx;
box-sizing: border-box;
font-size: 28rpx;
.input-descript {
color: #B0C73B;
}
input {
color: #B0C73B;
}
}
}
.forgot-password {
color: #B0C73B;
text-align: center;
text {
border-bottom: 1rpx solid #ccc;
}
}
.check-box{
display: flex;
color: rgb(96, 98, 102);
.agreement-content{
text-decoration: underline;
font-size: 28rpx;
}
}
.btns {
padding: 0rpx 10rpx;
margin-top: 40rpx;
.now-login-btn,
.now-register-btn {
background: #B0C73B;
border-radius: 10rpx;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
font-weight: bold;
}
.now-login-btn {
height: 60rpx;
width: 90%;
font-size: 28rpx;
margin: 0 auto;
}
.now-register-btn {
height: 90rpx;
font-size: 40rpx;
}
}
}
</style>

+ 120
- 0
pages/runningWater/runningWater.vue View File

@ -0,0 +1,120 @@
<!-- 流水页面 -->
<template>
<view class="running-water bx">
<navbar :leftClick="leftClick" :title="$t('page.runningWater.title')"></navbar>
<u-list @scrolltolower="scrolltolower" height="calc(100vh - 90rpx)">
<!-- 流水列表 -->
<view class="running-water-list content">
<view v-for="item in runningWaterList" :key="item.id" class="running-water-item">
<image src="@/static/runningWater/money.png" mode="aspectFit"></image>
<view class="descript">[balance]</view>
<view class="time">{{ item.createTime }}</view>
<view class="money-detail">
<text>{{ item.type == '0' ? '+' : '-' }}</text>
{{ item.money }}
</view>
</view>
</view>
</u-list>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components: {
navbar
},
data() {
return {
queryparams: {
pageNo: 1,
pageSize: 10
},
runningWaterList: []
}
},
onShow() {
this.getRunningWater()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
getRunningWater() {
this.request('WaterPage', {}, this.queryparams).then(res => {
if (res.code == 200) {
this.runningWaterList = res.result.records
}
})
},
//
scrolltolower(){
this.queryparams.pageSize += 10
this.getRunningWater()
}
}
}
</script>
<style lang="scss" scoped>
.running-water {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
.content {
width: 96%;
margin: 0 auto;
}
.running-water-list {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
margin-top: 20rpx;
.running-water-item {
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
padding: 15rpx;
width: calc(50% - 15rpx);
border: 1px solid #ffffff80;
margin-bottom: 25rpx;
image {
width: 100rpx;
height: 100rpx;
}
.descript {
color: #AEC43C;
font-size: 36rpx;
}
.time {
color: #989898;
margin: 15rpx 0rpx;
}
.money-detail {
color: #3AA56B;
font-size: 36rpx;
}
}
}
}
</style>

+ 360
- 0
pages/signIn/signIn.vue View File

@ -0,0 +1,360 @@
<template>
<view class="sigin-in bx">
<navbar :leftClick="leftClick" :title="$t('page.signIn.title')"></navbar>
<view class="sigin-in-content">
<!-- <view class="title">{{ $t('page.signIn.title') }}</view> -->
<view class="numberOfSays">{{ $t('page.signIn.sign',[numberOfSays]) }}</view>
<view class="date-info">
<view class="month-info">
<view class="left-arrow">
<image @click="changeMonth(0)" src="/static/signin/arrow.png" mode="widthFix"></image>
</view>
<view class="month">{{ $t(`page.signIn.${monthIndex}`) }}</view>
<view class="right-arrow">
<image @click="changeMonth(1)" src="/static/signin/arrow.png" mode="widthFix"></image>
</view>
</view>
<view class="day-list">
<view v-for="(item,index) in dayList" :key="index" class="day-item">
<view v-if="item.sign" class="check-img">
<image src="/static/signin/check.png" mode="widthFix"></image>
</view>
<view class="sort">{{ $t('page.signIn.day',[index + 1])}}</view>
<view class="img-box">
<image src="/static/signin/gift.png" mode="widthFix"></image>
</view>
<view class="day">{{ forMateDate(item) }}</view>
</view>
</view>
<view class="tips">{{ tips[type[$i18n.locale]] }}</view>
<view :class="{ signedIn : userInfo.sginState == 1 }" @click="submitSignin" class="submit">{{ $t('page.signIn.title') }}</view>
</view>
</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components: {
navbar
},
data() {
return {
numberOfSays: 0, //
dayList: [], //
tips: '', //
type: {
en: 'keyEnglish',
es: "keySpanish",
"zh": "keyChinese"
},
monthIndex: 0, //(0-11)
signinList : [], //
userInfo : {}
}
},
onShow() {
this.initDate()
this.getTips()
this.getSigninList()
this.getUserInfo()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
initDate() {
if(this.dayList.length >= 28) return
//
this.monthIndex = this.$dayjs().month();
//
let now = this.$dayjs();
//
let lastDayOfMonth = now.endOf('month');
//
let daysInMonth = lastDayOfMonth.date();
//
var firstDay = this.$dayjs().date(1)
this.dayList.push(firstDay)
//
for (let i = 1; i < daysInMonth; i++) {
this.dayList.push(this.$dayjs(firstDay).add(i, 'day'))
}
},
//
forMateDate(day) {
return this.$dayjs(day).format("MM-DD")
},
//
getSigninList() {
this.request('getSignRecord').then(res => {
if (res.code == 200) {
this.signinList = res.result
this.updateSigninState()
}
})
},
//
getTips() {
this.request('getTips').then(res => {
if (res.code == 200) {
this.tips = res.result
}
})
},
//
submitSignin(day) {
this.$play()
if(this.userInfo.sginState == 1){
return uni.$u.toast(this.$t('message.34'))
}
this.request('sign').then(res => {
if (res.code == 200) {
uni.$u.toast(this.$t('message.35'))
this.getSigninList()
}
})
},
//
changeMonth(type) {
this.$play()
if (!type) {
if(this.monthIndex <= 0) return
//
this.monthIndex -= 1;
this.getDays()
} else {
if(this.monthIndex >= 11) return
//
this.monthIndex += 1
this.getDays()
}
},
//
getDays(){
// 使
let firstDayOfMonth = this.$dayjs().year(this.$dayjs().year()).month(this.monthIndex).startOf('month');
//
let lastDayOfMonth = firstDayOfMonth.endOf('month');
//
let daysInMonth = lastDayOfMonth.date();
//
this.dayList = [];
//
for (let i = 1; i <= daysInMonth; i++) {
//
this.dayList.push(firstDayOfMonth.add(i - 1, 'day'));
}
//
this.updateSigninState()
},
//
updateSigninState(){
this.signinList.forEach(item => {
let signDate = this.$dayjs(item.signTime).format("YYYY-MM-DD")
this.dayList.forEach(day => {
if (day.isSame(signDate, 'day')) {
this.$set(day, 'sign', true)
}
})
//
this.countSigninDayNum()
})
},
//
countSigninDayNum(){
this.numberOfSays = 0;
let lastIndex = this.getLastDayIndex()
//
for(let j = lastIndex ; j >= 0 ; j--){
if(this.dayList[j].sign){
this.numberOfSays++
}else{
return
}
}
},
//
getLastDayIndex() {
for (let i = this.dayList.length - 1; i >= 0; i--) {
if (this.dayList[i].sign) {
return i;
}
}
},
//()
getUserInfo() {
this.request('userInfo').then(res => {
if (res.code == 200) {
this.userInfo = res.result.userInfo
}
})
},
}
}
</script>
<style lang="scss" scoped>
.sigin-in {
color: white;
background: black;
padding-bottom: 80rpx;
.sigin-in-content {
width: 96%;
margin: 0 auto;
.title {
display: flex;
align-items: center;
justify-content: center;
font-size: 40rpx;
color: #AEC438;
height: 80rpx;
}
.numberOfSays {
text-align: center;
padding: 20rpx 0rpx;
}
.date-info {
background: #3E3E3E;
border-radius: 20rpx;
box-sizing: border-box;
padding: 20rpx;
.month-info {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20rpx;
.month {
background: #A4B835;
padding: 10rpx;
border-radius: 10rpx;
margin: 0rpx 15rpx;
font-size: 30rpx;
}
image {
width: 30rpx;
}
.right-arrow {
image {
transform: rotate(-180deg);
}
}
}
.day-list {
display: flex;
flex-wrap: wrap;
.day-item {
position: relative;
flex-shrink: 0;
width: calc(20% - 7px);
background: #565656;
border-radius: 20rpx;
margin-bottom: 20rpx;
margin-right: calc(35px / 4);
box-sizing: border-box;
padding: 10rpx;
&:nth-child(5n) {
margin-right: 0rpx;
}
.check-img {
position: absolute;
right: 4rpx;
top: -4rpx;
image {
width: 30rpx;
}
}
image {
width: 40rpx;
margin: 10rpx 0rpx;
}
.sort {
font-size: 20rpx;
}
.day {
font-size: 20rpx;
border-radius: 20rpx;
background: #66B53B;
}
view {
display: flex;
justify-content: center;
}
}
}
.tips {
color: #888888;
font-size: 20rpx;
text-align: center;
margin: 20rpx 0rpx;
}
.submit {
display: flex;
align-items: center;
justify-content: center;
height: 80rpx;
background: #AEC438;
color: white;
border-radius: 40rpx;
margin-bottom: 20rpx;
}
.signedIn{
background: #ccc;
}
}
}
}
</style>

+ 149
- 0
pages/winningRecord/winningRecord.vue View File

@ -0,0 +1,149 @@
<template>
<view class="winningRecord bx">
<navbar :leftClick="leftClick" :title="$t('page.winningRecord.title')"></navbar>
<view v-if="turntableRecord.length > 0" class="winningRecord-list">
<view v-for="item in turntableRecord" :key="item.id" class="winningRecord-item">
<view class="winningRecord-item-left">
<image src="@/static/winningRecord/gift.png" mode="aspectFit"></image>
<view class="detail">
<view class="title">{{ $t(`page.winningRecord.${getTurntableDetail(item.bigId,'name')}`) }}</view>
<view class="money">{{ $t('page.winningRecord.money') }}:{{ getTurntableDetail(item.bigId,'money') }}</view>
</view>
</view>
<view class="winningRecord-item-right">
{{ item.createTime}}
</view>
</view>
</view>
<!-- 无粉丝 -->
<view v-else class="noFans">{{ $t('page.winningRecord.noPrizesHaveBeenWon') }}</view>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
export default {
components : { navbar },
data(){
return {
winningRecordList : [],
turntableRecord : []
}
},
onShow(){
this.getTurntable()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
getTurntableRecord(){
this.request('getTurntableRecord').then(res => {
if (res.code == 200) {
this.turntableRecord = res.result
}
})
},
//
getTurntable(){
this.request('getTurntableList').then(res => {
if(res.code == 200){
this.winningRecordList = res.result
this.getTurntableRecord()
}
})
},
//
getTurntableDetail(id, key) {
const item = this.winningRecordList.find(item => item.id === id);
return item ? item[key] : {}; //
}
}
}
</script>
<style lang="scss" scoped>
.winningRecord{
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-size: 100%;
background-repeat: no-repeat;
color: white;
.winningRecord-list{
width: 96%;
margin: 0rpx auto;
margin-top: 20rpx;
.winningRecord-item{
background: #333333;
padding: 10rpx 20rpx;
border-radius: 10rpx;
display: flex;
justify-content: space-between;
margin-bottom: 20rpx;
.winningRecord-item-left{
display: flex;
width: 70%;
overflow: hidden;
image{
width: 130rpx;
height: 130rpx;
}
.detail{
width: calc(100% - 130rpx);
display: flex;
flex-direction: column;
justify-content: space-around;
padding: 20rpx 0rpx;
padding-right: 15rpx;
box-sizing: border-box;
.title{
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
font-size: 30rpx;
}
.money{
color: #ccc;
font-size: 26rpx;
}
}
}
.winningRecord-item-right{
display: flex;
align-items: center;
justify-content: flex-end;
font-size: 20rpx;
color: #ccc;
width: 30%;
}
}
}
.noFans{
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
color: #ffffff80;
}
}
</style>

+ 308
- 0
pages/withdraw/withdraw.vue View File

@ -0,0 +1,308 @@
<!-- 提现页面 -->
<template>
<view class="withdraw bx">
<navbar :leftClick="leftClick" :title="$t('page.withdraw.title')"></navbar>
<!-- 用户余额信息 -->
<view class="user-money content">
<view class="title">{{ $t('page.purse.account') }}</view>
<view class="money">
<view class="money-unit">{{ $t('page.withdraw.unit') }}</view>
<view class="money-detail">{{ money }}</view>
</view>
</view>
<view class="withdraw-amount content">
<view class="withdraw-title">{{ $t('page.withdraw.withdraw-amount')}}</view>
<view class="withdraw-content">{{ $t('page.withdraw.withdraw-descript')}}</view>
</view>
<!-- 输入框组 -->
<view class="inputs content">
<view class="input-item">
<view class="input-top">
<view class="title">{{ $t('page.withdraw.withdraw-amount') }}</view>
<view @click="withdrawAll" class="all">{{ $t('page.withdraw.withdrawal-all') }}</view>
</view>
<input v-model="form.money" type="number" :placeholder="$t('page.withdraw.deposit-now')"/>
</view>
<view class="input-item">
<view class="input-top">
<view class="title">{{ $t('page.withdraw.pin') }}</view>
</view>
<input v-model="form.payPass" type="text"/>
</view>
</view>
<!-- 提交按钮 -->
<view @click="withdraw" class="submit content">{{ $t('page.withdraw.submit') }}</view>
<!-- 超出最大提现金额提示 -->
<view v-if="showModal" class="modal">
<view class="modal-main">
<view class="title">{{ $t('page.withdraw.warn') }}</view>
<view class="tip">{{ $t('page.withdraw.warn-detail') }}</view>
<view @click="showModal = false;$play()" class="ok">{{ $t('page.withdraw.ok') }}</view>
</view>
</view>
<!-- 客服列表 -->
<serviceList :show="showService" :serverList="serverList" @close="closeServiceList"></serviceList>
</view>
</template>
<script>
import navbar from '@/components/base/m-navbar.vue'
import serviceList from '@/components/serviceList/serviceList.vue';
export default {
components: {
navbar
},
data() {
return {
money : '',
form : {
money : '', //
payPass : ''
},
vipInfo : {},
showModal : false, //
serverList : [],
showService : false
}
},
onShow() {
this.getUserInfo()
this.forgetPass()
},
methods: {
leftClick() {
uni.navigateTo({
url: '/pages/home/home'
})
},
//
getUserInfo(){
this.request('userInfo').then(res => {
if(res.code == 200){
this.money = res.result.userInfo.money
this.vipInfo = res.result.vip
}
})
},
//
withdrawAll(){
this.$play()
if(!this.money){
return uni.$u.toast(this.$t('page.withdraw.noBalance'))
}
this.form.money = this.money
},
//
withdraw(){
this.$play()
let { money , payPass } = this.form;
if(money <= 0){
return uni.$u.toast(this.$t('page.withdraw.creditLimit'))
}
// if(money > this.vipInfo.maxPrice){ //vip(使toast)
// return this.showModal = true
// }
if(money > this.money){ //
return uni.$u.toast(this.$t('page.withdraw.insufficientBalance'))
}
if(payPass.trim() == ''){
return uni.$u.toast(this.$t('page.withdraw.payPassEmpty'))
}
this.request('withdrawal',{},this.form).then(res => {
if(res.code == 200){
uni.$u.toast(this.$t('page.withdraw.successfulWithdrawal'))
this.cleanForm()
this.revealServiceList()
this.getUserInfo() //()
}
})
},
//
revealServiceList(){
this.$play()
this.showService = true;
},
//
closeServiceList(){
this.showService = false;
},
//()
forgetPass(){
this.request('forgetPass').then(res => {
if(res.code == 200){
this.serverList = res.result
}
})
},
//
cleanForm(){
this.form = {}
}
}
}
</script>
<style lang="scss" scoped>
.withdraw {
width: 750rpx;
min-height: 100vh;
background-color: black;
margin: 0 auto;
background-image: url('@/static/withdraw/bg.png');
background-size: 100%;
background-repeat: no-repeat;
.content {
width: 96%;
margin: 0 auto;
}
.user-money {
background: rgba(176, 199, 59, .8);
margin: 20rpx auto 30rpx auto;
border: 4rpx solid #D3EA5E;
padding: 60rpx 0rpx;
font-size: 36rpx;
.title,
.money {
display: flex;
justify-content: center;
align-items: center;
height: 60rpx;
.money-unit {
margin-right: 15rpx;
font-size: 28rpx;
font-weight: bold;
}
.money-detail{
font-size: 50rpx;
font-weight: bold;
}
}
}
.withdraw-amount{
color: #D3EA5E;
.withdraw-title{
font-size: 28rpx;
font-weight: bold;
margin-bottom: 20rpx;
}
.withdraw-content{
color: white;
font-size: 24rpx;
}
}
.inputs{
.input-item{
margin-top: 35rpx;
.input-top{
display: flex;
justify-content: space-between;
.title{
font-size: 28rpx;
font-weight: bold;
color: #D3EA5E;
}
.all{
background: #D3EA5E;
padding: 5rpx 10rpx;
border-radius: 10rpx;
font-size: 20rpx;
}
}
input{
border: 1px solid #B0C73B;
height: 80rpx;
margin-top: 20rpx;
text-indent: 1em;
color: #B0C73B;
border-radius: 10rpx;
}
}
}
.submit{
height: 90rpx;
display: flex;
align-items: center;
justify-content: center;
background: #B0C73B;
border-radius: 10rpx;
font-size: 40rpx;
font-weight: bold;
margin-top: 30rpx;
}
.modal{
display: flex;
align-items: center;
justify-content: center;
position: fixed;
left: 0;
top: 0;
width: 750rpx;
height: 100vh;
.modal-main{
width: 600rpx;
background: black;
border-radius: 10rpx;
color: #ccc;
border: 1px solid #ccc;
.title{
text-align: center;
font-size: 36rpx;
color: #afc638;
font-weight: bold;
padding: 20rpx 0rpx;
}
.tip{
box-sizing: border-box;
padding: 0rpx 20rpx;
margin-bottom: 20rpx;
}
.ok{
height: 90rpx;
display: flex;
align-items: center;
justify-content: center;
background: black;
border-radius: 10rpx;
font-size: 40rpx;
font-weight: bold;
border-top: 1px solid #ffffff80;
}
}
}
}
</style>

+ 27
- 0
plugin/index.js View File

@ -0,0 +1,27 @@
import Vue from "vue";
import toast from "./toast/index.js";
import { play } from '@/utils/clickSound.js'
import dayjs from 'dayjs'
Vue.prototype.$isAppFn = function(){
if(typeof navigator == 'undefined'){
return true
}
const userAgent = navigator.userAgent.toLowerCase();
if (/ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(userAgent)) {
// 移动端
console.log('移动端')
return true
}
// pc端
console.log('PC端')
return false
}
Vue.prototype.$isApp = Vue.prototype.$isAppFn()
Vue.prototype.$play = play
Vue.prototype.$dayjs = dayjs
Vue.use(toast)

+ 28
- 0
plugin/toast/index.js View File

@ -0,0 +1,28 @@
import toast from './index.vue'
export default {
// 注册Toast
install(Vue) {
Vue.prototype.$MyToast = (text, opts) => {
// 设置默认参数,可设置多个
let defaultOpts = {
duration: 2000
}
opts = Object.assign(defaultOpts, opts);
// 生成一个Vue的子类
let toastTpl = Vue.extend(toast);
// 生成一个该子类的实例
let tpl = new toastTpl({
data : opts
}).$mount();
// 并将此div加入全局挂载点内部
document.body.appendChild(tpl.$el);
// 修改提示语
tpl.text = text;
// 定时消失
setTimeout(() => {
document.body.removeChild(tpl.$el);
}, opts.duration)
}
}
}

+ 73
- 0
plugin/toast/index.vue View File

@ -0,0 +1,73 @@
<template>
<view class="toast">
<div class="box">
<view class="top">
{{ title }}
</view>
<view class="bottom">
<!-- <u-icon name="checkmark-circle-fill"
v-if="icon"
color="#5ac725" size="30px"
style="padding-right: 10px;"></u-icon> -->
<img src="/static/46660.png"
v-if="icon"
alt="" style="margin-right: 10px;"/>
<text>{{ text }}</text>
</view>
</div>
</view>
</template>
<script>
export default {
name: 'toast',
data(){
return{
text : "",
title : "",
icon : false
}
}
}
</script>
<style scoped lang="scss">
.toast{
left: 0;
top: 0;
position: fixed;
z-index: 99999999;
width: 100vw;
height: 100vh;
background-color: #000000aa;
.box{
top:50%;
left: 50%;
transform: translate(-50%, -50%);
position: fixed;
border-radius: 10px;
z-index: 99999999;
text-align: center;
width: 500rpx;
overflow: hidden;
}
.top{
width: 100%;
height: 35px;
background-color: #000;
color: #FFFFFF;
line-height: 35px;
font-size: 13px;
}
.bottom{
width: 100%;
height: 60px;
background-color: #fff;
color: #333;
display: flex;
justify-content: center;
align-items: center;
}
}
</style>

BIN
static/center/10.png View File

Before After
Width: 60  |  Height: 60  |  Size: 2.7 KiB

BIN
static/center/11.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.2 KiB

BIN
static/center/12.png View File

Before After
Width: 60  |  Height: 60  |  Size: 14 KiB

BIN
static/center/13.png View File

Before After
Width: 60  |  Height: 60  |  Size: 2.9 KiB

BIN
static/center/2.png View File

Before After
Width: 200  |  Height: 200  |  Size: 3.7 KiB

BIN
static/center/20.png View File

Before After
Width: 553  |  Height: 120  |  Size: 33 KiB

BIN
static/center/5.png View File

Before After
Width: 155  |  Height: 155  |  Size: 22 KiB

BIN
static/center/6.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.3 KiB

BIN
static/center/7.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.3 KiB

BIN
static/center/8.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.4 KiB

BIN
static/center/9.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.7 KiB

BIN
static/center/fans.png View File

Before After
Width: 60  |  Height: 60  |  Size: 2.6 KiB

BIN
static/center/login.png View File

Before After
Width: 200  |  Height: 200  |  Size: 3.7 KiB

BIN
static/center/winning-record.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.2 KiB

BIN
static/certificate/certificate.png View File

Before After
Width: 664  |  Height: 855  |  Size: 176 KiB

BIN
static/drone/230.png View File

Before After
Width: 210  |  Height: 206  |  Size: 1.2 KiB

BIN
static/drone/29.png View File

Before After
Width: 422  |  Height: 591  |  Size: 72 KiB

BIN
static/drone/30.png View File

Before After
Width: 657  |  Height: 919  |  Size: 119 KiB

BIN
static/drone/45.png View File

Before After
Width: 729  |  Height: 725  |  Size: 201 KiB

BIN
static/drone/46.png View File

Before After
Width: 729  |  Height: 725  |  Size: 210 KiB

BIN
static/drone/48.png View File

Before After
Width: 729  |  Height: 725  |  Size: 189 KiB

BIN
static/drone/49.png View File

Before After
Width: 729  |  Height: 725  |  Size: 228 KiB

BIN
static/drone/50.png View File

Before After
Width: 729  |  Height: 725  |  Size: 179 KiB

BIN
static/drone/5db810a1868a7230.png View File

Before After
Width: 516  |  Height: 515  |  Size: 371 KiB

BIN
static/home/About-us.png View File

Before After
Width: 150  |  Height: 150  |  Size: 11 KiB

BIN
static/home/Event.png View File

Before After
Width: 150  |  Height: 150  |  Size: 6.0 KiB

BIN
static/home/FAQ.png View File

Before After
Width: 150  |  Height: 150  |  Size: 9.4 KiB

BIN
static/home/TC.png View File

Before After
Width: 150  |  Height: 150  |  Size: 8.2 KiB

BIN
static/home/bg.png View File

Before After
Width: 1125  |  Height: 2436  |  Size: 665 KiB

BIN
static/home/current.png View File

Before After
Width: 140  |  Height: 37  |  Size: 18 KiB

BIN
static/home/logo.png View File

Before After
Width: 553  |  Height: 120  |  Size: 33 KiB

BIN
static/home/menu.png View File

Before After
Width: 46  |  Height: 46  |  Size: 14 KiB

BIN
static/home/menu1.png View File

Before After
Width: 198  |  Height: 198  |  Size: 16 KiB

BIN
static/home/menu2.png View File

Before After
Width: 198  |  Height: 198  |  Size: 20 KiB

BIN
static/home/menu3.png View File

Before After
Width: 198  |  Height: 198  |  Size: 14 KiB

BIN
static/home/menu4.png View File

Before After
Width: 198  |  Height: 198  |  Size: 13 KiB

BIN
static/home/sign.png View File

Before After
Width: 32  |  Height: 32  |  Size: 494 B

BIN
static/home/vip1.png View File

Before After
Width: 231  |  Height: 186  |  Size: 32 KiB

BIN
static/home/vip2.png View File

Before After
Width: 400  |  Height: 400  |  Size: 88 KiB

BIN
static/home/vip3.png View File

Before After
Width: 400  |  Height: 400  |  Size: 103 KiB

BIN
static/home/vip4.png View File

Before After
Width: 400  |  Height: 400  |  Size: 105 KiB

BIN
static/instructions/desc.png View File

Before After
Width: 906  |  Height: 1280  |  Size: 588 KiB

BIN
static/loading/logo.png View File

Before After
Width: 553  |  Height: 120  |  Size: 33 KiB

BIN
static/login/bg.png View File

Before After
Width: 1125  |  Height: 2436  |  Size: 665 KiB

BIN
static/login/language.png View File

Before After
Width: 60  |  Height: 60  |  Size: 3.2 KiB

BIN
static/login/logo.png View File

Before After
Width: 553  |  Height: 120  |  Size: 42 KiB

BIN
static/logo.png View File

Before After
Width: 72  |  Height: 72  |  Size: 3.9 KiB

BIN
static/music/c.mp3 View File


BIN
static/music/click.mp3 View File


BIN
static/order/1.jpg View File

Before After

BIN
static/personalInfo/bg.png View File

Before After
Width: 1125  |  Height: 2436  |  Size: 665 KiB

BIN
static/personalInfo/user-image.png View File

Before After
Width: 147  |  Height: 147  |  Size: 10 KiB

BIN
static/prizeDraw/23.png View File

Before After
Width: 132  |  Height: 132  |  Size: 8.8 KiB

BIN
static/prizeDraw/6.png View File

Before After
Width: 132  |  Height: 132  |  Size: 6.4 KiB

BIN
static/prizeDraw/bj.jpg View File

Before After
Width: 720  |  Height: 1280  |  Size: 52 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save