1404/11/01-add dynamic config

This commit is contained in:
2026-01-21 19:38:50 +03:30
parent 9d96ae106b
commit 88105c4f36
31 changed files with 648 additions and 173 deletions
-1
View File
@@ -8,7 +8,6 @@ export {}
declare module 'vue' { declare module 'vue' {
export interface GlobalComponents { export interface GlobalComponents {
AButton: typeof import('ant-design-vue/es')['Button'] AButton: typeof import('ant-design-vue/es')['Button']
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
ADivider: typeof import('ant-design-vue/es')['Divider'] ADivider: typeof import('ant-design-vue/es')['Divider']
AForm: typeof import('ant-design-vue/es')['Form'] AForm: typeof import('ant-design-vue/es')['Form']
AFormItem: typeof import('ant-design-vue/es')['FormItem'] AFormItem: typeof import('ant-design-vue/es')['FormItem']
+5 -3
View File
@@ -2,17 +2,19 @@
<html lang="fa" dir="rtl"> <html lang="fa" dir="rtl">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.png"> <!-- <link rel="icon" href="/favicon.png">-->
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"> <meta http-equiv="Expires" content="0">
<meta name="theme-color" content="#ffffff"> <meta name="theme-color" content="#ffffff">
<title>GOLD.IR</title> <title>آپ</title>
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<script type="module" src="/src/main.ts"></script> <!--<script type="module" src="/src/main.ts"></script>-->
<script type="module" src="/src/config-loader.js"></script>
<!--<script type="text/javascript"> <!--<script type="text/javascript">
['keydown', 'touchmove', 'touchstart', 'mouseover'].forEach(function(v) { ['keydown', 'touchmove', 'touchstart', 'mouseover'].forEach(function(v) {
window.addEventListener(v, function() { window.addEventListener(v, function() {
+84 -67
View File
@@ -2,101 +2,104 @@
<div class="desktopConfig w-full right-0 left-0 absolute"> <div class="desktopConfig w-full right-0 left-0 absolute">
<div v-if="popVisible" class="top-0 bottom-0 wrap-fix bg-primary z-100 opacity-60"> <div v-if="popVisible" class="top-0 bottom-0 wrap-fix bg-primary z-100 opacity-60">
<div class="absolute right-0 left-0 bottom-10vh flex flex-col items-center"> <div class="absolute right-0 left-0 bottom-10vh flex flex-col items-center">
<div><BasicButton>درباره ما</BasicButton></div> <div>
<BasicButton>درباره ما</BasicButton>
</div>
<div></div> <div></div>
<div></div> <div></div>
</div> </div>
</div> </div>
<transition mode="out-in" name="fade"> <AConfigProvider
<AConfigProvider v-if=" antTheme"
v-if="!showSplash" :theme="antTheme"
:theme="{
token: {
colorPrimary: colors.primary,
colorLink: colors.primary,
colorLinkActive: colors.primary,
colorLinkHover: colors['primary-rgba']
}
}"
direction="rtl" direction="rtl"
> >
<router-view v-slot="{ Component, route }"> <transition mode="out-in" name="fade">
<!-- Use any custom transition and to `fade` -->
<transition :name="route.meta.transition || 'fade'">
<div>
<component :is="Component" />
</div>
</transition>
</router-view>
</AConfigProvider>
<div v-else class="flex bottom-0 wrap-fix top-0 bg-white z-1000000000000 justify-center"> <div v-if="!showSplash">
<div class="top-0 wrap-fix h-1/3 w-screen flex"> <router-view v-slot="{ Component, route }">
<img :src="img_topGradiant" alt="" class="absolute z-10 w-screen h-full object-cover" /> <!-- Use any custom transition and to `fade` -->
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none" /> <transition :name="route.meta.transition || 'fade'">
</div>
<div class="wrap-fix bottom-0 h-1/3 w-screen">
<img
:src="img_bottomGradiant"
alt=""
class="absolute z-10 w-screen h-full object-cover"
/>
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none" />
</div>
<div class="self-center splash_appear_fade_in">
<img :src="config?.config?.avatar" class="h-[20vh]">
<!-- <img :src="logoFull" class="h-[20vh]">--> <div>
<!-- <img :src="logo" alt="" class="z-100 bg-primary rounded-full w-full aspect-square self-center h-40" />--> <component :is="Component"/>
</div>
</transition>
</router-view>
</div> </div>
<div class="fixed w-full bottom-5 home_appear_fade_in_up"> <div v-else class="flex bottom-0 wrap-fix top-0 bg-white z-1000000000000 justify-center">
<div class="text-center text-xs">نسخه: {{ pkg.version }}</div> <div class="top-0 wrap-fix h-1/3 w-screen flex">
<img :src="img_topGradiant" alt="" class="absolute z-10 w-screen h-full object-cover"/>
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none"/>
</div>
<div class="wrap-fix bottom-0 h-1/3 w-screen">
<img
:src="img_bottomGradiant"
alt=""
class="absolute z-10 w-screen h-full object-cover"
/>
<img :src="img_pattern" alt="" class="absolute w-screen h-full object-none"/>
</div>
<div class="self-center splash_appear_fade_in">
<img :src="config?.config?.avatar" class="h-[20vh]">
<!-- <img :src="logoFull" class="h-[20vh]">-->
<!-- <img :src="logo" alt="" class="z-100 bg-primary rounded-full w-full aspect-square self-center h-40" />-->
</div>
<div class="fixed w-full bottom-5 home_appear_fade_in_up">
<div class="text-center text-xs">نسخه: {{ pkg.version }}</div>
</div>
<div class="absolute bottom-10">
<a-spin :indicator="indicator" size="small"/>
</div>
</div> </div>
<div class="absolute bottom-10"> </transition>
<a-spin :indicator="indicator" size="small" />
</div> </AConfigProvider>
</div>
</transition>
<van-dialog <van-dialog
v-model:show="versionDialog" v-model:show="versionDialog"
class="updateButton" class="updateButton"
confirm-button-text="به روزرسانی کنید" confirm-button-text="به روزرسانی کنید"
show-confirm-button show-confirm-button
@confirm="update()" @confirm="update()"
> >
<div class="flex flex-col items-center p-2"> <div class="flex flex-col items-center p-2">
<DotLottieVue <DotLottieVue
class="w-full aspect-square" class="w-full aspect-square"
autoplay autoplay
loop loop
src="https://lottie.host/cb620e8e-c64a-42e8-a6b5-8844146e5999/nmft7oBO8q.json" src="https://lottie.host/cb620e8e-c64a-42e8-a6b5-8844146e5999/nmft7oBO8q.json"
/> />
<div class="home_appear_fade_in_up mt-2">نسخه جدید گلد منتشر شد!</div> <div class="home_appear_fade_in_up mt-2">نسخه جدید }ککک منتشر شد!</div>
</div> </div>
</van-dialog> </van-dialog>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { colors } from './themeConfig' import {colors} from './themeConfig'
import pkg from '../package.json' import pkg from '../package.json'
import { useRegisterSW } from 'virtual:pwa-register/vue' import {useRegisterSW} from 'virtual:pwa-register/vue'
import { h, onMounted, ref } from 'vue' import {computed, h, onMounted, ref} from 'vue'
import { update } from 'lodash' import {update} from 'lodash'
import img_topGradiant from '@/views/login/assets/img/gr_top_white.svg' import img_topGradiant from '@/views/login/assets/img/gr_top_white.svg'
import img_pattern from '@/views/login/assets/img/pattern.svg' import img_pattern from '@/views/login/assets/img/pattern.svg'
import { LoadingOutlined } from '@ant-design/icons-vue' import {LoadingOutlined} from '@ant-design/icons-vue'
import img_bottomGradiant from '@/views/login/assets/img/gr_bottom_white.svg' import img_bottomGradiant from '@/views/login/assets/img/gr_bottom_white.svg'
import logoFull from '@/assets/img/logo_full_.png' import logoFull from '@/assets/img/logo_full_.png'
import { DotLottieVue } from '@lottiefiles/dotlottie-vue' import {DotLottieVue} from '@lottiefiles/dotlottie-vue'
import BasicButton from '@/components/BasicPacks/BasicButton.vue' import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import {getConfig} from "@/api/config"; import {getConfig} from "@/api/config";
import {useConfigStore} from "@/store/configStore"; import {useConfigStore} from "@/store/configStore";
import { ConfigProvider as AConfigProvider } from 'ant-design-vue'
const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW() const {offlineReady, needRefresh, updateServiceWorker} = useRegisterSW()
const config=useConfigStore() const config = useConfigStore()
const indicator = h(LoadingOutlined, { const indicator = h(LoadingOutlined, {
style: { style: {
fontSize: '24px' fontSize: '24px'
@@ -104,8 +107,22 @@ const indicator = h(LoadingOutlined, {
spin: true spin: true
}) })
const showSplash = ref(true) const showSplash = ref(true)
const antTheme = computed(() => {
if (!config.config?.color) return null
return {
token: {
colorPrimary: "#ff0000",
colorLink: config.config.color,
colorLinkActive: config.config.color,
colorLinkHover: config.config.color,
},
}
})
onMounted(async () => { onMounted(async () => {
await config.getConfigData() await config.getConfigData()
console.log(config.config.color)
checkVersion() checkVersion()
setTimeout(() => { setTimeout(() => {
showSplash.value = false showSplash.value = false
@@ -117,7 +134,7 @@ const versionDialog = ref<boolean>(false)
function checkVersion() { function checkVersion() {
const version = localStorage.getItem('version') const version = localStorage.getItem('version')
// if (true) { // if (true) {
if (!version){ if (!version) {
update() update()
} }
if (version != pkg.version) { if (version != pkg.version) {
@@ -135,7 +152,7 @@ function update() {
<style lang="less"> <style lang="less">
.updateButton .van-dialog__confirm .van-button__text { .updateButton .van-dialog__confirm .van-button__text {
color: @primary-color !important; color: @App-primary-color !important;
font-weight: 600; font-weight: 600;
font-size: 15px; font-size: 15px;
} }
+216
View File
@@ -0,0 +1,216 @@
/* =================== متغیرها =================== */
/* =================== Buttons =================== */
.ant-btn-primary {
background-color: @App-primary-color !important;
border-color: @App-primary-color !important;
color: #fff !important;
&:hover {
background-color: @App-primary-color !important;
border-color: @App-primary-color !important;
color: #fff !important;
}
&:active {
background-color: @App-primary-color !important;
border-color: @App-primary-color !important;
color: #fff !important;
}
&:disabled {
background-color: #f5f5f5 !important;
border-color: #d9d9d9 !important;
cursor: not-allowed !important;
}
}
//.ant-btn {
// &:hover {
// border-color: @App-primary-color !important;
// box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
// color: @App-primary-color !important;
// }
//
// &.ant-input-focused {
// border-color: @App-primary-color !important;
// box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
// color: @App-primary-color !important;
// }
//
// &:focus {
// border-color: @App-primary-color !important;
// box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
// color: @App-primary-color !important;
// }
//}
.ant-btn-default:hover,
.ant-btn-default:focus {
border-color: @App-primary-color !important;
color: @App-primary-color !important;
}
/* =================== Links =================== */
.ant-typography a,
.ant-typography a:hover,
.ant-typography a:active {
color: @App-primary-color !important;
}
/* =================== Badge =================== */
.ant-badge-status-processing {
background-color: @App-primary-color !important;
}
/* =================== Input =================== */
//.ant-input,
//.ant-input:hover,
//.ant-input-focused,
//.ant-input:focus {
// border-color: @App-primary-color !important;
// box-shadow: 0 0 0 2px rgba(10,27,55,0.2) !important; /* fallback برای hover */
//}
.ant-input {
&:hover {
border-color: @App-primary-color !important;
box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
&.ant-input-focused {
border-color: @App-primary-color !important;
box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
&:focus {
border-color: @App-primary-color !important;
box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
}
.ant-input-affix-wrapper:focus, .ant-input-affix-wrapper-focused{
border-color: @App-primary-color !important;
box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
/* =================== Select =================== */
.ant-select-focused,
.ant-select:hover,
.ant-select-selection {
border-color: @App-primary-color !important;
box-shadow: none
}
.ant-select:not(.ant-select-disabled):hover .ant-select-selector{
border-color: @App-primary-color !important;
box-shadow: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
/* =================== Radio =================== */
.ant-radio-checked .ant-radio-inner {
border-color: @App-primary-color !important;
background-color: @App-primary-color !important;
}
.ant-radio-group-solid .ant-radio-button-wrapper-checked{
border-color: @App-primary-color !important;
background-color: @App-primary-color !important;
}
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover::before{
background-color: @App-primary-color !important;
}
/* =================== Checkbox =================== */
.ant-checkbox-checked .ant-checkbox-inner {
border-color: @App-primary-color !important;
background-color: @App-primary-color !important;
}
/* =================== Switch =================== */
.ant-switch-checked {
background-color: @App-primary-color !important;
}
/* =================== Tag =================== */
//.ant-tag-blue {
// background-color: @App-primary-color !important;
// color: #fff !important;
// border-color: @App-primary-color !important;
//}
/* =================== Slider =================== */
.ant-slider-track {
background-color: @App-primary-color !important;
}
.ant-slider-handle {
border-color: @App-primary-color !important;
}
/* =================== Menu =================== */
.ant-menu-item-selected {
background-color: @App-primary-color !important;
}
.ant-menu-item-selected a {
color: #fff !important;
}
/* =================== Pagination =================== */
.ant-pagination-item-active {
background-color: @App-primary-color !important;
border-color: @App-primary-color !important;
}
/* =================== Tooltip =================== */
.ant-tooltip-arrow-content {
background-color: @App-primary-color !important;
}
/* =================== Tabs =================== */
.ant-tabs-tab-active {
color: @App-primary-color !important;
}
/* =================== Card =================== */
.ant-card-head-title a {
color: @App-primary-color !important;
}
/* =================== Steps =================== */
.ant-steps-item-process .ant-steps-item-icon,
.ant-steps-item-finish .ant-steps-item-icon {
background-color: @App-primary-color !important;
}
/* =================== Alert =================== */
.ant-alert-success .ant-alert-icon,
.ant-alert-info .ant-alert-icon,
.ant-alert-warning .ant-alert-icon,
.ant-alert-error .ant-alert-icon {
color: @App-primary-color !important;
}
/* =================== Divider =================== */
//.ant-divider-horizontal {
// border-top-color: @App-primary-color !important;
//}
/* =================== Checkbox / Radio Hover =================== */
.ant-checkbox:hover .ant-checkbox-inner,
.ant-radio:hover .ant-radio-inner {
border-color: @App-primary-color !important;
}
/* =================== Disabled =================== */
.ant-checkbox-disabled .ant-checkbox-inner,
.ant-radio-disabled .ant-radio-inner {
background-color: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
border-color: 0 0 0 2px color-mix(in srgb, @App-primary-color 20%, transparent) !important;
}
.ant-spin-dot-item {
background-color: @App-primary-color !important;
}
.ant-spin-dot i {
background-color: @App-primary-color !important;
}
+7 -6
View File
@@ -1,5 +1,6 @@
@import (less) './var.less'; @import (less) './var.less';
@import (less) './fonts.less'; @import (less) './fonts.less';
@import (less) './ant.less';
html { html {
scroll-behavior: smooth; scroll-behavior: smooth;
@@ -133,7 +134,7 @@ body {
background-color: #fff; background-color: #fff;
//display: none; //display: none;
outline: none; outline: none;
border: 1px solid #0A1B37 !important; border: 1px solid @App-primary-color !important;
} }
} }
@@ -331,18 +332,18 @@ body {
} }
.ant-radio-group-solid .ant-radio-group-solid
.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{ .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{
color: #0A1B37 !important; color:@App-primary-color !important;
} }
.ant-input-group-addon{ .ant-input-group-addon{
background-color: #0A1B37 !important; background-color: @App-primary-color !important;
color: #e0be7f !important; color: @secondary-color !important;
} }
.ant-slider-track{ .ant-slider-track{
background-color: #0A1B37 !important; background-color:@App-primary-color !important;
} }
.ant-slider-handle { .ant-slider-handle {
background-color: #0A1B37 !important; background-color: @App-primary-color !important;
} }
+8 -3
View File
@@ -1,8 +1,13 @@
@prefixCls: 'noname'; @prefixCls: 'noname';
@primary-color: #0A1B37; @App-primary-color: var(--App-primary-color);
@secondary-color: #0A1B37; @secondary-color: var(--App-secondary-color);
@prefixCls-font-family: 'iran-sans'; @prefixCls-font-family: 'iran-sans';
@prefixCls-background-color: #fff; @prefixCls-background-color: var(--App-background-color);
@border-radius-base: 8px; @border-radius-base: 8px;
:root {
--App-primary-color: #0A1B37;
--App-secondary-color: #e0be7f;
--App-background-color: #ffffff;
}
@@ -180,7 +180,7 @@
bottom: -@border-width-base; bottom: -@border-width-base;
height: 2px; height: 2px;
margin-left: @input-padding-horizontal-base; margin-left: @input-padding-horizontal-base;
background: @primary-color; background: @App-primary-color;
opacity: 0; opacity: 0;
transition: all @animation-duration-slow ease-out; transition: all @animation-duration-slow ease-out;
pointer-events: none; pointer-events: none;
@@ -288,7 +288,7 @@
// https://github.com/ant-design/ant-design/issues/23687 // https://github.com/ant-design/ant-design/issues/23687
.@{picker-prefix-cls}-preset > .@{ant-prefix}-tag-blue { .@{picker-prefix-cls}-preset > .@{ant-prefix}-tag-blue {
color: @primary-color; color: @App-primary-color;
background: @primary-1; background: @primary-1;
border-color: @primary-3; border-color: @primary-3;
cursor: pointer; cursor: pointer;
@@ -15,7 +15,7 @@
outline: none; outline: none;
&-focused { &-focused {
border-color: @primary-color; border-color: @App-primary-color;
} }
} }
@@ -78,7 +78,7 @@
} }
&:hover { &:hover {
color: @primary-color; color: @App-primary-color;
} }
} }
} }
@@ -194,7 +194,7 @@
bottom: 0; bottom: 0;
left: 0; left: 0;
z-index: 1; z-index: 1;
border: @border-width-base @border-style-base @primary-color; border: @border-width-base @border-style-base @App-primary-color;
border-radius: @border-radius-base; border-radius: @border-radius-base;
content: ''; content: '';
} }
@@ -214,7 +214,7 @@
&-in-view&-range-start .@{cellClassName}, &-in-view&-range-start .@{cellClassName},
&-in-view&-range-end .@{cellClassName} { &-in-view&-range-end .@{cellClassName} {
color: @text-color-inverse; color: @text-color-inverse;
background: @primary-color; background: @App-primary-color;
} }
&-in-view&-range-start:not(&-range-start-single), &-in-view&-range-start:not(&-range-start-single),
@@ -520,7 +520,7 @@
&-selected td, &-selected td,
&-selected:hover td { &-selected:hover td {
background: @primary-color; background: @App-primary-color;
&.@{picker-prefix-cls}-cell-week { &.@{picker-prefix-cls}-cell-week {
color: fade(@text-color-inverse, 50%); color: fade(@text-color-inverse, 50%);
+1 -1
View File
@@ -105,7 +105,7 @@ const handleChange = (e: any) => {
//padding: 5px; //padding: 5px;
/* .ant-select { /* .ant-select {
.ant-select-selector { .ant-select-selector {
border-color: @primary-color; border-color: @App-primary-color;
border-radius: @border-radius-base; border-radius: @border-radius-base;
} }
}*/ }*/
+181
View File
@@ -0,0 +1,181 @@
(function() {
'use strict';
//debugger
// Store config in window object
window.__APP_CONFIG__ = window.__APP_CONFIG__ || {};
window.__CONFIG_READY__ = false;
// Create a promise that will be resolved when config is loaded
let configResolve;
let configReject;
window.__CONFIG_PROMISE__ = new Promise((resolve, reject) => {
configResolve = resolve;
configReject = reject;
});
// API endpoint for config - you can change this URL
// You can also set it via a data attribute: <script src="/config-loader.js" data-config-url="https://your-api.com/config"></script>
//const scriptTag = document.currentScript || document.querySelector('script[src*="config-loader.js"]');
//const customUrl = scriptTag ? scriptTag.getAttribute('data-config-url') : null;
const CONFIG_URL = 'https://nerkh.gold/get_user' //customUrl || window.location.origin + '/api/config';
// Timeout to ensure main.ts loads even if config fails (5 seconds)
const CONFIG_TIMEOUT = 5000;
let configTimeoutId;
let mainScriptLoaded = false;
// Fetch config from server
async function loadConfig() {
try {
const response = await fetch(CONFIG_URL, {
method: 'GET',
headers: {
'Accept': 'application/json',
},
cache: 'no-cache'
});
if (!response.ok) {
throw new Error('Failed to fetch config: ' + response.status);
}
// Check if response is actually JSON
const contentType = response.headers.get('content-type');
if (!contentType || !contentType.includes('application/json')) {
const text = await response.text();
throw new Error('Response is not JSON. Received: ' + text.substring(0, 100));
}
const config = await response.json();
// Store config in window object
window.__APP_CONFIG__ = config;
window.__CONFIG_READY__ = true;
if (config?.user?.name_fa) {
document.title = config.user.name + '-'+config.user.name_fa;
}
// ---------- Dynamic Favicon ----------
if (config?.user?.avatar) {
const faviconUrl = config.user.avatar;
// remove existing favicon(s)
const existingIcons = document.querySelectorAll('link[rel*="icon"]');
existingIcons.forEach(icon => icon.remove());
// create new favicon
const link = document.createElement('link');
link.rel = 'icon';
link.type = 'image/png'; // یا image/x-icon
link.href = faviconUrl + '?v=' + Date.now();
document.head.appendChild(link);
}
// Resolve the promise
if (configResolve) {
configResolve(config);
}
// Dispatch custom event to notify that config is ready
window.dispatchEvent(new CustomEvent('configReady', { detail: config }));
console.log('Config loaded successfully:', config);
// Clear timeout if config loaded successfully
if (configTimeoutId) {
clearTimeout(configTimeoutId);
configTimeoutId = null;
}
// Load main.ts after config is ready
loadMainScript();
} catch (error) {
console.warn('Config loader: Could not fetch config from', CONFIG_URL);
console.warn('Error details:', error.message);
console.warn('This is normal if the endpoint does not exist yet. App will continue with empty config.');
// Set default empty config on error
window.__APP_CONFIG__ = {};
window.__CONFIG_READY__ = true;
// Resolve the promise even on error (with empty config)
if (configResolve) {
configResolve({});
}
window.dispatchEvent(new CustomEvent('configError', { detail: error }));
// Clear timeout if error occurred
if (configTimeoutId) {
clearTimeout(configTimeoutId);
configTimeoutId = null;
}
// Load main.ts even on error (with empty config)
loadMainScript();
}
}
// Function to dynamically load main.ts script
function loadMainScript() {
//const config= window.__APP_CONFIG__
// Check if main.ts is already loaded
if (mainScriptLoaded || document.querySelector('script[src="/src/main.ts"]')) {
return;
}
mainScriptLoaded = true;
/*const manifestLink = document.createElement("link")
manifestLink.rel = "manifest"
manifestLink.id= "manifestsdfsdfsdfsdfsdfsdf"
manifestLink.href = `https://nerkh.gold/get_user/${config.user.id}/monifist.json`
document.head.appendChild(manifestLink)*/
import('/src/main.ts').then(() => {
console.log('Main script loaded and executed');
});
/*const script = document.createElement('script');
script.type = 'module';
script.src = '/src/main.ts';
script.async = true;*/
// Handle script load errors
/*script.onerror = function() {
console.error('Failed to load main.ts script');
mainScriptLoaded = false;
};
script.onload = function() {
console.log('Main script loaded successfully');
};
document.body.appendChild(script);*/
//console.log('Main script loading started...');
}
// Set timeout to ensure main.ts loads even if config fails
configTimeoutId = setTimeout(function() {
if (!mainScriptLoaded) {
console.warn('Config loader: Timeout reached. Loading main.ts with empty config.');
// Set default empty config
window.__APP_CONFIG__ = window.__APP_CONFIG__ || {};
window.__CONFIG_READY__ = true;
// Resolve promise with empty config
if (configResolve) {
configResolve({});
}
loadMainScript();
}
}, CONFIG_TIMEOUT);
// Start loading config immediately
loadConfig();
})();
+19 -2
View File
@@ -1,7 +1,7 @@
import 'ant-design-vue/dist/antd.less' import 'ant-design-vue/dist/antd.less'
import './assets/css/main.less' import './assets/css/main.less'
import 'virtual:uno.css' import 'virtual:uno.css'
import { computed, createApp, ref, watch } from 'vue' import {computed, createApp, nextTick, ref, watch} from 'vue'
import { createPinia } from 'pinia' import { createPinia } from 'pinia'
import '@unocss/reset/tailwind-compat.css' import '@unocss/reset/tailwind-compat.css'
import VueApexCharts from 'vue3-apexcharts' import VueApexCharts from 'vue3-apexcharts'
@@ -16,6 +16,7 @@ import { getMe } from '@/api/me'
import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router' import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import { useAuthStore } from '@/store/useAuthStore' import { useAuthStore } from '@/store/useAuthStore'
const app = createApp(App) const app = createApp(App)
app.use(createPinia()) app.use(createPinia())
app.use(VueLazyLoad, { app.use(VueLazyLoad, {
@@ -42,6 +43,7 @@ const currentRoute = computed(() => {
}) })
async function start() { async function start() {
// console.log('ffffffffffffffffffffffffffffffffffffffffff') // console.log('ffffffffffffffffffffffffffffffffffffffffff')
if (getToken()) { if (getToken()) {
// await userStore.getMyInfo() // await userStore.getMyInfo()
@@ -51,6 +53,7 @@ async function start() {
} }
} }
const win = window as Window & { isWhatsappBtnAdded?: boolean };
export function setTruth() { export function setTruth() {
fingerPosition = true fingerPosition = true
@@ -177,11 +180,25 @@ router.beforeEach(async (to, from, next) => {
} }
} }
}) })
app.mount('#app') app.mount('#app')
// if (currentRoute.value !== '/') { // if (currentRoute.value !== '/') {
// await start() // await start()
// } // }
nextTick(() => {
const color = window.__APP_CONFIG__?.user?.color
const secondary_color = window.__APP_CONFIG__?.user?.secondary_color
if (!color) {
console.warn('Primary color not found')
return
}
console.log('APP_CONFIG:', window.__APP_CONFIG__.user.color)
document.documentElement.style.setProperty('--App-primary-color', color)
document.documentElement.style.setProperty('--App-secondary-color', secondary_color)
})
watch(currentRoute, async () => userStore.userInfo ? '' : await start()) watch(currentRoute, async () => userStore.userInfo ? '' : await start())
+15 -12
View File
@@ -1,21 +1,24 @@
import { computed, ref } from 'vue' import {computed, ref} from 'vue'
// import { get } from 'lodash' // import { get } from 'lodash'
import { defineStore } from 'pinia' import {defineStore} from 'pinia'
import { getMe } from '@/api/me' import {getMe} from '@/api/me'
import type { User } from '@/models/login' import type {User} from '@/models/login'
import { useWalletStore } from '@/store/walletStore' import {useWalletStore} from '@/store/walletStore'
import {authenticateWithFingerprint, setFingerPrint} from '@/utils' import {authenticateWithFingerprint, setFingerPrint} from '@/utils'
import type { PWallet } from '@/models/wallet' import type {PWallet} from '@/models/wallet'
import {getConfig} from "@/api/config"; import {getConfig} from "@/api/config";
export const useConfigStore = defineStore('config', () => { export const useConfigStore = defineStore('config', () => {
const config=ref() const config = ref()
async function getConfigData(){
let temp=await getConfig() async function getConfigData() {
config.value=temp.user
console.log(config.value) let temp = window.__APP_CONFIG__
} config.value = temp.user
console.log(config.value)
}
return { return {
config, config,
getConfigData getConfigData
+6 -2
View File
@@ -1,10 +1,14 @@
import pkg from '../package.json' import pkg from '../package.json'
import colors from './baseColor.json' import colors from './baseColor.json'
import { getConfigApp} from "@/utils/config";
/** base config **/ /** base config **/
/** api document **/ /** api document **/
// export const baseURL: string = 'https://api.gholaktala.ir/' // export const baseURL: string = 'https://api.gholaktala.ir/'
export const baseURL: string = 'https://samin.gold/api/' const projectBase = getConfigApp('node_server')
const projectName = getConfigApp('name')
export const baseURL: string = projectBase
// export const baseURL: string = 'https://api-gholaktala.z23.ir/' // export const baseURL: string = 'https://api-gholaktala.z23.ir/'
// const baseUploadURL: string = '/site/file' // const baseUploadURL: string = '/site/file'
// const uploadURL: string = baseURL + baseUploadURL // const uploadURL: string = baseURL + baseUploadURL
@@ -12,7 +16,7 @@ export const baseURL: string = 'https://samin.gold/api/'
const prefixCls: string = 'noname' const prefixCls: string = 'noname'
// const version: string = pkg.version // const version: string = pkg.version
// const tokenName: string = 'gholaktala_app_token' // const tokenName: string = 'gholaktala_app_token'
const tokenName: string = 'samingold_app_token' const tokenName: string = `${projectName}_app_token`
const baseButtonIconSize = '24' const baseButtonIconSize = '24'
// const appName = { fa: 'بدون نام', en: 'noname' } // const appName = { fa: 'بدون نام', en: 'noname' }
+9
View File
@@ -0,0 +1,9 @@
export function getConfigApp(key: string) {
const config = window.__APP_CONFIG__ ? window.__APP_CONFIG__.user:{}
if (config) {
return config[key]
}
return null
}
+8 -6
View File
@@ -24,16 +24,16 @@
<div class="mt-3"> <div class="mt-3">
با وجود گسترش فناوری‌های نوین در همه حوزه‌ها، ما در شرکت پخش طلای حاجی ابوالفتح با با وجود گسترش فناوری‌های نوین در همه حوزه‌ها، ما در شرکت پخش طلای حاجی ابوالفتح با
تلفیق تجربه سنتی خود در بازار طلا و با دانش تخصصی خود و با بهره‌گیری از سوابق موفق تلفیق تجربه سنتی خود در بازار طلا و با دانش تخصصی خود و با بهره‌گیری از سوابق موفق
قبلی در حوزه فینتک، اقدام به ایجاد گلد نمودیم. قبلی در حوزه فینتک، اقدام به ایجاد {{ nameProject }} نمودیم.
</div> </div>
<div class="mt-3"> <div class="mt-3">
مهم‌ترین ارزش پیشنهادی گلد، امکان پس انداز تدریجی طلا با سرمایه‌های خرد و بدون مهم‌ترین ارزش پیشنهادی {{ nameProject }}، امکان پس انداز تدریجی طلا با سرمایه‌های خرد و بدون
پرداخت هزینه‌های جانبی است و در این راستا گلد دات آی آر تمام تلاش خود را نموده است تا از پرداخت هزینه‌های جانبی است و در این راستا {{ nameProject }} تمام تلاش خود را نموده است تا از
ابتدای سال 1401 با رونمایی محصول اولیه، برای همه افراد با هر سطحی از دارایی، بستری ابتدای سال 1401 با رونمایی محصول اولیه، برای همه افراد با هر سطحی از دارایی، بستری
امن و مطمئن ایجاد نماید. امن و مطمئن ایجاد نماید.
</div> </div>
<div class="mt-3"> <div class="mt-3">
علاوه بر این گلد به عنوان یک واحد فناور از سال 1403 با رونمایی نسخه کاملا آنلاین علاوه بر این {{ nameProject }} به عنوان یک واحد فناور از سال 1403 با رونمایی نسخه کاملا آنلاین
و نرم افزاری وارد فاز جدیدی از خرید و فروش طلای آب شده، شده است. و نرم افزاری وارد فاز جدیدی از خرید و فروش طلای آب شده، شده است.
</div> </div>
<div class="w-full h-1px my-3 bg-tertiary"></div> <div class="w-full h-1px my-3 bg-tertiary"></div>
@@ -72,6 +72,7 @@ import { updateMe } from '@/api/me'
import { useUserStore } from '@/store/userStore' import { useUserStore } from '@/store/userStore'
import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker' import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker'
import img_pattern from "@/views/login/assets/img/pattern.svg"; import img_pattern from "@/views/login/assets/img/pattern.svg";
import {useConfigStore} from "@/store/configStore";
const userFormState = ref<User>({ const userFormState = ref<User>({
fname: '', fname: '',
@@ -85,6 +86,7 @@ const userFormState = ref<User>({
}) })
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const userStore = useUserStore() const userStore = useUserStore()
const nameProject= useConfigStore().config.name_fa
// const editPassVisible = ref<boolean>(false) // const editPassVisible = ref<boolean>(false)
const editPassVisible = ref<boolean>(false) const editPassVisible = ref<boolean>(false)
@@ -106,12 +108,12 @@ function shareCode() {
const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر! const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای گلد دات آی آر جا نمونید. این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای ${nameProject} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
gold.ir/login?id=${userStore.userInfo?.referral_id}` gold.ir/login?id=${userStore.userInfo?.referral_id}`
navigator.share({ navigator.share({
title: 'گلد دات آی آر', title: nameProject,
text: val text: val
}) })
// message.info('کد رونوشت شد') // message.info('کد رونوشت شد')
+4 -3
View File
@@ -8,7 +8,7 @@
</div> </div>
</div> </div>
<div class="p-4"> <div class="p-4">
<div class="text-center p-3 border-solid border-1 rounded-[8px] border-[#0A1B37] "> <div class="text-center p-3 border-solid border-1 rounded-[8px] border-primary ">
<div class="flex items-center"> <div class="flex items-center">
<div class=" bg-[#DBEAFE] h-10 w-10 rounded-100% flex justify-center items-center"> <div class=" bg-[#DBEAFE] h-10 w-10 rounded-100% flex justify-center items-center">
<img :src="coin" /> <img :src="coin" />
@@ -97,6 +97,7 @@ import GiftCard from '@/views/base/earnMoney/components/GiftCard.vue'
const data = ref<EarnMoney>() const data = ref<EarnMoney>()
const userStore = useUserStore() const userStore = useUserStore()
const nameProject= useConfigStore().config.name_fa
const isTransaction = ref<boolean>(false) const isTransaction = ref<boolean>(false)
@@ -117,12 +118,12 @@ function shareCode() {
const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر! const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای گلد دات آی آر جا نمونید. این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای ${nameProject} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
gold.ir/login?id=${userStore.userInfo?.referral_id}` gold.ir/login?id=${userStore.userInfo?.referral_id}`
navigator.share({ navigator.share({
title: ' گلد', title: nameProject,
text: val text: val
}) })
// message.info('کد رونوشت شد') // message.info('کد رونوشت شد')
+1 -1
View File
@@ -40,7 +40,7 @@
<div v-for="item in types" <div v-for="item in types"
class="border-1 px-3 py-2 flex-nowrap rounded text-xs color-transition background-color-transition" class="border-1 px-3 py-2 flex-nowrap rounded text-xs color-transition background-color-transition"
:key="item.name" :key="item.name"
:class="item.name === name? 'bg-[#0A1B37] text-white':'bg-gray-200 text-gray-600'" :class="item.name === name? 'bg-primary text-white':'bg-gray-200 text-gray-600'"
@click="name = item.name"> @click="name = item.name">
{{ item.name }} {{ item.name }}
</div> </div>
+4 -3
View File
@@ -46,14 +46,14 @@
<bg_main /> <bg_main />
<div class="z-100 relative"> <div class="z-100 relative">
<a-form-item> <a-form-item>
<BasicInput v-model:value="form.goldCash" addon-before="ریال" addon-bg-color="#0A1B37" <BasicInput v-model:value="form.goldCash" addon-before="ریال" :addon-bg-color="useConfigStore().config.color"
addon-text-color="white" addon-text-color="white"
place-holder="ارزش کل" place-holder="ارزش کل"
size="large" size="large"
type="price" @onchange="calculateGold" /> type="price" @onchange="calculateGold" />
</a-form-item> </a-form-item>
<a-form-item :rules="[justNumber()]"> <a-form-item :rules="[justNumber()]">
<BasicInput v-model:value="form.goldValue" addon-before="گرم" addon-bg-color="#0A1B37" <BasicInput v-model:value="form.goldValue" addon-before="گرم" :addon-bg-color="useConfigStore().config.color"
addon-text-color="white" addon-text-color="white"
place-holder="مقدار طلا" place-holder="مقدار طلا"
size="large" type="text" inputmode="decimal" @onchange="calculateCash" /> size="large" type="text" inputmode="decimal" @onchange="calculateCash" />
@@ -234,6 +234,7 @@ import { getTransactionTable } from '@/api/transaction'
import { getLastPrices, getUpPrice, lastPrice, setIntervalGetAllPrice, stopPriceInterval } from '@/utils/price' import { getLastPrices, getUpPrice, lastPrice, setIntervalGetAllPrice, stopPriceInterval } from '@/utils/price'
import type { Product } from '@/models/products' import type { Product } from '@/models/products'
import { useFundUserStore } from '@/store/fundStore' import { useFundUserStore } from '@/store/fundStore'
import {useConfigStore} from "@/store/configStore";
// import Bg_main from "@/components/bg_main.vue"; // import Bg_main from "@/components/bg_main.vue";
const infoVisible = ref(false) const infoVisible = ref(false)
@@ -615,7 +616,7 @@ async function ok() {
background: blue; background: blue;
}*/ }*/
.completeButtonStyle .van-dialog__confirm .van-button__content { .completeButtonStyle .van-dialog__confirm .van-button__content {
background: #0A1B37; background: @App-primary-color;
color: white; color: white;
} }
+1 -1
View File
@@ -1,7 +1,7 @@
<template> <template>
<div class=""> <div class="">
<!-- <div class="bg-primary h-30 mt-[-3rem] z-100000000000"></div>--> <!-- <div class="bg-primary h-30 mt-[-3rem] z-100000000000"></div>-->
<div class="fixed h-[60vh] bg-[#0A1B37] w-screen"> <div class="fixed h-[60vh] bg-primary w-screen">
<div class="flex w-full justify-around mt-18"> <div class="flex w-full justify-around mt-18">
<div class="text-center"> <div class="text-center">
<div class="text-[#E5D7CE] text-xs ">موجودی کیف طلا</div> <div class="text-[#E5D7CE] text-xs ">موجودی کیف طلا</div>
+7 -6
View File
@@ -108,12 +108,12 @@
<div class="flex mt-2 justify-center text-tertiary w-full z-20"> <div class="flex mt-2 justify-center text-tertiary w-full z-20">
دارایی طلایی: دارایی طلایی:
<div class="text-l mr-2 font-bold">{{ (userStore?.userInfo?.wallet?.count_gold ?? 0).toFixed(3)}}گرم</div> <div class="text-l mr-2 font-bold">{{ (userStore?.userInfo?.wallet?.count_gold ?? 0).toFixed(3)}}گرم</div>
<BasicIcon @click="openGoldModal" icon="vuesax-linear:info-circle" size="18" color="orange" /> <BasicIcon @click="openGoldModal" icon="vuesax-linear:info-circle" size="18" color="tertiary" />
</div> </div>
<div class="flex mt-2 justify-center text-tertiary w-full z-20"> <div class="flex mt-2 justify-center text-tertiary w-full z-20">
دارایی ریالی: دارایی ریالی:
<div class="text-l mr-2 font-bold">{{ usePriceWithoutType(userStore?.userInfo?.wallet?.count_cash ?? 0) }}ریال</div> <div class="text-l mr-2 font-bold">{{ usePriceWithoutType(userStore?.userInfo?.wallet?.count_cash ?? 0) }}ریال</div>
<BasicIcon @click="openRialModal" icon="vuesax-linear:info-circle" size="18" color="orange" /> <BasicIcon @click="openRialModal" icon="vuesax-linear:info-circle" size="18" color="tertiary" />
</div> </div>
</div> </div>
<!-- <div class="flex justify-center mt-2 w-full z-20"> <!-- <div class="flex justify-center mt-2 w-full z-20">
@@ -189,7 +189,7 @@
> >
<div class="w-full items-center flex flex-col"> <div class="w-full items-center flex flex-col">
<div class="text-gray-600">قیمت خرید از گلد دات آی آر</div> <div class="text-gray-600">قیمت خرید از {{ useConfigStore().config.name_fa }}</div>
<div v-if="price" class="flex gap-1 mt-3 text-xs items-center"> <div v-if="price" class="flex gap-1 mt-3 text-xs items-center">
<!-- <div id="odometer" class="font-bold text-2xl odometer animated fadeIn"> <!-- <div id="odometer" class="font-bold text-2xl odometer animated fadeIn">
&lt;!&ndash; {{ usePriceWithoutType(useCounterAnim(price.price_last) ?? 0) }}&ndash;&gt; &lt;!&ndash; {{ usePriceWithoutType(useCounterAnim(price.price_last) ?? 0) }}&ndash;&gt;
@@ -214,7 +214,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="flex mt-5 gap-1 bg-primary text-[#CEA34C] font-bold justify-center rounded-lg py-5" <div class="flex mt-5 gap-1 bg-primary text-tertiary font-bold justify-center rounded-lg py-5"
@click="router.push({ name: 'buyProduct', query: { cat: 'coin'} })"> @click="router.push({ name: 'buyProduct', query: { cat: 'coin'} })">
<div>خرید و فروش</div> <div>خرید و فروش</div>
</div> </div>
@@ -462,6 +462,7 @@ import { useFundUserStore } from '@/store/fundStore'
import {Modal} from "ant-design-vue"; import {Modal} from "ant-design-vue";
import {ExclamationCircleOutlined} from "@ant-design/icons-vue"; import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
import {message} from "ant-design-vue/es"; import {message} from "ant-design-vue/es";
import {useConfigStore} from "@/store/configStore";
const userStore = useUserStore() const userStore = useUserStore()
const walletStore = useWalletStore() const walletStore = useWalletStore()
@@ -480,7 +481,7 @@ const tableOutput = ref<TableOutput<Fund> | null>(null)
const inventory = ref<number>(0) const inventory = ref<number>(0)
const sumGold = ref<number>(0) const sumGold = ref<number>(0)
const fundStore = useFundUserStore() const fundStore = useFundUserStore()
const config=useConfigStore()
async function initTable() { async function initTable() {
try { try {
loading.value = true loading.value = true
@@ -669,7 +670,7 @@ const priceChartOptions = ref({
show: false show: false
} }
}, },
colors: ['#0A1B37'], colors: [config.config.color],
fill: { fill: {
type: 'gradient', type: 'gradient',
gradient: { gradient: {
+2 -1
View File
@@ -451,6 +451,7 @@ import { getActivatedCards } from '@/api/wallet'
import banner1 from '@/assets/img/banner/banner1.png' import banner1 from '@/assets/img/banner/banner1.png'
import banner2 from '@/assets/img/banner/banner2.png' import banner2 from '@/assets/img/banner/banner2.png'
import BasicButton from '@/components/BasicPacks/BasicButton.vue' import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import {useConfigStore} from "@/store/configStore";
const userStore = useUserStore() const userStore = useUserStore()
const walletStore = useWalletStore() const walletStore = useWalletStore()
@@ -620,7 +621,7 @@ const priceChartOptions = ref({
show: false show: false
} }
}, },
colors: ['#0A1B37'], colors: [useConfigStore().config.color],
fill: { fill: {
type: 'gradient', type: 'gradient',
gradient: { gradient: {
+1 -1
View File
@@ -221,7 +221,7 @@ function setRoute(val: string) {
justify-content: center; justify-content: center;
align-content: center; align-content: center;
flex-wrap: wrap; flex-wrap: wrap;
background-color: #0A1B37; background-color: @App-primary-color;
@@ -4,12 +4,12 @@
<!-- <div @click="isBuy = false" class="w-full text-center" :class="!isBuy?'text-primary':'text-gray-400'">خرید طلا</div> <!-- <div @click="isBuy = false" class="w-full text-center" :class="!isBuy?'text-primary':'text-gray-400'">خرید طلا</div>
<div @click="isBuy = true" class="w-full text-center" :class="isBuy?'text-primary':'text-gray-400'">فروش طلا</div>--> <div @click="isBuy = true" class="w-full text-center" :class="isBuy?'text-primary':'text-gray-400'">فروش طلا</div>-->
<div class="flex justify-evenly w-full px-2 h-11 items-center bg-gray-50 relative rounded "> <div class="flex justify-evenly w-full px-2 h-11 items-center bg-gray-50 relative rounded ">
<div :class="isBuy?'text-secondary':'text-gray-400'" class="w-full text-center z-2" <div :class="isBuy?'text-tertiary':'text-gray-400'" class="w-full text-center z-2"
@click.stop="setIsBuy(true) " @click.stop="setIsBuy(true) "
:style="!props?.ProductItem?.open_buy ? 'pointer-events: none; opacity: 0.5;' : ''"> :style="!props?.ProductItem?.open_buy ? 'pointer-events: none; opacity: 0.5;' : ''">
خرید {{ props?.ProductItem?.title }} خرید {{ props?.ProductItem?.title }}
</div> </div>
<div :class="!isBuy?'text-secondary':'text-gray-400'" class="w-full text-center z-2" <div :class="!isBuy?'text-tertiary':'text-gray-400'" class="w-full text-center z-2"
@click.stop="setIsBuy(false) " @click.stop="setIsBuy(false) "
:style="!props?.ProductItem?.open_sell ? 'pointer-events: none; opacity: 0.5;' : ''" :style="!props?.ProductItem?.open_sell ? 'pointer-events: none; opacity: 0.5;' : ''"
> >
@@ -682,7 +682,7 @@ async function ok() {
background: blue; background: blue;
}*/ }*/
.completeButtonStyle .van-dialog__confirm .van-button__content { .completeButtonStyle .van-dialog__confirm .van-button__content {
background: #0A1B37; background: @App-primary-color;
color: white; color: white;
} }
@@ -715,7 +715,7 @@ async function ok() {
right: 100%; right: 100%;
transform: translate(100%, 0); transform: translate(100%, 0);
} }
.text-secondary{ //.text-secondary{
color: #d3a233 !important; // color: #d3a233 !important;
} //}
</style> </style>
+33 -32
View File
@@ -20,7 +20,7 @@
class="mt-5 text-5 border-solid border-2 border-primary text-primary rounded-[12px] p-4" class="mt-5 text-5 border-solid border-2 border-primary text-primary rounded-[12px] p-4"
> >
<div class="font-bold text-sm text-primary"> <div class="font-bold text-sm text-primary">
قوانین و مقررات معاملات طلا در بستر گلد دات آی آر قوانین و مقررات معاملات طلا در بستر {{ nameProject }}
</div> </div>
<div class="w-full h-1px my-3 bg-secondary"></div> <div class="w-full h-1px my-3 bg-secondary"></div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
@@ -28,23 +28,23 @@
صورت پذیرش آن اقدام به ثبت‌نام نمایند. صورت پذیرش آن اقدام به ثبت‌نام نمایند.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• کاربران گلد دات آی آر می‌پذیرند که کلیه‌ی فعالیت‌های آن‌ها در گلد دات آی آر، در چارچوب قوانین • کاربران {{ nameProject }} می‌پذیرند که کلیه‌ی فعالیت‌های آن‌ها در {{ nameProject }}، در چارچوب قوانین
جمهوری اسلامی ایران بوده و هیچ گونه فعالیتی خارج از این چارچوب انجام نخواهد شد. جمهوری اسلامی ایران بوده و هیچ گونه فعالیتی خارج از این چارچوب انجام نخواهد شد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• احراز هویت برای استفاده از خدمات گلد دات آی آر ضروری بوده و کاربران موظفند اطلاعات صحیح • احراز هویت برای استفاده از خدمات {{ nameProject }} ضروری بوده و کاربران موظفند اطلاعات صحیح
خود را بارگذاری نمایند؛ بدیهی است در صورت وجود هرگونه تخلف در احراز هویت، مسئولیت به خود را بارگذاری نمایند؛ بدیهی است در صورت وجود هرگونه تخلف در احراز هویت، مسئولیت به
عهده‌ی فرد متخلف بوده و گلد دات آی آر حق توقف ارائه خدمات به کاربر مذکور و ارجاع موارد عهده‌ی فرد متخلف بوده و {{ nameProject }} حق توقف ارائه خدمات به کاربر مذکور و ارجاع موارد
تخلف به مراجع ذی‌صلاح را خواهد داشت. تخلف به مراجع ذی‌صلاح را خواهد داشت.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• گلد دات آی آر خود را ملزم به حفظ اطلاعات شخصی کاربران در چارچوب قوانین قضایی کشور • {{ nameProject }}خود را ملزم به حفظ اطلاعات شخصی کاربران در چارچوب قوانین قضایی کشور
می‌داند. می‌داند.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• کاربران گلد دات آی آر تعهد می‌دهند که از قرار دادن حساب خود در اختیار دیگران خودداری • کاربران {{ nameProject }} تعهد می‌دهند که از قرار دادن حساب خود در اختیار دیگران خودداری
نمایند. از خدمات سایت، تنها برای حساب شخصی خود استفاده نموده و مسئولیت استفاده از نمایند. از خدمات سایت، تنها برای حساب شخصی خود استفاده نموده و مسئولیت استفاده از
خدمات گلد دات آی آر برای فردی دیگر، به عهده کاربر خواهد بود. شماره حساب اعلام شده به سایت خدمات {{ nameProject }} برای فردی دیگر، به عهده کاربر خواهد بود. شماره حساب اعلام شده به سایت
باید متعلق به کاربر بوده و کاربران مجاز به دادن شماره حساب متعلق به اشخاص دیگر باید متعلق به کاربر بوده و کاربران مجاز به دادن شماره حساب متعلق به اشخاص دیگر
نیستند. نیستند.
</div> </div>
@@ -55,7 +55,7 @@
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• هرگونه سهل‌انگاری کاربران در حفظ اطلاعات شخصی و امنیتی از جمله: رمز عبور کاربر، • هرگونه سهل‌انگاری کاربران در حفظ اطلاعات شخصی و امنیتی از جمله: رمز عبور کاربر،
سرقت گوشی کاربر، سرقت کارت ملی و مدارک شناسایی کاربر، سپردن مدارک شخصی و موبایل به سرقت گوشی کاربر، سرقت کارت ملی و مدارک شناسایی کاربر، سپردن مدارک شخصی و موبایل به
فرد ثالث و ... به عهده‌ی شخص کاربر بوده و گلد دات آی آر هیچ گونه مسئولیتی در این موارد فرد ثالث و ... به عهده‌ی شخص کاربر بوده و {{ nameProject }} هیچ گونه مسئولیتی در این موارد
نخواهد داشت. نخواهد داشت.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
@@ -63,45 +63,45 @@
شود. شود.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• گلد دات آی آر این اطمینان را می‌دهد که دارایی‌های کاربران را نزد خود به امانت و به • {{ nameProject }} این اطمینان را می‌دهد که دارایی‌های کاربران را نزد خود به امانت و به
بهترین شکل و با بالاترین استانداردهای امنیتی ممکن حفظ نماید؛ در صورت بروز هرگونه بهترین شکل و با بالاترین استانداردهای امنیتی ممکن حفظ نماید؛ در صورت بروز هرگونه
مشکل امنیتی، گلد دات آی آر متعهد به جبران خسارت خواهد بود. مشکل امنیتی، {{ nameProject }} متعهد به جبران خسارت خواهد بود.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• به عنوان پلتفرم معاملات برخط فلزات گران‌بها، هیچ‌گونه مسئولیتی در قبال تصمیمات • به عنوان پلتفرم معاملات برخط فلزات گران‌بها، هیچ‌گونه مسئولیتی در قبال تصمیمات
اقتصادی فی مابین کاربران و سود و زیان حاصل از آن بر عهده گلد دات آی آر نمی‌باشد. اقتصادی فی مابین کاربران و سود و زیان حاصل از آن بر عهده {{ nameProject }} نمی‌باشد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• گلد دات آی آر حق اصلاح و تغییر قوانین و مقررات ذکر شده در این صفحه را چه به صورت کلی و • {{ nameProject }} حق اصلاح و تغییر قوانین و مقررات ذکر شده در این صفحه را چه به صورت کلی و
چه به صورت جزئی دارد و نسخه نهایی را در این صفحه در معرض دید قرار می‌دهد. استفاده از چه به صورت جزئی دارد و نسخه نهایی را در این صفحه در معرض دید قرار می‌دهد. استفاده از
خدمات گلد دات آی آر پس از اعمال تغییرات، به معنای پذیرش همه تغییرات می‌باشد. خدمات {{ nameProject }} پس از اعمال تغییرات، به معنای پذیرش همه تغییرات می‌باشد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• از لحظه خرید کاربران تا زمان تحویل طلای خریداری شده، مسئولیت حفظ و نگهداری اصل طلا • از لحظه خرید کاربران تا زمان تحویل طلای خریداری شده، مسئولیت حفظ و نگهداری اصل طلا
بر عهده گلد دات آی آر می‌باشد. بر عهده {{ nameProject }} می‌باشد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• کاربران گلد دات آی آر اذعان می‌دارند که از ریسک‌های اقتصادی مربوط به سرمایه‌گذاری در • کاربران {{ nameProject }} اذعان می‌دارند که از ریسک‌های اقتصادی مربوط به سرمایه‌گذاری در
حوزه طلا مطلع بوده و با علم بر این موضوع اقدام به تبادل و سرمایه‌گذاری می‌کنند. حوزه طلا مطلع بوده و با علم بر این موضوع اقدام به تبادل و سرمایه‌گذاری می‌کنند.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• گلد دات آی آر متعهد می‌شود در حد توان از حریم شخصی شما محافظت کند و در این راستا، • {{ nameProject }} متعهد می‌شود در حد توان از حریم شخصی شما محافظت کند و در این راستا،
تکنولوژی مورد نیاز در سایت و پلتفرم را برای هر چه مطمئن‌تر و امن‌تر شدن استفاده شما، تکنولوژی مورد نیاز در سایت و پلتفرم را برای هر چه مطمئن‌تر و امن‌تر شدن استفاده شما،
توسعه دهد. توسعه دهد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• در صورت بروز نوسان شدید در قیمت طلا و هرگونه رویداد برهم‌زننده نظم حاکم بر بازار • در صورت بروز نوسان شدید در قیمت طلا و هرگونه رویداد برهم‌زننده نظم حاکم بر بازار
طلا، گلد دات آی آر می‌تواند برای خرید و فروش طلا توسط کاربر سقف تعیین کند تا دو طرف متضرر طلا، {{ nameProject }} می‌تواند برای خرید و فروش طلا توسط کاربر سقف تعیین کند تا دو طرف متضرر
نشوند. نشوند.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• گلد دات آی آر مجاز است بدون اطلاع قبلی و به صلاح‌دید شخصی نسبت به توقف سفارش‌گیری جدید، • {{ nameProject }} مجاز است بدون اطلاع قبلی و به صلاح‌دید شخصی نسبت به توقف سفارش‌گیری جدید،
معاملات (از جمله سفارش‌های باز) را متوقف کند؛ بدیهی است که کلیه سفارش‌های تکمیل‌شده معاملات (از جمله سفارش‌های باز) را متوقف کند؛ بدیهی است که کلیه سفارش‌های تکمیل‌شده
قبل از توقف سفارش‌گیری، پردازش و تحویل داده خواهد شد. قبل از توقف سفارش‌گیری، پردازش و تحویل داده خواهد شد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• در صورت بروز هرگونه اختلال در اینترنت و خدمات زیرساخت به دلایل حاکمیتی، هیچ‌گونه • در صورت بروز هرگونه اختلال در اینترنت و خدمات زیرساخت به دلایل حاکمیتی، هیچ‌گونه
مسئولیتی به عهده گلد دات آی آر نمی‌باشد. مسئولیتی به عهده {{ nameProject }} نمی‌باشد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• درخواست برداشت ریال از حساب کاربری در سریع‌ترین زمان ممکن پس از ثبت، بررسی خواهد • درخواست برداشت ریال از حساب کاربری در سریع‌ترین زمان ممکن پس از ثبت، بررسی خواهد
@@ -115,35 +115,35 @@
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• اگر کاربر تحت هر عنوان اشتباهاً یا من غیر حق، وجوهی را به حساب کاربر منظور یا در • اگر کاربر تحت هر عنوان اشتباهاً یا من غیر حق، وجوهی را به حساب کاربر منظور یا در
محاسبات خود هر نوع اشتباهی نماید، گلد دات آی آر هر زمان مجاز و مختار است راساً و مستقلاً و محاسبات خود هر نوع اشتباهی نماید، {{ nameProject }} هر زمان مجاز و مختار است راساً و مستقلاً و
بدون انجام هیچ‌گونه تشریفات اداری و قضایی و دریافت اجازه کتبی از متعهد (صاحب حساب) بدون انجام هیچ‌گونه تشریفات اداری و قضایی و دریافت اجازه کتبی از متعهد (صاحب حساب)
در رفع اشتباه و برداشت از حساب‌های وی اقدام نماید و تشخیص نسبت به وقوع اشتباه یا در رفع اشتباه و برداشت از حساب‌های وی اقدام نماید و تشخیص نسبت به وقوع اشتباه یا
پرداخت بدون حق و لزوم برداشت از حساب معتبر خواهد بود و کاربر حق هرگونه اعتراض و پرداخت بدون حق و لزوم برداشت از حساب معتبر خواهد بود و کاربر حق هرگونه اعتراض و
ادعایی را در خصوص نحوه عملکرد گلد دات آی آر از هر جهت از خود ساقط می‌نماید. ادعایی را در خصوص نحوه عملکرد {{ nameProject }} از هر جهت از خود ساقط می‌نماید.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• در صورت بروز هرگونه مشکل یا ابهام در هر یک از معاملات (مانند دستکاری قیمت، اختلال • در صورت بروز هرگونه مشکل یا ابهام در هر یک از معاملات (مانند دستکاری قیمت، اختلال
در وب‌سرویس‌ها، انجام معامله خارج از دامنه نوسان و ...)، گلد دات آی آر حق دارد مستقلاً آن در وب‌سرویس‌ها، انجام معامله خارج از دامنه نوسان و ...)، {{ nameProject }} حق دارد مستقلاً آن
معامله را ابطال کرده و دارایی‌های هر یک از طرفین را به حساب خودشان عودت دهد. بدیهی معامله را ابطال کرده و دارایی‌های هر یک از طرفین را به حساب خودشان عودت دهد. بدیهی
است در صورتی که اشکال از سمت گلد دات آی آر باشد، شرکت موظف خواهد بود که جبران خسارت نماید است در صورتی که اشکال از سمت {{ nameProject }} باشد، شرکت موظف خواهد بود که جبران خسارت نماید
و در غیر این صورت، کاربر حق هرگونه اعتراض و ادعایی در خصوص نحوه عملکرد از هر جهت را و در غیر این صورت، کاربر حق هرگونه اعتراض و ادعایی در خصوص نحوه عملکرد از هر جهت را
از خود ساقط می‌نماید. از خود ساقط می‌نماید.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• در صورت فوت یا حجر کاربر، گلد دات آی آر پیرو قوانین جمهوری اسلامی ایران می‌باشد. کاربر • در صورت فوت یا حجر کاربر، {{ nameProject }} پیرو قوانین جمهوری اسلامی ایران می‌باشد. کاربر
با علم و اطلاع از مقررات این بند نسبت به افتتاح حساب کاربری در گلد دات آی آر اقدام نموده و با علم و اطلاع از مقررات این بند نسبت به افتتاح حساب کاربری در {{ nameProject }} اقدام نموده و
کاربر، اشخاص ثالث، ورثه یا قائم‌مقام قانونی ایشان حق اعتراض و یا ادعایی در آینده در کاربر، اشخاص ثالث، ورثه یا قائم‌مقام قانونی ایشان حق اعتراض و یا ادعایی در آینده در
این خصوص نخواهند داشت. این خصوص نخواهند داشت.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• هزینه خدمات و کارمزد تراکنش‌های مالی انجام شده در مطابق با توضیحات ارائه شده در • هزینه خدمات و کارمزد تراکنش‌های مالی انجام شده در مطابق با توضیحات ارائه شده در
صفحه راهنمای استفاده از گلد دات آی آر گلد می‌باشد. صفحه راهنمای استفاده از {{ nameProject }} می‌باشد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• تمامی علائم تجاری، طرح‌های گرافیکی، رابط کاربری، رابط بصری، عکس، لوگو، کدهای • تمامی علائم تجاری، طرح‌های گرافیکی، رابط کاربری، رابط بصری، عکس، لوگو، کدهای
نرم‌افزار، ساختار، نحوه بیان، تنظیم مطالب و محتوای موجود در گلد دات آی آر و شبکه‌های متعلق نرم‌افزار، ساختار، نحوه بیان، تنظیم مطالب و محتوای موجود در {{ nameProject }} و شبکه‌های متعلق
به گلد دات آی آر و به‌طور کلی، سایر حقوق و امتیازات مربوطه منحصراً در مالکیت گلد دات آی آر به {{ nameProject }} و به‌طور کلی، سایر حقوق و امتیازات مربوطه منحصراً در مالکیت {{ nameProject }}
می‌باشد و هیچ شخصی حق استفاده از آن را بدون رضایت گلد دات آی آر ندارد. می‌باشد و هیچ شخصی حق استفاده از آن را بدون رضایت {{ nameProject }} ندارد.
</div> </div>
<div class="mt-5 text-xs leading-5"> <div class="mt-5 text-xs leading-5">
• اگر هر یک از مفاد این موافقت‌نامه بر اساس هر قانون لازم‌الاجرا، نامعتبر یا غیرقابل • اگر هر یک از مفاد این موافقت‌نامه بر اساس هر قانون لازم‌الاجرا، نامعتبر یا غیرقابل
@@ -188,6 +188,7 @@ import { message } from 'ant-design-vue'
import { updateMe } from '@/api/me' import { updateMe } from '@/api/me'
import { useUserStore } from '@/store/userStore' import { useUserStore } from '@/store/userStore'
import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker' import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker'
import {useConfigStore} from "../../../store/configStore";
const userFormState = ref<User>({ const userFormState = ref<User>({
fname: '', fname: '',
@@ -201,7 +202,7 @@ const userFormState = ref<User>({
}) })
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const userStore = useUserStore() const userStore = useUserStore()
const nameProject= useConfigStore().config.name_fa
// const editPassVisible = ref<boolean>(false) // const editPassVisible = ref<boolean>(false)
const editPassVisible = ref<boolean>(false) const editPassVisible = ref<boolean>(false)
@@ -222,12 +223,12 @@ function shareCode() {
const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر! const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای گلد داتت آی آر جا نمونید. این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای ${nameProject} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
gold.ir/login?id=${userStore.userInfo?.referral_id}` gold.ir/login?id=${userStore.userInfo?.referral_id}`
navigator.share({ navigator.share({
title: ' گلد', title: nameProject ,
text: val text: val
}) })
// message.info('کد رونوشت شد') // message.info('کد رونوشت شد')
@@ -51,6 +51,7 @@ import { message } from 'ant-design-vue'
import { updateMe } from '@/api/me' import { updateMe } from '@/api/me'
import { useUserStore } from '@/store/userStore' import { useUserStore } from '@/store/userStore'
import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker' import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker'
import {useConfigStore} from "@/store/configStore";
const userFormState = ref<User>({ const userFormState = ref<User>({
fname: '', fname: '',
@@ -64,6 +65,7 @@ const userFormState = ref<User>({
}) })
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const userStore = useUserStore() const userStore = useUserStore()
const nameProject= useConfigStore().config.name_fa
// const editPassVisible = ref<boolean>(false) // const editPassVisible = ref<boolean>(false)
const editPassVisible = ref<boolean>(false) const editPassVisible = ref<boolean>(false)
@@ -85,12 +87,12 @@ function shareCode() {
const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر! const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای گلد جا نمونید. این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای ${nameProject} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
gold.ir/login?id=${userStore.userInfo?.referral_id}` gold.ir/login?id=${userStore.userInfo?.referral_id}`
navigator.share({ navigator.share({
title: ' گلد', title: nameProject,
text: val text: val
}) })
// message.info('کد رونوشت شد') // message.info('کد رونوشت شد')
+4 -2
View File
@@ -277,6 +277,7 @@ import { message } from 'ant-design-vue'
import { updateMe, updatePass } from '@/api/me' import { updateMe, updatePass } from '@/api/me'
import { useUserStore } from '@/store/userStore' import { useUserStore } from '@/store/userStore'
import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker' import BaseDatePicker from '@/components/BasicPacks/BaseDatePicker'
import {useConfigStore} from "@/store/configStore";
const userFormState = ref<User>({ const userFormState = ref<User>({
fname: '', fname: '',
lname: '', lname: '',
@@ -291,6 +292,7 @@ const userPassForm = ref<Password>({
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const formPassRef = ref<FormInstance>() const formPassRef = ref<FormInstance>()
const userStore = useUserStore() const userStore = useUserStore()
const nameProject= useConfigStore().config.name_fa
// const editPassVisible = ref<boolean>(false) // const editPassVisible = ref<boolean>(false)
const editPassVisible = ref<boolean>(false) const editPassVisible = ref<boolean>(false)
@@ -340,12 +342,12 @@ function shareCode() {
const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر! const val = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر! با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای گلد دات آی آر جا نمونید. این دعوت نامه از طرف "${userStore.userInfo?.name}" عزیز برای شما ارسال شده تا شما هم از بازار طلای ${nameProject} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید. روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
gold.ir/login?id=${userStore.userInfo?.referral_id}` gold.ir/login?id=${userStore.userInfo?.referral_id}`
navigator.share({ navigator.share({
title: ' گلد دات آی آر', title: nameProject,
text: val text: val
}) })
// message.info('کد رونوشت شد') // message.info('کد رونوشت شد')
+2 -1
View File
@@ -37,7 +37,7 @@
<BasicInput <BasicInput
v-model:value="form.value" v-model:value="form.value"
addon-before="ریال" addon-before="ریال"
addon-bg-color="#0A1B37" :addon-bg-color="useConfigStore().config.color"
addon-text-color="white" addon-text-color="white"
place-holder="مبلغ" place-holder="مبلغ"
size="large" size="large"
@@ -345,6 +345,7 @@ import SkeletonLoading from './components/SkeletonLoading.vue'
import BaseDatePicker from "@/components/BasicPacks/BaseDatePicker"; import BaseDatePicker from "@/components/BasicPacks/BaseDatePicker";
import img from "@/assets/img/user_ly1.svg"; import img from "@/assets/img/user_ly1.svg";
import BasicModal from "@/components/BasicPacks/BasicModal.vue"; import BasicModal from "@/components/BasicPacks/BasicModal.vue";
import {useConfigStore} from "@/store/configStore";
const isDeposit = ref<boolean>(true) const isDeposit = ref<boolean>(true)
const walletStore = useWalletStore() const walletStore = useWalletStore()
const userStore = useUserStore() const userStore = useUserStore()
+1 -1
View File
@@ -118,7 +118,7 @@
</div> </div>
</BasicButton> </BasicButton>
<div class="flex gap-1 justify-center mt-5 text-xs" @click="$emit('register',true)">اگر حساب کاربری ندارید <div class="flex gap-1 justify-center mt-5 text-xs" @click="$emit('register',true)">اگر حساب کاربری ندارید
<div class="font-bold text-[#0A1B37]">از این قسمت</div> <div class="font-bold text-primary">از این قسمت</div>
ثبت نام کنید. ثبت نام کنید.
</div> </div>
</a-form-item> </a-form-item>
+1 -1
View File
@@ -39,7 +39,7 @@
</div> </div>
</BasicButton> </BasicButton>
<div class="flex gap-1 justify-center mt-5 text-xs" @click="$emit('register',false)">اگر حساب کاربری دارید <div class="flex gap-1 justify-center mt-5 text-xs" @click="$emit('register',false)">اگر حساب کاربری دارید
<div class="font-bold text-[#0A1B37]">از این قسمت</div> <div class="font-bold text-primary">از این قسمت</div>
وارد شوید. وارد شوید.
</div> </div>
</a-form-item> </a-form-item>
+9
View File
@@ -0,0 +1,9 @@
/// <reference types="vite/client" />
declare global {
interface Window {
__APP_CONFIG__?: Record<string, any>;
}
}
export {};
+2 -2
View File
@@ -10,9 +10,9 @@ export default defineConfig({
], ],
theme: { theme: {
colors: { colors: {
"primary": "#0A1B37", "primary": 'var(--App-primary-color)',
"secondary": "#ffffff", "secondary": "#ffffff",
"tertiary": "#e0be7f" "tertiary": 'var(--App-secondary-color)'
} }
}, },
presets: [ presets: [