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;
......
<script setup>
import { ref, onMounted } from 'vue'
import { get } from "@/utils/request"
import { get } from '@/utils/request'
import { onMounted, ref } from 'vue'
import png4 from '~/static/pages/my/4.png'
import png5 from '~/static/pages/my/5.png'
import png6 from '~/static/pages/my/6.png'
......@@ -16,23 +16,23 @@ const MY_ICONS = {
house: png8,
service: png9,
app: png10,
group: png11
group: png11,
}
const MENU_ITEMS = [
{ name: "实名认证", icon: MY_ICONS.withdraw, path: "/user/shiming" },
{ name: "提现记录", icon: MY_ICONS.withdraw, path: "/user/withdraw" },
{ name: "我的产品", icon: MY_ICONS.products, path: "/user/product" },
{ name: "房产兑换记录", icon: MY_ICONS.house, path: "/user/house" },
{ name: "在线客服", icon: MY_ICONS.service, path: "/my" },
{ name: "APP下载", icon: MY_ICONS.app, path: "/user" },
{ name: "官方群聊", icon: MY_ICONS.group, path: "/user/group" }
{ name: '实名认证', icon: MY_ICONS.withdraw, path: '/user/shiming' },
{ name: '提现记录', icon: MY_ICONS.withdraw, path: '/user/withdraw' },
{ name: '我的产品', icon: MY_ICONS.products, path: '/user/product' },
{ name: '房产兑换记录', icon: MY_ICONS.house, path: '/user/house' },
{ name: '在线客服', icon: MY_ICONS.service, path: '/my' },
{ name: 'APP下载', icon: MY_ICONS.app, path: '/user' },
{ name: '官方群聊', icon: MY_ICONS.group, path: '/user/group' },
]
definePageMeta({
layout: "main",
title: "我的",
name: "my",
layout: 'main',
title: '我的',
name: 'my',
keepalive: true,
})
......@@ -41,74 +41,78 @@ const userData = ref({})
const loading = ref(true)
const activeCard = ref(null)
const kfUrl = ref('')
const getapkversion = async () => {
async function getapkversion() {
const res = await get('/system/config/configKey/mous/apk_version', {})
kfUrl.value = res.msg
}
getapkversion()
// 处理点击事件
const handleClick = (item) => {
function handleClick(item) {
activeCard.value = item.name
if (item.name === '房产兑换记录') {
showToast('邀约超过100人送140平房产一套,达到目标者找在线客服登记领取')
return
} else if (item.name === '在线客服') {
}
else if (item.name === '在线客服') {
navigateTo(kfUrl.value, { external: true })
return
} else if (item.name === 'APP下载') {
}
else if (item.name === 'APP下载') {
navigateTo('https://download.1yfang.com', { external: true })
return
} else {
}
else {
setTimeout(() => {
navigateTo(item.path)
}, 150)
}
}
const handleClick1 = (type) => {
const url = type === 1 ? "/my/mybankCard" : "/my/myteam"
function handleClick1(type) {
const url = type === 1 ? '/my/mybankCard' : '/my/myteam'
navigateTo(url)
}
const gotx = (balance, type, title) => {
function gotx(balance, type, title) {
if (balance && balance > 0) {
if (userData.value.extend2 != 6) {
if (userData.value.extend2 != 7) {
showFailToast('请先申请化债/扶贫')
setTimeout(() => {
navigateTo('/sqhz')
}, 2000)
} else {
}
else {
navigateTo(`/user/tixian?balance=${balance}&type=${type}&title=${title}`)
}
} else {
}
else {
showFailToast('余额不足')
}
}
const gomx = (tab) => {
function gomx(tab) {
navigateTo(`/user/zjmx?tab=${tab}`)
}
const fetchData = async () => {
async function fetchData() {
try {
loading.value = true
const res = await get("/system/user/")
const res = await get('/system/user/')
userData.value = res
} catch (error) {
console.error("请求失败:", error)
}
catch (error) {
console.error('请求失败:', error)
showFailToast('获取用户信息失败')
} finally {
}
finally {
loading.value = false
}
}
const logout = () => {
function logout() {
showConfirmDialog({
title: "退出确认",
content: "您确定要退出登录吗?",
title: '退出确认',
content: '您确定要退出登录吗?',
}).then(() => {
localStorage.clear()
navigateTo('/login')
});
})
}
fetchData()
......@@ -119,15 +123,15 @@ fetchData()
<var-loading description="加载中..." :loading="loading">
<div class="content-wrapper">
<!-- 用户信息卡片 -->
<div class="card user-card" v-ripple>
<div v-ripple class="card user-card">
<div class="leftbox">
<div class="avatar">
<img src="/static/pages/my/1.png" alt="avatar" />
<img src="/static/pages/my/1.png" alt="avatar">
</div>
<div class="info">
<div class="nickname">
<span>{{ userData?.data === "true" ? userData?.nickName : "用户名" }}</span>
<span class="verify-tag" :class="{ 'verified': userData?.data === 'true' }">
<span class="verify-tag" :class="{ verified: userData?.data === 'true' }">
{{ userData?.data === "true" ? "已实名" : "未实名" }}
</span>
</div>
......@@ -140,89 +144,133 @@ fetchData()
</div>
</div>
<div class="rightbox" @click="navigateTo('/user/singIn')" v-ripple>
<img src="/static/pages/my/2.png" alt="sign" />
<div v-ripple class="rightbox" @click="navigateTo('/user/singIn')">
<img src="/static/pages/my/2.png" alt="sign">
<span>每日签到</span>
</div>
</div>
<!-- 资产卡片 -->
<div class="card asset-card">
<div class="title">我的资产</div>
<div class="title">
我的资产
</div>
<var-divider />
<div class="assets-grid">
<div class="asset-item" v-ripple>
<div class="amount">{{ userData.q0 || 0 }}</div>
<div class="label">信用分</div>
<div v-ripple class="asset-item">
<div class="amount">
{{ userData.q0 || 0 }}
</div>
<div class="label">
信用分
</div>
<div class="actions">
<button class="action-btn secondary" @click="gomx(0)">明细</button>
<button class="action-btn secondary" @click="gomx(0)">
明细
</button>
</div>
</div>
<var-divider vertical margin="0 0" />
<div class="asset-item" v-ripple>
<div class="amount">{{ userData.q1 || 0 }}</div>
<div class="label">生活补贴</div>
<div v-ripple class="asset-item">
<div class="amount">
{{ userData.q1 || 0 }}
</div>
<div class="label">
生活补贴
</div>
<div class="actions">
<button class="action-btn primary" @click="gotx(userData.q1 || 0, 1, '生活补贴')">提现</button>
<button class="action-btn secondary" @click="gomx(1)">明细</button>
<button class="action-btn primary" @click="gotx(userData.q1 || 0, 1, '生活补贴')">
提现
</button>
<button class="action-btn secondary" @click="gomx(1)">
明细
</button>
</div>
</div>
<var-divider vertical margin="0 0" />
<div class="asset-item" v-ripple>
<div class="amount">{{ userData.q2 || 0 }}</div>
<div class="label">产品收益</div>
<div v-ripple class="asset-item">
<div class="amount">
{{ userData.q2 || 0 }}
</div>
<div class="label">
产品收益
</div>
<div class="actions">
<button class="action-btn primary" @click="gotx(userData.q2 || 0, 2, '产品收益')">提现</button>
<button class="action-btn secondary" @click="gomx(2)">明细</button>
<button class="action-btn primary" @click="gotx(userData.q2 || 0, 2, '产品收益')">
提现
</button>
<button class="action-btn secondary" @click="gomx(2)">
明细
</button>
</div>
</div>
<var-divider vertical margin="0 0" />
<div class="asset-item" v-ripple>
<div class="amount">{{ userData.q5 || 0 }}</div>
<div class="label">公司分红</div>
<div v-ripple class="asset-item">
<div class="amount">
{{ userData.q5 || 0 }}
</div>
<div class="label">
公司分红
</div>
<div class="actions">
<button class="action-btn primary" @click="gotx(userData.q5 || 0, 5, '公司分红')">提现</button>
<button class="action-btn secondary" @click="gomx(2)">明细</button>
<button class="action-btn primary" @click="gotx(userData.q5 || 0, 5, '公司分红')">
提现
</button>
<button class="action-btn secondary" @click="gomx(2)">
明细
</button>
</div>
</div>
</div>
<var-divider />
<div class="assets-grid">
<div class="asset-item" v-ripple>
<div class="amount">{{ userData.q6 || 0 }}</div>
<div class="label">分销奖励</div>
<div v-ripple class="asset-item">
<div class="amount">
{{ userData.q6 || 0 }}
</div>
<div class="label">
分销奖励
</div>
<div class="actions">
<button class="action-btn primary" @click="gotx(userData.q6 || 0, 6, '分销奖励')">提现</button>
<button class="action-btn secondary" @click="gomx(6)">明细</button>
<button class="action-btn primary" @click="gotx(userData.q6 || 0, 6, '分销奖励')">
提现
</button>
<button class="action-btn secondary" @click="gomx(6)">
明细
</button>
</div>
</div>
</div>
</div>
<!-- 广告横幅 -->
<div class="banner" v-ripple @click="navigateTo('/user/invite')">
<img src="/static/pages/my/3.png" alt="banner" />
<div v-ripple class="banner" @click="navigateTo('/user/invite')">
<img src="/static/pages/my/3.png" alt="banner">
</div>
<!-- 快捷操作 -->
<div class="quick-actions">
<div v-for="(action, index) in [
<div
v-for="(action, index) in [
{ icon: png4, title: '绑定银行卡', type: 1 },
{ icon: png5, title: '我的团队', type: 2 }
]" :key="index" class="action-card" v-ripple @click="handleClick1(action.type)">
<img :src="action.icon" :alt="action.title" />
{ icon: png5, title: '我的团队', type: 2 },
]" :key="index" v-ripple class="action-card" @click="handleClick1(action.type)"
>
<img :src="action.icon" :alt="action.title">
<span>{{ action.title }}</span>
</div>
</div>
<!-- 菜单列表 -->
<var-paper :elevation="2" class="menu-list">
<var-cell v-for="item in items" :key="item.name" v-ripple
:class="{ 'menu-item-active': activeCard === item.name }" @click="handleClick(item)">
<var-cell
v-for="item in items" :key="item.name" v-ripple
:class="{ 'menu-item-active': activeCard === item.name }" @click="handleClick(item)"
>
<template #default>
<div class="menu-item">
<img :src="item.icon" :alt="item.name" />
<img :src="item.icon" :alt="item.name">
<span>{{ item.name }}</span>
</div>
</template>
......@@ -233,7 +281,7 @@ fetchData()
</var-paper>
<!-- 退出按钮 -->
<var-button class="logout-btn" size="large" block type="danger" v-ripple @click="logout">
<var-button v-ripple class="logout-btn" size="large" block type="danger" @click="logout">
退出登录
</var-button>
</div>
......@@ -261,7 +309,9 @@ fetchData()
border-radius: 12px;
padding: 10px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
transition: transform 0.3s ease, box-shadow 0.3s ease;
transition:
transform 0.3s ease,
box-shadow 0.3s ease;
&:hover {
transform: translateY(-2px);
......@@ -307,7 +357,7 @@ fetchData()
&.verified {
background: rgba(76, 175, 80, 0.1);
color: #4CAF50;
color: #4caf50;
}
}
}
......@@ -364,9 +414,9 @@ fetchData()
width: 25%;
.amount {
font-size: 18px;
font-size: 14px;
font-weight: 600;
color: #2196F3;
color: #2196f3;
margin-bottom: 4px;
}
......@@ -392,13 +442,11 @@ fetchData()
&.primary {
background: #e61d4c;
color: #fff;
}
&.secondary {
background: #30658e;
color: #fff;
}
}
}
......
<script setup>
import { get, post, del } from '@/utils/request'
import { del, get, post } from '@/utils/request'
const loading = ref(false)
const isImageLoaded = ref(false)
definePageMeta({
layout: 'main',
title: '申请化债',
......@@ -10,8 +12,8 @@ const extend2 = ref(1)
const a20 = ref('1')
const usertype = ref({})
const userinfo = ref({})
const getUserInfo = async () => {
const res = await get("/system/user/")
async function getUserInfo() {
const res = await get('/system/user/')
extend2.value = res.extend2 || 1
userinfo.value = res
if (res.data != 'true') {
......@@ -19,7 +21,7 @@ const getUserInfo = async () => {
window.history.back()
}
if (extend2.value == 4) {
get("/yw2/getByUser", {}).then(res => {
get('/yw2/getByUser', {}).then((res) => {
if (res.code == 200) {
formData.value = res.data
}
......@@ -38,16 +40,17 @@ function handleSubmit() {
loading.value = true
formData.value.a5 = '5'
post("/yw2/add", formData.value)
.then(res => {
post('/yw2/add', formData.value)
.then((res) => {
if (res?.code === 200) {
showSuccessToast('申请成功')
getUserInfo()
} else {
}
else {
showFailToast(res?.msg ?? '申请失败')
}
})
.catch(error => {
.catch((error) => {
console.error('提交申请失败:', error)
showFailToast('提交失败,请重试')
})
......@@ -57,14 +60,14 @@ function handleSubmit() {
}
function searchCredit() {
if (userinfo.value.data != 'true') {
showFailToast("请先进行实名认证")
showFailToast('请先进行实名认证')
setTimeout(() => {
}, 2000);
}, 2000)
return false
}
if (extend2.value == 1) {
post("/yw1/add", { a20: 1 }).then(res => {
post('/yw1/add', { a20: 1 }).then((res) => {
showToast('查询已提交,请等待查询结果')
getUserInfo()
})
......@@ -75,7 +78,7 @@ function searchCredit1() {
navigateTo('/sqhz/not')
return
}
post("/yw2/add", { a5: 4, a6: userinfo.value.nickName, a7: userinfo.value.identityId, a20: 1 }).then(res => {
post('/yw2/add', { a5: 4, a6: userinfo.value.nickName, a7: userinfo.value.identityId, a20: 1 }).then((res) => {
showSuccessToast('申请成功')
getUserInfo()
})
......@@ -88,7 +91,7 @@ function searchCredit2() {
navigateTo('/sqhz/not1')
}
function byUserAndTypeOne() {
get("/yw2/byUserAndTypeOne", {}).then(res => {
get('/yw2/byUserAndTypeOne', {}).then((res) => {
if (res.code == 200) {
a20.value = res.data.a20
usertype.value = res.data
......@@ -96,14 +99,41 @@ function byUserAndTypeOne() {
}
})
}
const xieyi = ref(false)
function jihuohu() {
showFailToast('请联系客服激活扶贫化债专用卡,激活此卡可直接将余额提现到本人银行卡')
if (extend2.value == 6 || extend2.value == 7) {
xieyi.value = true
}
}
function qianshu() {
if (extend2.value == 6) {
post('/yw2/add', { a5: 7, a2: usertype.value.a2 }).then(() => {
xieyi.value = false
showSuccessToast('激活成功')
setTimeout(() => {
getUserInfo()
}, 100)
})
}
}
function gotx(balance, type, title) {
if (balance && balance > 0) {
navigateTo(`/user/tixian?balance=${balance}&type=${type}&title=${title}`)
}
else {
showFailToast('余额不足')
}
}
function tixian() {
if (extend2.value == 7) {
gotx(userinfo.value.q4, 4, '扶贫化债专用银行卡')
}
else {
showFailToast('请先激活扶贫化债专用银行卡')
}
}
function deleteFormData() {
del(`/yw2/remove/${formData.value.a2}`, {}).then(res => {
del(`/yw2/remove/${formData.value.a2}`, {}).then(() => {
getUserInfo()
})
}
......@@ -112,10 +142,29 @@ function formatBankCardNumber(cardNumber) {
return ''
}
// 移除非数字字符
const cleaned = cardNumber.replace(/\D/g, '');
const cardParts = cleaned.match(/.{1,4}/g) || [];
const formattedParts = cardParts.map(part => `<view style='letter-spacing: 2px'>${part}</view>`).join(' ');
return formattedParts;
const cleaned = cardNumber.replace(/\D/g, '')
const cardParts = cleaned.match(/.{1,4}/g) || []
const formattedParts = cardParts.map(part => `<view style='letter-spacing: 2px'>${part}</view>`).join(' ')
return formattedParts
}
function getDate() {
if (usertype.value.f1) {
const date = new Date(usertype.value.f1)
const year = date.getFullYear()
const month = date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1
const day = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()
return [year, month, day]
}
else {
const date = new Date()
const year = date.getFullYear()
const month = date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1
const day = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()
return [year, month, day]
}
}
function imageLoaded() {
isImageLoaded.value = true
}
byUserAndTypeOne()
getUserInfo()
......@@ -123,11 +172,43 @@ getUserInfo()
<template>
<div class="container">
<div class="extend21" v-if="extend2 == 1 || extend2 == 2">
<var-popup v-model:show="xieyi" position="bottom">
<div class="xieyi">
<img src="/static/common/xieyi.png" alt="" @load="imageLoaded">
<template v-if="isImageLoaded">
<span class="name name1">
{{ userinfo.nickName }}
</span>
<span class="name name2">
{{ userinfo.identityId }}
</span>
<span class="name name3">
{{ userinfo.nickName }}
</span>
<span class="name name4">
{{ getDate()[0] }}
</span>
<span class="name name5">
{{ getDate()[1] }}
</span>
<span class="name name6">
{{ getDate()[2] }}
</span>
</template>
<var-button class="btn" size="large" block type="primary" @click="qianshu">
我确定激活卡片,签署拨款协议
</var-button>
</div>
</var-popup>
<div v-if="extend2 == 1 || extend2 == 2" class="extend21">
<div class="warpbox">
<img src="/static/common/logo.png" alt="">
<div class="title">全国个人征信</div>
<div class="title" style="margin-bottom: 20px;">信用分查询中心</div>
<div class="title">
全国个人征信
</div>
<div class="title" style="margin-bottom: 20px;">
信用分查询中心
</div>
</div>
<var-form scroll-to-error="start" style="color: #fff;width: calc(100% - 80px);margin: 0 auto;">
<var-space direction="column" :size="[8, 0]">
......@@ -136,15 +217,18 @@ getUserInfo()
<var-input v-model="userinfo.q0" readonly placeholder="当前信用分" />
</var-space>
</var-form>
<div class="tips" style="margin: 20px 40px;text-indent: 2em;" v-if="extend2 == 2">您好,{{ userinfo.nickName
<div v-if="extend2 == 2" class="tips" style="margin: 20px 40px;text-indent: 2em;">
您好,{{ userinfo.nickName
}},身份证号:{{ userinfo.identityId }},
您的个人信用分正在查询当中,信用分查询完成,您可以申请化债,扶贫,10分钟左右即可查询完毕,请10分钟后再来查看您的信用分</div>
<var-button class="btn" v-if="extend2 == 1" size="large" block type="primary" @click="searchCredit">{{ extend2 ==
1 ? '点击查询' :
'查询中' }}
您的个人信用分正在查询当中,信用分查询完成,您可以申请化债,扶贫,10分钟左右即可查询完毕,请10分钟后再来查看您的信用分
</div>
<var-button v-if="extend2 == 1" class="btn" size="large" block type="primary" @click="searchCredit">
{{ extend2
== 1 ? '点击查询'
: '查询中' }}
</var-button>
</div>
<div class="extend22" v-if="extend2 == 3">
<div v-if="extend2 == 3" class="extend22">
<div class="zhanwei">
<img src="/static/common/111.png" alt="">
</div>
......@@ -160,23 +244,44 @@ getUserInfo()
</var-space>
</var-form>
</div>
<var-button class="btn" size="large" block type="primary" @click="searchCredit1">申请化债</var-button>
<var-button class="btn" style="margin: 20px auto 0;" size="large" block type="primary"
@click="searchCredit2">我没有负债,需要申请扶贫</var-button>
<var-button class="btn" size="large" block type="primary" @click="searchCredit1">
申请化债
</var-button>
<var-button class="btn" style="margin: 20px auto 0;" size="large" block type="primary" @click="searchCredit2">
我没有负债,需要申请扶贫
</var-button>
<div class="ctitle">
中央经济2025申请化债/扶贫规则
</div>
<div class="tips" style="margin: 20px 20px 0;">一、申请条件</div>
<div class="tips" style="margin: 0 20px;">1.在中央经济2025平台的信用分必须达到才可以申请化债或者扶贫(只能申请一项)</div>
<div class="tips" style="margin: 0 20px;">2.遵守中华人民共和国法律法规,具有良好的品行道德,自觉践行新时代人民精神;</div>
<div class="tips" style="margin: 0 20px;">3.执行国家化债/扶贫计划统筹衔接的相关要求。同层次国家化债/扶贫计划只能承担一项,不能逆层次申请。</div>
<div class="tips" style="margin: 0 20px;">二、申请人条件</div>
<div class="tips" style="margin: 0 20px;">1. 中国合法公民</div>
<div class="tips" style="margin: 0 20px;">2.年满18周岁</div>
<div class="tips" style="margin: 0 20px;">*此申请表格填写完成后,直接上传至中央财政扶贫专项系统,请认真检查是否填写正确完整,提交后无法更改</div>
<div class="tips" style="margin: 0 20px;">*请勿盗用他人资料,违法者将依法追究刑事责任</div>
</div>
<div class="extend22 extend222 " v-if="extend2 == 4">
<div class="tips" style="margin: 20px 20px 0;">
一、申请条件
</div>
<div class="tips" style="margin: 0 20px;">
1.在中央经济2025平台的信用分必须达到才可以申请化债或者扶贫(只能申请一项)
</div>
<div class="tips" style="margin: 0 20px;">
2.遵守中华人民共和国法律法规,具有良好的品行道德,自觉践行新时代人民精神;
</div>
<div class="tips" style="margin: 0 20px;">
3.执行国家化债/扶贫计划统筹衔接的相关要求。同层次国家化债/扶贫计划只能承担一项,不能逆层次申请。
</div>
<div class="tips" style="margin: 0 20px;">
二、申请人条件
</div>
<div class="tips" style="margin: 0 20px;">
1. 中国合法公民
</div>
<div class="tips" style="margin: 0 20px;">
2.年满18周岁
</div>
<div class="tips" style="margin: 0 20px;">
*此申请表格填写完成后,直接上传至中央财政扶贫专项系统,请认真检查是否填写正确完整,提交后无法更改
</div>
<div class="tips" style="margin: 0 20px;">
*请勿盗用他人资料,违法者将依法追究刑事责任
</div>
</div>
<div v-if="extend2 == 4" class="extend22 extend222">
<div class="card">
<div class="title">
申请化债信息
......@@ -186,13 +291,13 @@ getUserInfo()
<var-input v-model="formData.a6" readonly placeholder="申请人姓名" :rules="v => !!v || '申请人姓名不能为空'" />
<var-input v-model="formData.a7" readonly placeholder="申请人身份证" :rules="v => !!v || '申请人身份证不能为空'" />
<var-input v-model="formData.a8" placeholder="请输入负债原因" :rules="v => !!v || '负债原因不能为空'" />
<var-select placeholder="请选择负债金额" :rules="v => !!v || '负债金额不能为空'" v-model="formData.a4">
<var-select v-model="formData.a4" placeholder="请选择负债金额" :rules="v => !!v || '负债金额不能为空'">
<var-option label="1-100万" />
<var-option label="100万-200万" />
<var-option label="200万-300万" />
<var-option label="300万-400万" />
</var-select>
<var-select placeholder="家里是否有他人负债" :rules="v => !!v || '是否有他人负债不能为空'" v-model="formData.a9">
<var-select v-model="formData.a9" placeholder="家里是否有他人负债" :rules="v => !!v || '是否有他人负债不能为空'">
<var-option label="有" />
<var-option label="无" />
</var-select>
......@@ -203,28 +308,50 @@ getUserInfo()
<var-button v-debounce="() => handleSubmit()" size="large" block type="danger" :loading="loading">
申请化债
</var-button>
<var-button style="margin-top: 20px;" v-debounce="() => deleteFormData()" size="large" block type="success"
:loading="loading">
<var-button
v-debounce="() => deleteFormData()" style="margin-top: 20px;" size="large" block type="success"
:loading="loading"
>
返回
</var-button>
<div class="ctitle">
中央经济2025申请化债/扶贫规则
</div>
<div class="tips" style="margin: 20px 20px 0;">一、申请条件</div>
<div class="tips" style="margin: 0 20px;">1.在中央经济2025平台的信用分必须达到才可以申请化债或者扶贫(只能申请一项)</div>
<div class="tips" style="margin: 0 20px;">2.遵守中华人民共和国法律法规,具有良好的品行道德,自觉践行新时代人民精神;</div>
<div class="tips" style="margin: 0 20px;">3.执行国家化债/扶贫计划统筹衔接的相关要求。同层次国家化债/扶贫计划只能承担一项,不能逆层次申请。</div>
<div class="tips" style="margin: 0 20px;">二、申请人条件</div>
<div class="tips" style="margin: 0 20px;">1. 中国合法公民</div>
<div class="tips" style="margin: 0 20px;">2.年满18周岁</div>
<div class="tips" style="margin: 0 20px;">*此申请表格填写完成后,直接上传至中央财政扶贫专项系统,请认真检查是否填写正确完整,提交后无法更改</div>
<div class="tips" style="margin: 0 20px;">*请勿盗用他人资料,违法者将依法追究刑事责任</div>
<div class="tips" style="margin: 20px 20px 0;">
一、申请条件
</div>
<div class="tips" style="margin: 0 20px;">
1.在中央经济2025平台的信用分必须达到才可以申请化债或者扶贫(只能申请一项)
</div>
<div class="tips" style="margin: 0 20px;">
2.遵守中华人民共和国法律法规,具有良好的品行道德,自觉践行新时代人民精神;
</div>
<div class="tips" style="margin: 0 20px;">
3.执行国家化债/扶贫计划统筹衔接的相关要求。同层次国家化债/扶贫计划只能承担一项,不能逆层次申请。
</div>
<div class="tips" style="margin: 0 20px;">
二、申请人条件
</div>
<div class="extend22" v-if="extend2 == 5">
<div class="tips" style="margin: 0 20px;">
1. 中国合法公民
</div>
<div class="tips" style="margin: 0 20px;">
2.年满18周岁
</div>
<div class="tips" style="margin: 0 20px;">
*此申请表格填写完成后,直接上传至中央财政扶贫专项系统,请认真检查是否填写正确完整,提交后无法更改
</div>
<div class="tips" style="margin: 0 20px;">
*请勿盗用他人资料,违法者将依法追究刑事责任
</div>
</div>
</div>
<div v-if="extend2 == 5" class="extend22">
<div class="card" style="display: flex;flex-direction: column;align-items: center;padding-top: 100px;">
<var-icon name="history" size="100" color="#029ae0" />
<div class="title">您的{{ a20 == 1 ? '征信申请' : '扶贫申请' }}正在审核中,请耐心等待...</div>
<div class="title">
您的{{ a20 == 1 ? '征信申请' : '扶贫申请' }}正在审核中,请耐心等待...
</div>
<var-divider />
<var-form scroll-to-error="start" style="width: 100%;">
<var-space direction="column" :size="[8, 0]">
......@@ -236,16 +363,19 @@ getUserInfo()
</var-form>
</div>
</div>
<div class="extend22" v-if="extend2 == 6">
<div v-if="extend2 == 6 || extend2 == 7" class="extend22">
<div class="card">
<div class="cardwarp">
<img src="/static/common/2222.png" alt="" style="margin-top: 80px;">
<div class="cardnum" v-html="userinfo.bankcard ?
formatBankCardNumber(userinfo.bankcard) :
''"></div>
<div
class="cardnum" v-html="userinfo.bankcard
? formatBankCardNumber(userinfo.bankcard)
: ''"
/>
</div>
<div
style="margin-top: 20px;display: flex;justify-content: center;align-items: center;font-size: 24px;font-weight: 700;">
style="margin-top: 20px;display: flex;justify-content: center;align-items: center;font-size: 18px;font-weight: 700;"
>
卡内余额:¥
<var-count-to :to="userinfo.q4" :precision="2" style="font-size: 28px;font-weight: 700;">
<template #default="{ value }">
......@@ -254,8 +384,15 @@ getUserInfo()
</var-count-to>
</div>
<div class="btngroup" style="display: flex;justify-content: space-between;align-items: center;">
<var-button class="btn" size="large" block type="primary" @click="jihuohu">激活领取此卡</var-button>
<var-button class="btn btn1" size="large" block @click="tixian">提现</var-button>
<var-button v-if="extend2 == 6" class="btn" size="large" block type="primary" @click="jihuohu">
激活领取此卡
</var-button>
<var-button v-if="extend2 == 7" class="btn" size="large" block type="danger">
已激活卡片,请提现
</var-button>
<var-button class="btn1 btn" size="large" block @click="tixian">
提现
</var-button>
</div>
</div>
</div>
......@@ -263,6 +400,55 @@ getUserInfo()
</template>
<style lang="scss" scoped>
.xieyi {
position: relative;
img {
width: 100%;
height: 500px;
}
.name {
display: inline-block;
position: absolute;
top: 0;
left: 0;
background: #fff;
font-size: 10px;
color: #000;
}
.name1 {
top: 107px;
left: 80px;
}
.name2 {
top: 107px;
left: 182px;
}
.name3 {
top: 354px;
left: 263px;
}
.name4 {
top: 425px;
left: 218px;
}
.name5 {
top: 425px;
left: 253px;
}
.name6 {
top: 425px;
left: 275px;
}
}
.container {
font-family: pingfang;
min-height: 100vh;
......@@ -288,7 +474,6 @@ getUserInfo()
img {
width: 50px;
margin-bottom: 20px;
}
.title {
......@@ -314,8 +499,6 @@ getUserInfo()
font-size: 26px;
font-weight: 700;
}
}
.extend22 {
......@@ -408,6 +591,5 @@ getUserInfo()
z-index: 1;
}
}
}
</style>
<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>
......
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