Commit fe4d3713 authored by qd01's avatar qd01

开放提现

parent 125778df
<template>
<div class="auth-container">
<var-card style="flex: 0;" class="login-form">
<var-tabs v-model:active="active">
<var-tab style="font-size: 18px;">登录</var-tab>
<var-tab style="font-size: 18px;">注册</var-tab>
</var-tabs>
<var-form ref="form" :model="formData" :rules="rules">
<var-input v-model="formData.username" placeholder="手机号" :rules="[rules.username]" />
<var-input v-model="formData.password" type="password" placeholder="密码" :rules="[rules.password]" />
<template v-if="active">
<var-input v-model="formData.confirmPassword" type="password" placeholder="确认密码"
:rules="[rules.confirmPassword]" />
<var-input v-model="formData.inviteCode" placeholder="邀请码" :rules="[rules.inviteCode]" />
</template>
<var-button class="btn" block type="primary" :loading="loading"
:style="{ marginTop: active ? '59px' : '180px' }" v-debounce="() => handleSubmit()" size="large">
{{ active ? '立即注册' : '登录' }}
</var-button>
</var-form>
</var-card>
<div class="warp">
<div class="warp-item" @click="navigateTo(kfUrl, { external: true })">
<img src="/static/common/3.png" alt="">
<span>联系客服</span>
</div>
<div class="warp-item" @click="navigateTo(appdownload, { external: true })">
<img src="/static/common/4.png" alt="">
<span>APP下载</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { validatePhone, validatePassword } from '@/utils/validate'
import { useProseStore } from '@/stores/prose'
import { encrypt } from '@/utils/encrypt'
import { post } from '@/utils/request'
import { validatePassword, validatePhone } from '@/utils/validate'
import { useDebounceFn } from '@vueuse/core'
import { useProseStore } from '@/stores/prose'
import { reactive, ref } from 'vue'
const proseStore = useProseStore()
proseStore.clearProse()
definePageMeta({
......@@ -48,8 +13,9 @@ definePageMeta({
})
const appdownload = ref('https://download.1yfang.com')
const kfUrl = ref('')
const getapkversion = async () => {
async function getapkversion() {
const res = await get('/system/config/configKey/mous/apk_version', {})
console.log(res)
kfUrl.value = res.msg
}
getapkversion()
......@@ -73,33 +39,33 @@ const rules = {
username: {
validator: (value: string) => validatePhone(value),
message: '请输入正确的手机号',
trigger: 'onChange'
trigger: 'onChange',
},
password: {
validator: (value: string) => validatePassword(value),
message: '密码格式有误(5-20位字母数字下划线)',
trigger: 'onChange'
trigger: 'onChange',
},
confirmPassword: {
validator: (value: string) => value === formData.password,
message: '两次输入的密码不一致',
trigger: 'onChange'
trigger: 'onChange',
},
inviteCode: {
required: active.value,
message: '请输入邀请码',
trigger: 'onChange'
}
trigger: 'onChange',
},
}
// 登录处理
const handleLogin = async () => {
async function handleLogin() {
try {
loading.value = true
const res = await post('/login', {
username: formData.username,
password: formData.password,
type: 'app'
type: 'app',
})
if (res.code === 200) {
......@@ -110,18 +76,21 @@ const handleLogin = async () => {
setTimeout(() => {
navigateTo('/')
}, 1000)
} else {
}
else {
showFailToast(res.msg || '登录失败')
}
} catch (error) {
}
catch (error) {
showFailToast('登录失败,请稍后重试')
} finally {
}
finally {
loading.value = false
}
}
// 注册处理
const handleRegister = async () => {
async function handleRegister() {
try {
loading.value = true
const res = await post('/register', {
......@@ -129,7 +98,7 @@ const handleRegister = async () => {
password: encrypt(formData.password),
code: '',
type: encrypt('app'),
yqm: formData.inviteCode
yqm: formData.inviteCode,
})
if (res.code === 200) {
......@@ -140,33 +109,81 @@ const handleRegister = async () => {
setTimeout(() => {
navigateTo('/')
}, 1000)
} else {
}
else {
showFailToast(res.msg || '注册失败')
}
} catch (error) {
}
catch (error) {
console.error('Register error:', error)
showFailToast('注册失败,请稍后重试')
} finally {
}
finally {
loading.value = false
}
}
// 表单提交(带防抖)
const handleSubmit = useDebounceFn(async () => {
if (!form.value) return
if (!form.value)
return
const valid = await form.value.validate()
if (!valid) return
if (!valid)
return
if (active.value) {
await handleRegister()
} else {
}
else {
await handleLogin()
}
}, 1000)
</script>
<template>
<div class="auth-container">
<var-card style="flex: 0;" class="login-form">
<var-tabs v-model:active="active">
<var-tab style="font-size: 18px;">
登录
</var-tab>
<var-tab style="font-size: 18px;">
注册
</var-tab>
</var-tabs>
<var-form ref="form" :model="formData" :rules="rules">
<var-input v-model="formData.username" placeholder="手机号" :rules="[rules.username]" />
<var-input v-model="formData.password" type="password" placeholder="密码" :rules="[rules.password]" />
<template v-if="active">
<var-input
v-model="formData.confirmPassword" type="password" placeholder="确认密码"
:rules="[rules.confirmPassword]"
/>
<var-input v-model="formData.inviteCode" placeholder="邀请码" :rules="[rules.inviteCode]" />
</template>
<var-button
v-debounce="() => handleSubmit()" class="btn" block type="primary"
:loading="loading" :style="{ marginTop: active ? '59px' : '180px' }" size="large"
>
{{ active ? '立即注册' : '登录' }}
</var-button>
</var-form>
</var-card>
<div class="warp">
<div class="warp-item" @click="navigateTo(kfUrl, { external: true })">
<img src="/static/common/3.png" alt="">
<span>联系客服</span>
</div>
<div class="warp-item" @click="navigateTo(appdownload, { external: true })">
<img src="/static/common/4.png" alt="">
<span>APP下载</span>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.auth-container {
......@@ -185,7 +202,6 @@ const handleSubmit = useDebounceFn(async () => {
background-color: #e62129;
}
.warp {
display: flex;
justify-content: space-between;
......
This diff is collapsed.
This diff is collapsed.
<script setup>
import { ref, watch, } from 'vue'
import { ref, watch } from 'vue'
import { post } from '~/utils/request'
const route = useRoute()
definePageMeta({
layout: "default",
title: "提现记录",
name: "withdraw",
layout: 'default',
title: '提现记录',
name: 'withdraw',
keepalive: true,
});
})
// 响应式数据
const list = ref([])
......@@ -22,15 +22,15 @@ const emptyTipsShow = ref(false)
// 下拉选项
const range = ref([
{ text: "生活补贴", value: 1 },
{ text: "产品收益", value: 2 },
{ text: '生活补贴', value: 1 },
{ text: '产品收益', value: 2 },
])
// 获取路由参数中的tab
const active = ref(Number(route.query.tab) || 1)
// 重置列表状态
const resetList = () => {
function resetList() {
list.value = []
pageNum.value = 1
finished.value = false
......@@ -43,11 +43,11 @@ watch(active, () => {
resetList()
})
const getList = async () => {
async function getList() {
try {
const data = {
withdrawType: active.value,
beginDate: "2025-01"
beginDate: '',
}
const res = await post(`/ops/withdraw/list?pageNum=${pageNum.value}&pageSize=${pageSize.value}`, data)
if (res.code === 200) {
......@@ -55,64 +55,92 @@ const getList = async () => {
total.value = res.total || 0
if (list.value.length >= total.value) {
finished.value = true
} else {
}
else {
pageNum.value++
}
if (list.value.length >= total.value) {
finished.value = true
}
} else {
}
else {
showFailToast(res.msg || '加载失败')
finished.value = true
}
} catch (error) {
}
catch (error) {
console.error('获取列表失败:', error)
showFailToast('加载失败,请重试')
} finally {
}
finally {
loading.value = false
}
}
// Tab 点击处理
const handleClick = (item) => {
if (active.value == item.value) return
function handleClick(item) {
if (active.value == item.value)
return
active.value = item.value
resetList()
}
</script>
<template>
<div class="wallet-detail">
<!-- Tabs -->
<var-tabs v-model:active="active" class="fixed-tabs">
<var-tab :name="item.value" v-for="item in range" :key="item.value" @click="handleClick(item)">
<var-tab v-for="item in range" :key="item.value" :name="item.value" @click="handleClick(item)">
{{ item.text }}
</var-tab>
</var-tabs>
<!-- List -->
<van-list class="list-container" v-model:loading="loading" :finished="finished" finished-text="没有更多了"
@load="getList">
<div class="list" v-for="(item, index) in list" :key="index">
<van-list
v-model:loading="loading" class="list-container" :finished="finished" finished-text="没有更多了"
@load="getList"
>
<div v-for="(item, index) in list" :key="index" class="list">
<div class="left">
<div class="title" v-if="item.walletType == 1">生活补贴</div>
<div class="title" v-if="item.walletType == 2">产品收益</div>
<div class="price">+{{ item.withdrawAmount }}</div>
<div v-if="item.walletType == 1" class="title">
生活补贴
</div>
<div v-if="item.walletType == 2" class="title">
产品收益
</div>
<div class="price">
+{{ item.withdrawAmount }}
</div>
</div>
<div class="left">
<div class="title">申请时间</div>
<div class="date">{{ item.createTime }}</div>
<div class="title">
申请时间
</div>
<div class="date">
{{ item.createTime }}
</div>
</div>
<div class="left">
<div class="title">申请状态</div>
<div class="title">
申请状态
</div>
<div class="date status">
<div class="title" v-if="item.status == 0">待打款</div>
<div class="title" v-if="item.status == 1">资金校对中</div>
<div class="title success" v-if="item.status == 2">已到账,请查收</div>
<div class="title reject" v-if="item.status == 3">驳回</div>
<div class="title reject" v-if="item.status == 4">请先申请化债/扶贫后统一提现</div>
<div v-if="item.status == 0" class="title">
待打款
</div>
<div v-if="item.status == 1" class="title">
资金校对中
</div>
<div v-if="item.status == 2" class="title success">
已到账,请查收
</div>
<div v-if="item.status == 3" class="title reject">
驳回
</div>
<div v-if="item.status == 4" class="title reject">
请先申请化债/扶贫后统一提现
</div>
</div>
</div>
<!-- <var-steps :current="item.status" dot>
......@@ -122,7 +150,6 @@ const handleClick = (item) => {
<var-step v-if="item.status >= 3">到账失败</var-step>
</var-steps> -->
</div>
</van-list>
</div>
</template>
......@@ -147,7 +174,6 @@ const handleClick = (item) => {
background: #f5f6f8;
}
.list {
background: #fff;
margin-bottom: 10px;
......@@ -172,7 +198,7 @@ const handleClick = (item) => {
.date {
font-size: 12px;
color: #B2B2B2;
color: #b2b2b2;
height: 1.5vh;
line-height: 1.5vh;
......
......@@ -5,11 +5,11 @@ import { post } from '~/utils/request'
const route = useRoute()
definePageMeta({
layout: "default",
title: "资金明细",
name: "zjmx",
layout: 'default',
title: '资金明细',
name: 'zjmx',
keepalive: true,
});
})
// 响应式数据
const list = ref([])
......@@ -22,18 +22,18 @@ const emptyTipsShow = ref(false)
// 下拉选项
const range = ref([
{ text: "信用分", value: 0 },
{ text: "生活补贴", value: 1 },
{ text: "产品收益", value: 2 },
{ text: "公司分红", value: 5 },
{ text: "分销奖励", value: 6 },
{ text: '信用分', value: 0 },
{ text: '生活补贴', value: 1 },
{ text: '产品收益', value: 2 },
{ text: '公司分红', value: 5 },
{ text: '分销奖励', value: 6 },
])
// 获取路由参数中的tab
const active = ref(Number(route.query.tab) || 0)
// 重置列表状态
const resetList = () => {
function resetList() {
list.value = []
pageNum.value = 1
finished.value = false
......@@ -44,18 +44,19 @@ const resetList = () => {
}
// Tab 点击处理
const handleClick = (item) => {
if (active.value === item.value) return
function handleClick(item) {
if (active.value === item.value)
return
active.value = item.value
resetList()
}
const getList = async () => {
async function getList() {
if (loading.value) { // 添加loading检查,避免重复请求
try {
const data = {
balanceType: active.value,
beginDate: "2025-01"
beginDate: '',
}
const res = await post(`/ops/walletdetail/list?pageNum=${pageNum.value}&pageSize=${pageSize.value}`, {
...data,
......@@ -65,17 +66,21 @@ const getList = async () => {
total.value = res.total || 0
if (list.value.length >= total.value) {
finished.value = true
} else {
}
else {
pageNum.value++
}
} else {
}
else {
showFailToast(res.msg || '加载失败')
finished.value = true
}
} catch (error) {
}
catch (error) {
console.error('获取列表失败:', error)
showFailToast('加载失败,请重试')
} finally {
}
finally {
loading.value = false
}
}
......@@ -98,8 +103,8 @@ onMounted(() => {
<!-- List -->
<van-list
class="list-container"
v-model:loading="loading"
class="list-container"
:finished="finished"
finished-text="没有更多了"
@load="getList"
......@@ -110,11 +115,11 @@ onMounted(() => {
<div class="type-info">
<span class="type-text">
{{
item.balanceType == 0 ? '信用分' :
item.balanceType == 1 ? '生活补贴' :
item.balanceType == 2 ? '产品收益' :
item.balanceType == 5 ? '公司分红' :
item.balanceType == 6 ? '分销奖励' : ''
item.balanceType == 0 ? '信用分'
: item.balanceType == 1 ? '生活补贴'
: item.balanceType == 2 ? '产品收益'
: item.balanceType == 5 ? '公司分红'
: item.balanceType == 6 ? '分销奖励' : ''
}}
</span>
</div>
......
This diff is collapsed.
import process from "node:process";
import { appDescription } from "./app/constants/index";
import process from 'node:process'
import obfuscatorPlugin from 'vite-plugin-javascript-obfuscator'
import { appDescription } from './app/constants/index'
import preload from './app/utils/preload'
import obfuscatorPlugin from "vite-plugin-javascript-obfuscator";
export default defineNuxtConfig({
nitro: {
devProxy: {
'/api': {
// target: 'http://27.124.5.14:9014', // 你要代理的目标地址
target: 'https://wbe.1yfang.com:6443/api', // 你要代理的目标地址
// target: 'http://27.124.5.14:9012', // 你要代理的目标地址
target: 'https://www.mxr2020.com:6443/api', // 你要代理的目标地址
changeOrigin: true,
prependPath: true,
rewrite: (path: string) => path.replace(/^\/api/, '')
}
rewrite: (path: string) => path.replace(/^\/api/, ''),
},
},
minify: true,
compressPublicAssets: true,
......@@ -21,13 +22,13 @@ export default defineNuxtConfig({
},
modules: [
"@unocss/nuxt",
"@nuxtjs/color-mode",
"@nuxt/eslint",
"@pinia/nuxt",
"pinia-plugin-persistedstate/nuxt",
"@varlet/nuxt",
'@vant/nuxt'
'@unocss/nuxt',
'@nuxtjs/color-mode',
'@nuxt/eslint',
'@pinia/nuxt',
'pinia-plugin-persistedstate/nuxt',
'@varlet/nuxt',
'@vant/nuxt',
],
runtimeConfig: {
public: {
......@@ -35,69 +36,69 @@ export default defineNuxtConfig({
},
},
plugins: [
'~/plugins/debounce.js'
'~/plugins/debounce.js',
],
css: [
"@unocss/reset/tailwind.css",
"./app/styles/vars.css",
"./app/styles/global.css",
"./app/styles/default-theme.css",
'@unocss/reset/tailwind.css',
'./app/styles/vars.css',
'./app/styles/global.css',
'./app/styles/default-theme.css',
],
postcss: {
plugins: {
autoprefixer: {},
'autoprefixer': {},
// https://github.com/wswmsword/postcss-mobile-forever
"postcss-mobile-forever": {
appSelector: "#__nuxt",
'postcss-mobile-forever': {
appSelector: '#__nuxt',
viewportWidth: 375,
maxDisplayWidth: 600,
// devtools excluded
exclude: /@nuxt/,
border: true,
rootContainingBlockSelectorList: ["van-tabbar", "van-popup"],
rootContainingBlockSelectorList: ['van-tabbar', 'van-popup'],
},
},
},
colorMode: {
classSuffix: "",
preference: "system",
fallback: "light",
storageKey: "nuxt-color-mode",
classSuffix: '',
preference: 'system',
fallback: 'light',
storageKey: 'nuxt-color-mode',
},
app: {
pageTransition: {
name: 'fade',
mode: 'out-in' // 默认值
mode: 'out-in', // 默认值
},
layoutTransition: {
name: 'fade',
mode: 'out-in' // 默认值
mode: 'out-in', // 默认值
},
head: {
viewport: "width=device-width,initial-scale=1,viewport-fit=cover",
link: [{ rel: "icon", href: "/favicon.ico", sizes: "any" }],
viewport: 'width=device-width,initial-scale=1,viewport-fit=cover',
link: [{ rel: 'icon', href: '/favicon.ico', sizes: 'any' }],
meta: [
{
name: "viewport",
content: "width=device-width, initial-scale=1, viewport-fit=cover",
name: 'viewport',
content: 'width=device-width, initial-scale=1, viewport-fit=cover',
},
{ name: "description", content: appDescription },
{ name: 'description', content: appDescription },
{
name: "apple-mobile-web-app-status-bar-style",
content: "black-translucent",
name: 'apple-mobile-web-app-status-bar-style',
content: 'black-translucent',
},
{
name: "theme-color",
media: "(prefers-color-scheme: light)",
content: "#ffffff",
name: 'theme-color',
media: '(prefers-color-scheme: light)',
content: '#ffffff',
},
{
name: "theme-color",
media: "(prefers-color-scheme: dark)",
content: "#222222",
name: 'theme-color',
media: '(prefers-color-scheme: dark)',
content: '#222222',
},
],
script: [
......@@ -120,7 +121,7 @@ export default defineNuxtConfig({
// }),
],
build: {
target: "es2015", // 已经正确设置为 es2015
target: 'es2015', // 已经正确设置为 es2015
minify: 'terser',
terserOptions: {
compress: {
......@@ -135,7 +136,7 @@ export default defineNuxtConfig({
},
},
optimizeDeps: {
include: ["@intlify/core-base", "@intlify/shared", "is-https"],
include: ['@intlify/core-base', '@intlify/shared', 'is-https'],
},
},
......@@ -189,7 +190,6 @@ export default defineNuxtConfig({
compatibilityVersion: 4,
},
compatibilityDate: "2024-09-24",
compatibilityDate: '2024-09-24',
});
})
......@@ -41,6 +41,9 @@ importers:
qrcode:
specifier: ^1.5.4
version: 1.5.4
sign-canvas-plus:
specifier: ^2.0.3
version: 2.0.3(typescript@5.7.2)
vue:
specifier: ^3.5.13
version: 3.5.13(typescript@5.7.2)
......@@ -4927,6 +4930,9 @@ packages:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
sign-canvas-plus@2.0.3:
resolution: {integrity: sha512-EHcE9Z8SATs5UvQC/G5zLGmdznlepaar552i/w6W81+893NizjNEMUxXPaB46fEpwq/M+8T1C4BnTSk4NtpJsA==}
signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
......@@ -11438,6 +11444,12 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
sign-canvas-plus@2.0.3(typescript@5.7.2):
dependencies:
vue: 3.5.13(typescript@5.7.2)
transitivePeerDependencies:
- typescript
signal-exit@3.0.7: {}
signal-exit@4.1.0: {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment