26/8/1404

This commit is contained in:
2025-11-17 15:03:25 +03:30
parent 23ae6c144c
commit 28506f65ea
9 changed files with 132 additions and 33 deletions
+4
View File
@@ -11,4 +11,8 @@ export const transferRegister = async (obj: Transfer): Promise<any> => {
export async function getTransfers(payload: TransferList) {
return await useAxios.post(`customer/havale_list` , payload)
}
export async function deleteCard(id: number) {
return await useAxios.delete(`customer/account/${id}`)
}
+1
View File
@@ -70,6 +70,7 @@ export interface Test {
export interface Card {
id?: number
card_id?: number
birth_date: number
cart_number?: string
shaba_number?: string
+4 -4
View File
@@ -1,8 +1,8 @@
export function useCardNumber(val: number) {
const str = val.toString()
export function useCardNumber(val: number | string) {
const str = val?.toString() ?? ''
return `${str.substring(0,4)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(4,8)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(8,12)}\xa0\xa0\xa0\xa0\xa0\xa0${str.substring(12,16)}`
}
export function useShabaNumber(val: number) {
const str = val.toString()
export function useShabaNumber(val: number | string) {
const str = val?.toString() ?? ''
return `IR${str.substring(0,4)}\xa0\xa0\xa0${str.substring(4,8)}\xa0\xa0\xa0${str.substring(8,12)}\xa0\xa0\xa0${str.substring(12,16)}\xa0\xa0\xa0${str.substring(16,20)}\xa0\xa0\xa0${str.substring(20,24)}`
}
+31 -12
View File
@@ -17,24 +17,43 @@
<div class="bg-primary text-white rounded-[12px] p-4 text-xs leading-5">
<div class="w-full h-1px my-3 bg-tertiary"></div>
<div>
طلا علاوه بر کاربرد در ساخت زیورآلات، از دوران کهن به عنوان یک فلز ارزشمند و دارایی
مقاوم در برابر تورم شناخته می‌شود، به طوری که سرمایه‌گذاران حرفه‌ای همواره بخشی از
سبد سرمایه‌گذاری‌شان را به طلا اختصاص می‌دهند.
قطره، نخستین اپلیکیشن خرید و فروش آنلاین طلا در استان خراسان جنوبی است که امکان خرید، فروش و سرمایه‌گذاری بر روی طلا را با هر میزان بودجه — از ۵۰ سوت تا چند کیلوگرم — برای کاربران فراهم کرده است.
</div>
<div class="mt-3">
با وجود گسترش فناوری‌های نوین در همه حوزه‌ها، ما در قطره با
تلفیق تجربه سنتی خود در بازار طلا و با دانش تخصصی خود و با بهره‌گیری از سوابق موفق
قبلی در حوزه فینتک، اقدام به ایجاد قطره نمودیم.
این اپلیکیشن با مجوزهای قانونی لازم و با پشتوانه‌ی معتبر مجموعه طلا و آبشده نور هشتم، که سال‌ها به‌صورت صادقانه و حرفه‌ای در حوزه‌ی طلا فعالیت داشته است، محیطی ایمن، شفاف و قابل اعتماد را برای انجام معاملات طلا فراهم می‌کند.
</div>
<div class="mt-3">
مهم‌ترین ارزش پیشنهادی قطره، امکان پس انداز تدریجی طلا با سرمایه‌های خرد و بدون
پرداخت هزینه‌های جانبی است و در این راستا قطره تمام تلاش خود را نموده است تا از
ابتدای سال 1401 با رونمایی محصول اولیه، برای همه افراد با هر سطحی از دارایی، بستری
امن و مطمئن ایجاد نماید.
همچنین کاربران پس از خرید آنلاین، می‌توانند با مراجعه حضوری به شعب مجموعه نور هشتم، طلای خود را به‌صورت فیزیکی دریافت کنند.
</div>
<div class="w-full h-1px my-3 bg-tertiary"></div>
<div class="mt-3 text-xl font-bold">چرا قطره؟</div>
<div class="mt-3">
۱. خرید بدون اجرت و مالیات
طلایی که از اپلیکیشن قطره خریداری می‌کنید، بدون اجرت ساخت و مالیات محاسبه می‌شود و تنها ۰.۵٪ کارمزد از شما دریافت خواهد شد.
</div>
<div class="mt-3">
علاوه بر این قطره به عنوان یک واحد فناور از سال 1403 با رونمایی نسخه کاملا آنلاین
و نرم افزاری وارد فاز جدیدی از خرید و فروش طلای آب شده، شده است.
۲. خرید بدون محدودیت
در قطره می‌توانید از ۵۰ سوت تا چند کیلوگرم طلا را به‌صورت آنلاین و بدون هیچ‌گونه محدودیت مکانی خریداری کنید
</div>
<div class="mt-3">
۳. فعالیت در ساعات رسمی معاملات طلا
برای رعایت قوانین صنف طلا و جلوگیری از خالی‌فروشی، فعالیت اپلیکیشن قطره منطبق با ساعات رسمی معاملات اتحادیه طلافروشان کشور است.
</div>
<div class="mt-3">
۴. امکان تحویل فیزیکی طلا
قطره دارای شعب حضوری معتبر با مجوز خرده‌فروشی طلاست تا کاربران بتوانند در صورت تمایل، طلای خریداری‌شده خود را به‌صورت فیزیکی تحویل بگیرند و از نزدیک از اصالت آن اطمینان حاصل کنند.
</div>
<div class="w-full h-1px my-3 bg-tertiary"></div>
<div class="mt-3">
آدرس : خراسان جنوبی / فردوس / خیابان امام خمینی / سکه و طلای آبشده نورهشتم
</div>
<div class="mt-3">
شماره تماس : 056-32728568
</div>
<div class="mt-3">
ایمیل : Ghtrehgold@gmail.com
</div>
<div class="w-full h-1px my-3 bg-tertiary"></div>
</div>
+6 -4
View File
@@ -8,17 +8,19 @@
</div>
</div>
<div class="p-4">
<div class="text-center p-3 border-solid border-1 rounded-[8px] border-[#521620] ">
<div class=" p-3 border-solid border-1 rounded-[8px] border-[#521620] ">
<div class="flex items-center">
<div class=" bg-[#DBEAFE] h-10 w-10 rounded-100% flex justify-center items-center">
<img :src="coin" />
</div>
<div class="mr-4">
<div class="flex ">
<div class="mr-2">
<div class="flex">
<div class="font-bold">دعوت دوستان</div>
<!-- <div class="text-xs ">راهنمای کسب درآمد</div>-->
</div>
<div class="text-center mt-2 text-xs">هر دعوت موفق 10 سوت طلا هدیه</div>
<div class=" mt-2 text-xs">با دعوت دوستانتان به اپلیکیشن قطره،
دوست شما اولین خرید خود را بدون کارمزد انجام می‌دهد
و شما نیز ۱۰٪ از کارمزد ۱۰ معامله‌ی اول او را به‌عنوان پاداش دریافت می‌کنید. 💰</div>
</div>
</div>
<div class="flex justify-center mt-4">
+5 -3
View File
@@ -489,14 +489,16 @@
>
<div class="text-center">
<div class="mt-2">
<div>با دعوت دوستان خود به قطره، هم به آن‌ها تجربه‌ای ارزشمند هدیه بدهید و هم خودتان طلا دریافت کنید.</div>
<div>همین حالا کلیک کنید و پاداش بگیرید!</div>
<div>🔥یه فرصت طلایی واقعی جلوتِ !🔥</div>
<div>دوستاتو همین الان به قطره دعوت کن!</div>
<div>اونا اولین خریدشونو کاملاً بدون کارمزد انجام می‌دن،۱۰٪ از کارمزد ۱۰ معامله‌ی اولشون هم، مستقیم میاد تو حساب تو!</div>
<div>زود باش، این فرصت همیشه باز نیست! ⏳✨</div>
</div>
</div>
<template #footer>
<a-button type="primary" class="w-full" @click="closeModal">
کسب درآمد
همین حالا کلیک کنید و پاداش بگیرید!
</a-button>
</template>
</BasicModal>
@@ -5,10 +5,16 @@
@click="localValue = props.selfIndex"
>
<div class="p-3 flex flex-col items-center">
<div class="flex justify-between w-full">
<div class="flex w-full">
<div class="text-white font-bold text-lg w-full">{{ props.title }}</div>
<div
class="text-white px-2 flex justify-center items-center rounded-lg w-5rem"
@click.stop="deleteConfirmVisible = true"
class="text-white w-full ml-2 flex justify-center bg-red-600 items-center rounded-lg"
>
حذف کارت
</div>
<div
class="text-white w-full flex justify-center items-center rounded-lg"
:class="active ? 'bg-green-600' : 'bg-red-600'"
>
{{ active ? 'فعال' : 'غیر فعال' }}
@@ -19,18 +25,45 @@
class="mt-[1.5vh] text-white w-full text-center text-xl font-bold"
dir="ltr"
>
{{ useCardNumber(props.cardNumber) }}
{{ formattedCardNumber }}
</div>
<div v-if="props.shaba" class="mt-3 text-white text-lg">
{{ useShabaNumber(props.shaba) }}
{{ formattedShabaNumber }}
</div>
</div>
</div>
<DialogVant
v-model:show="deleteConfirmVisible"
teleport="body"
:closeOnClickOverlay="false"
:timeOut="-1"
>
<template #title>
<div class="flex flex-col items-center">
<div class="p-5 text-sm">
آیا از حذف کارت مطمئن هستید؟
</div>
</div>
</template>
<template #button>
<div class="text-center text-red flex items-center justify-center" @click="removeCard()">
<a-spin :spinning="deleteLoading" size="small">
تایید
</a-spin>
</div>
<div class="text-center" @click="deleteConfirmVisible = false">
انصراف
</div>
</template>
</DialogVant>
</template>
<script lang="ts" setup>
import { computed } from 'vue'
import { computed, ref } from 'vue'
import { useCardNumber, useShabaNumber } from '@/utils/useCardNumber'
import { deleteCard } from '@/api/transfer'
import DialogVant from '@/components/DialogVant.vue'
interface Prop {
sliderIndex: number
@@ -40,20 +73,29 @@ interface Prop {
shaba?: string
color?: string
active?: boolean
id?: number | string
}
const props = defineProps<Prop>()
const emits = defineEmits(['update:sliderIndex', 'deleted'])
const deleteConfirmVisible = ref(false)
const deleteLoading = ref(false)
const localValue = computed({
get() {
return props.sliderIndex
},
set(value) {
emits('update:sliderIndex', value)
}
})
const props = defineProps<Prop>()
const emits = defineEmits(['update:sliderIndex'])
const formattedCardNumber = computed(() =>
props.cardNumber ? useCardNumber(props.cardNumber) : ''
)
const formattedShabaNumber = computed(() =>
props.shaba ? useShabaNumber(props.shaba) : ''
)
function findPositionStyle(pos: number) {
// console.log(localValue.value)
@@ -142,6 +184,28 @@ function topDetail(isAfterIndex: boolean, pos: number) {
function checkTopLimit(val: number) {
return val > 100 || val < 0
}
async function removeCard(id?: number | string) {
const rawId = id ?? props.id
const cardId = rawId != null ? Number(rawId) : null
if (cardId === null || Number.isNaN(cardId)) {
console.warn('cardId is missing or invalid', rawId)
return
}
try {
deleteLoading.value = true
await deleteCard(cardId)
deleteConfirmVisible.value = false
emits('deleted')
} catch (error) {
console.error('Failed to delete card', error)
} finally {
deleteLoading.value = false
}
}
</script>
<style lang="sass" scoped>
@@ -4,7 +4,9 @@
<div ref="el" class="w-full flex flex-col relative h-full test">
<CardItem v-for="(item,i) in props?.items" :key="i" v-model:sliderIndex="index" :card-number="item?.cart_number"
:color="colors[i%3]"
:self-index="i" :shaba="item?.shaba_number" :title="item?.bank_name" :active="item.sts === 2"/>
:self-index="i" :shaba="item?.shaba_number" :title="item?.bank_name" :active="item.sts === 2"
:id="item?.id ?? item?.card_id"
@deleted="handleCardDeleted"/>
<div class="absolute bottom-15vh right-0 left-0 z-100 flex justify-center items-center opacity-70">
<div class="flex gap-1 bg-gray-500 px-2 py-1 rounded-lg">
<Transition name="slide-up" mode="out-in" v-for="i in items.length" :key="i">
@@ -35,7 +37,7 @@ interface Prop {
}
const props = defineProps<Prop>()
const emits = defineEmits(['update:id'])
const emits = defineEmits(['update:id', 'refresh'])
const localValue = computed({
get() {
@@ -101,6 +103,10 @@ watch(index, (n: number)=> {
localValue.value = props.items[n]?.id
})
function handleCardDeleted() {
emits('refresh')
}
/*
const items = [
{
+1
View File
@@ -119,6 +119,7 @@
v-if="cardItems.length > 0"
:items="cardItems"
v-model:id="form.card_id"
@refresh="getCards"
class="card-slider-wrap mt-[2vh] px-3 fixed bottom-10 right-0 left-0"
style="touch-action: none"
/>