diff --git a/.env b/.env index 55182d9..4b877b2 100644 --- a/.env +++ b/.env @@ -7,6 +7,12 @@ VITE_INQUIRE_AES_KEY=ff83609b2b24fc73196aac3d3dfb874f VITE_WECHAT_APP_ID=wx442ee1ac1ee75917 +# 阿里云滑块验证码配置 +# 从阿里云验证码控制台获取 SceneId +VITE_ALIYUN_CAPTCHA_SCENE_ID=wynt39to +# 是否启用加密模式(true/false),需要在阿里云控制台开启加密模式 +# 注意:根据代码逻辑,设置为 true 表示禁用加密,设置为 false 表示启用加密 +VITE_ALIYUN_CAPTCHA_ENCRYPTED=true VITE_CHAT_AES_KEY=qw5w6SFE2D1jmxyd VITE_CHAT_AES_IV=345GDFED433223DF diff --git a/index.html b/index.html index 43615a0..57a5b19 100644 --- a/index.html +++ b/index.html @@ -109,6 +109,12 @@ delete window.wx; + + + + @@ -207,6 +213,8 @@
加载中
+ +
diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts index e49c706..38b094f 100644 --- a/src/auto-imports.d.ts +++ b/src/auto-imports.d.ts @@ -119,6 +119,7 @@ declare global { const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] const useAgent: typeof import('./composables/useAgent.js')['useAgent'] const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore'] + const useAliyunCaptcha: typeof import('./composables/useAliyunCaptcha.js')['useAliyunCaptcha'] const useAnimate: typeof import('@vueuse/core')['useAnimate'] const useApiFetch: typeof import('./composables/useApiFetch.js')['default'] const useAppStore: typeof import('./stores/appStore.js')['useAppStore'] diff --git a/src/components/BaseReport.vue b/src/components/BaseReport.vue index 414bbbb..feb4aa2 100644 --- a/src/components/BaseReport.vue +++ b/src/components/BaseReport.vue @@ -703,6 +703,7 @@ const featureMap = { name: "谛听多维报告", component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/index.vue")), }, + // 谛听多维报告拆分模块 DWBG8B4D_Overview: { name: "报告概览", diff --git a/src/components/InquireForm.vue b/src/components/InquireForm.vue index e9d7ede..aab855d 100644 --- a/src/components/InquireForm.vue +++ b/src/components/InquireForm.vue @@ -133,6 +133,7 @@ import { useUserStore } from "@/stores/userStore"; import { useDialogStore } from "@/stores/dialogStore"; import { useEnv } from "@/composables/useEnv"; import { showConfirmDialog } from "vant"; +import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha"; import Payment from "@/components/Payment.vue"; import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue"; @@ -200,6 +201,7 @@ const dialogStore = useDialogStore(); const userStore = useUserStore(); const { isWeChat } = useEnv(); const appStore = useAppStore(); +const { runWithCaptcha } = useAliyunCaptcha(); // 响应式数据 const showPayment = ref(false); @@ -440,22 +442,27 @@ async function sendVerificationCode() { return; } - const { data, error } = await useApiFetch("/auth/sendSms") - .post({ mobile: formData.mobile, actionType: "query" }) - .json(); - - if (!error.value && data.value.code === 200) { - showToast({ message: "验证码发送成功", type: "success" }); - startCountdown(); - nextTick(() => { - const verificationCodeInput = document.getElementById('verificationCode'); - if (verificationCodeInput) { - verificationCodeInput.focus(); + // 使用阿里云滑块验证码保护发送短信接口 + runWithCaptcha( + (captchaVerifyParam) => useApiFetch("/auth/sendSms") + .post({ mobile: formData.mobile, actionType: "query", captchaVerifyParam }) + .json(), + (result) => { + const { data, error } = result + if (!error.value && data.value?.code === 200) { + showToast({ message: "验证码发送成功", type: "success" }); + startCountdown(); + nextTick(() => { + const verificationCodeInput = document.getElementById('verificationCode'); + if (verificationCodeInput) { + verificationCodeInput.focus(); + } + }); + } else { + showToast({ message: data.value?.msg || "验证码发送失败,请重试" }); } - }); - } else { - showToast({ message: "验证码发送失败,请重试" }); - } + } + ); } let timer = null; diff --git a/src/composables/useAliyunCaptcha.js b/src/composables/useAliyunCaptcha.js new file mode 100644 index 0000000..74a4035 --- /dev/null +++ b/src/composables/useAliyunCaptcha.js @@ -0,0 +1,221 @@ +import { showToast, showLoadingToast, closeToast } from 'vant' +import useApiFetch from '@/composables/useApiFetch' + +// 阿里云验证码场景ID(从环境变量读取) +const ALIYUN_CAPTCHA_SCENE_ID = import.meta.env.VITE_ALIYUN_CAPTCHA_SCENE_ID || 'wynt39to' + +// 是否启用加密模式(通过环境变量控制,非加密模式时前端不调用后端获取 EncryptedSceneId) +const ENABLE_ENCRYPTED = import.meta.env.VITE_ALIYUN_CAPTCHA_ENCRYPTED === 'false' + +let captchaInitialized = false +/** 首次初始化后,SDK 会异步调用 getInstance,用此 Promise 在实例就绪后再 show */ +let captchaReadyPromise = null +let captchaReadyResolve = null + +async function ensureCaptchaInit() { + console.log('[AliyunCaptcha] ====== ensureCaptchaInit 开始执行 ======'); + + // 1. 检查是否已经初始化或非浏览器环境 + if (captchaInitialized) { + console.log('[AliyunCaptcha] 已初始化,直接返回'); + return; + } + if (typeof window === 'undefined') { + console.log('[AliyunCaptcha] 非浏览器环境,直接返回'); + return; + } + + // 2. 检查 SDK 是否存在 + if (typeof window.initAliyunCaptcha !== 'function') { + console.error('[AliyunCaptcha] ❌ initAliyunCaptcha 不存在,SDK 可能未加载!请检查是否引入 captcha.js'); + return; + } + console.log('[AliyunCaptcha] ✅ initAliyunCaptcha 函数存在,SDK 已加载'); + + // 3. 设置初始化状态 + captchaInitialized = true; + window.captcha = null; + window.__lastBizResponse = null; + window.__onCaptchaBizSuccess = null; + captchaReadyPromise = new Promise((resolve) => { + captchaReadyResolve = resolve; + }); + console.log('[AliyunCaptcha] 初始化状态已设置,创建 captchaReadyPromise'); + + // 4. 构建配置对象 + const initConfig = { + SceneId: ALIYUN_CAPTCHA_SCENE_ID, + mode: 'popup', + element: '#captcha-element', + + getInstance(instance) { + console.log('[AliyunCaptcha] 🎯 getInstance 被调用,实例已创建:', instance); + window.captcha = instance; + if (typeof captchaReadyResolve === 'function') { + console.log('[AliyunCaptcha] ✅ 调用 captchaReadyResolve(),通知实例就绪'); + captchaReadyResolve(); + captchaReadyResolve = null; + } else { + console.warn('[AliyunCaptcha] ⚠️ captchaReadyResolve 不是函数,可能已被调用'); + } + }, + + captchaVerifyCallback(param) { + console.log('[AliyunCaptcha] 📞 captchaVerifyCallback 被调用,参数:', JSON.stringify(param, null, 2)); + const result = typeof window.__captchaVerifyCallback === 'function' + ? window.__captchaVerifyCallback(param) + : Promise.resolve({ captchaResult: false, bizResult: false }); + + console.log('[AliyunCaptcha] 📤 captchaVerifyCallback 返回值:', result); + return result; + }, + + onBizResultCallback(bizResult) { + console.log('[AliyunCaptcha] 📬 onBizResultCallback 被调用,bizResult:', bizResult); + if (typeof window.__onBizResultCallback === 'function') { + window.__onBizResultCallback(bizResult); + } else { + console.warn('[AliyunCaptcha] ⚠️ __onBizResultCallback 不是函数'); + } + window.__lastBizResponse = null; + window.__onCaptchaBizSuccess = null; + }, + + slideStyle: { width: 360, height: 40 }, + language: 'cn', + }; + + console.log('[AliyunCaptcha] 📋 构建的 initConfig:', JSON.stringify(initConfig, null, 2)); + + // 5. 判断加密模式 + if (!ENABLE_ENCRYPTED) { + console.log('[AliyunCaptcha] 🔓 使用非加密模式(ENABLE_ENCRYPTED = false)'); + console.log('[AliyunCaptcha] 📤 调用 window.initAliyunCaptcha(initConfig)'); + try { + window.initAliyunCaptcha(initConfig); + console.log('[AliyunCaptcha] ✅ initAliyunCaptcha 调用完成(非加密模式)'); + } catch (err) { + console.error('[AliyunCaptcha] ❌ initAliyunCaptcha 调用失败(非加密模式):', err); + } + return; + } + + // 6. 加密模式:获取 encryptedSceneId + console.log('[AliyunCaptcha] 🔐 使用加密模式(ENABLE_ENCRYPTED = true)'); + console.log('[AliyunCaptcha] 📡 请求后端接口获取 encryptedSceneId: /captcha/encryptedSceneId'); + + let resp, encryptedSceneId; + try { + const { data, error } = await useApiFetch('/captcha/encryptedSceneId') + .post() + .json(); + + console.log('[AliyunCaptcha] 📥 后端接口响应:', { data: data?.value, error: error?.value }); + + resp = data?.value; + encryptedSceneId = resp?.data?.encryptedSceneId; + + if (error?.value) { + console.error('[AliyunCaptcha] ❌ 后端接口请求失败:', error.value); + } + if (!encryptedSceneId) { + console.error('[AliyunCaptcha] ❌ encryptedSceneId 为空,响应数据:', resp); + } + } catch (err) { + console.error('[AliyunCaptcha] ❌ 请求 encryptedSceneId 时发生异常:', err); + resp = null; + encryptedSceneId = null; + } + + if (error?.value || !encryptedSceneId) { + console.error('[AliyunCaptcha] ❌ 获取 encryptedSceneId 失败,error:', error?.value, 'encryptedSceneId:', encryptedSceneId); + showToast({ message: '获取验证码参数失败,请稍后重试' }); + captchaInitialized = false; + captchaReadyPromise = null; + captchaReadyResolve = null; + console.log('[AliyunCaptcha] 🔄 重置初始化状态,等待下次重试'); + return; + } + + console.log('[AliyunCaptcha] ✅ 成功获取 encryptedSceneId:', encryptedSceneId); + initConfig.EncryptedSceneId = encryptedSceneId; + console.log('[AliyunCaptcha] 📤 调用 window.initAliyunCaptcha(initConfig)(加密模式)'); + + try { + console.log('[AliyunCaptcha] 开始调用 window.initAliyunCaptcha(initConfig)(加密模式)') + window.initAliyunCaptcha(initConfig) + console.log('[AliyunCaptcha] ✅ window.initAliyunCaptcha 调用完成(加密模式)') + } catch (err) { + console.error('[AliyunCaptcha] ❌ window.initAliyunCaptcha 调用失败(加密模式):', err) + } + +} + +/** + * 阿里云滑块验证码通用封装。 + * 依赖 index.html 中已加载的 AliyunCaptcha.js;初始化在首次调起时执行。 + * + * @param { (captchaVerifyParam: string) => Promise<{ data: Ref, error: Ref }> } bizVerify - 业务请求函数,接收滑块参数,返回 useApiFetch 的 { data, error } + * @param { (res: any) => void } [onSuccess] - 业务成功回调(code===200 时调用,传入接口返回的 data.value) + */ +export function useAliyunCaptcha() { + /** + * 先弹出滑块,通过后执行 bizVerify(captchaVerifyParam),再根据结果调用 onSuccess。 + */ + async function runWithCaptcha(bizVerify, onSuccess) { + if (typeof window === 'undefined') { + showToast({ message: '验证码仅支持浏览器环境' }) + return + } + + showLoadingToast({ + message: '安全验证加载中...', + forbidClick: true, + duration: 0, + loadingType: 'spinner', + }) + + try { + window.__captchaVerifyCallback = async (captchaVerifyParam) => { + window.__lastBizResponse = null + const { data, error } = await bizVerify(captchaVerifyParam) + const result = data?.value ?? data + if (error?.value || !result) { + return { captchaResult: false, bizResult: false } + } + window.__lastBizResponse = result + const captchaOk = result.captchaVerifyResult !== false + const bizOk = result.code === 200 + return { captchaResult: captchaOk, bizResult: bizOk } + } + + window.__onBizResultCallback = (bizResult) => { + if ( + bizResult === true && + window.__lastBizResponse && + typeof window.__onCaptchaBizSuccess === 'function' + ) { + window.__onCaptchaBizSuccess(window.__lastBizResponse) + } + } + + await ensureCaptchaInit() + + // 首次初始化时 SDK 会异步调用 getInstance,需等待实例就绪后再 show + if (captchaReadyPromise) { + await captchaReadyPromise + captchaReadyPromise = null + } + if (!window.captcha) { + showToast({ message: '验证码未加载,请刷新页面重试' }) + return + } + window.__onCaptchaBizSuccess = onSuccess + window.captcha.show() + } finally { + closeToast() + } + } + + return { runWithCaptcha } +} diff --git a/src/views/AgentPromoteDetails.vue b/src/views/AgentPromoteDetails.vue index ea98104..cccb1fa 100644 --- a/src/views/AgentPromoteDetails.vue +++ b/src/views/AgentPromoteDetails.vue @@ -18,6 +18,10 @@ + +
+ 税后收入:{{ (item.amount * 0.94).toFixed(2) }} +
diff --git a/src/views/AgentRewardsDetails.vue b/src/views/AgentRewardsDetails.vue index 7e0e15b..5242e82 100644 --- a/src/views/AgentRewardsDetails.vue +++ b/src/views/AgentRewardsDetails.vue @@ -24,6 +24,10 @@
+ +
+ 税后收入:{{ (item.amount * 0.94).toFixed(2) }} +
-
余额
+
税后收入
- ¥ {{ (revenueData?.balance || 0).toFixed(2) }} + :style="afterTax(revenueData?.balance) < 0 ? 'color: #ef4444;' : 'color: var(--van-theme-primary);'"> + ¥ {{ afterTax(revenueData?.balance).toFixed(2) }}
-
+
账户存在欠款,需补足后才能提现
@@ -71,21 +71,21 @@
-
累计收益
+
累计收益(税后)
- ¥ {{ (revenueData?.total_earnings || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.total_earnings).toFixed(2) }}
风险保障金
- ¥ {{ (revenueData?.frozen_balance || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.frozen_balance || 0).toFixed(2) }}
累计提现
- ¥ {{ (revenueData?.withdrawn_amount || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.withdrawn_amount).toFixed(2) }}
@@ -116,12 +116,12 @@
- 我的推广收益 + 我的推广收益(税后)
- ¥ {{ (revenueData?.commission_total || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.commission_total).toFixed(2) }}
累计总收益
@@ -129,13 +129,13 @@
今日
- ¥ {{ (revenueData?.commission_today || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.commission_today).toFixed(2) }}
本月
- ¥ {{ (revenueData?.commission_month || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.commission_month).toFixed(2) }}
@@ -151,12 +151,12 @@
- 下级推广收益 + 下级推广收益(税后)
- ¥ {{ (revenueData?.rebate_total || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.rebate_total).toFixed(2) }}
累计总收益
@@ -164,13 +164,13 @@
今日
- ¥ {{ (revenueData?.rebate_today || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.rebate_today).toFixed(2) }}
本月
- ¥ {{ (revenueData?.rebate_month || 0).toFixed(2) }} + ¥ {{ afterTax(revenueData?.rebate_month).toFixed(2) }}
@@ -289,6 +289,10 @@ const { userName, userAvatar, isLoggedIn, mobile } = storeToRefs(userStore); const { isWeChat } = useEnv(); const revenueData = ref(null); +// 税率常量(6%) +const TAX_RATE = 0.06; +const afterTax = (amount) => (amount || 0) * (1 - TAX_RATE); + // 等级名称映射(数字等级) const levelNamesMap = { 1: "普通代理", diff --git a/src/views/Withdraw.vue b/src/views/Withdraw.vue index 5cdb2d0..94a5646 100644 --- a/src/views/Withdraw.vue +++ b/src/views/Withdraw.vue @@ -105,34 +105,34 @@
- 可提现金额: - ¥{{ (availableAmount || 0).toFixed(2) }} + 可提现金额(税后): + ¥{{ afterTax(availableAmount).toFixed(2) }}
本月支付宝提现额度: - ¥{{ alipayMonthQuota.toFixed(2) }} + ¥{{ afterTax(alipayMonthQuota).toFixed(2) }} ,已用: - ¥{{ alipayMonthUsed.toFixed(2) }} + ¥{{ afterTax(alipayMonthUsed).toFixed(2) }} ,剩余: - ¥{{ alipayMonthRemain.toFixed(2) }} + :style="afterTax(alipayMonthRemain) <= 0 ? 'color: #ef4444;' : 'color: var(--van-theme-primary);'"> + ¥{{ afterTax(alipayMonthRemain).toFixed(2) }}
-
+
本月支付宝提现额度已用完,请使用银行卡提现。
-
+
账户存在欠款
- 您的账户余额为负数,存在欠款金额 ¥{{ Math.abs(availableAmount || 0).toFixed(2) }}。 + 您的账户余额为负数,存在欠款金额 ¥{{ Math.abs(afterTax(availableAmount)).toFixed(2) }}。 请先通过后续订单收益补足欠款后,才能申请提现。
@@ -256,19 +256,19 @@
- 可提现金额: - ¥{{ (availableAmount || 0).toFixed(2) }} + 可提现金额(税后): + ¥{{ afterTax(availableAmount).toFixed(2) }}
-
+
账户存在欠款
- 您的账户余额为负数,存在欠款金额 ¥{{ Math.abs(availableAmount || 0).toFixed(2) }}。 + 您的账户余额为负数,存在欠款金额 ¥{{ Math.abs(afterTax(availableAmount)).toFixed(2) }}。 请先通过后续订单收益补足欠款后,才能申请提现。
@@ -304,11 +304,11 @@
- - {{ (availableAmount || 0) < 0 ? '账户存在欠款,无法提现' : '立即提现' }} + {{ afterTax(availableAmount) < 0 ? '账户存在欠款,无法提现' : '立即提现' }}
@@ -323,12 +323,12 @@
-
+
- 提现金额: - ¥{{ amount }} + 提现到账金额: + ¥{{ amount }}
-
+
@@ -348,10 +348,11 @@

税收说明

-
-

• 提现金额:¥{{ amount }}

+
+

当前税率:6%

+
@@ -457,6 +458,14 @@ const agentStore = useAgentStore(); const dialogStore = useDialogStore(); + + // 税率常量(6%) + const TAX_RATE = 0.06; + // 税后金额 = 税前金额 * (1 - TAX_RATE) + const afterTax = (amount) => (amount || 0) * (1 - TAX_RATE); + // 税前金额 = 税后金额 / (1 - TAX_RATE) + const beforeTax = (afterTaxAmount) => (afterTaxAmount || 0) / (1 - TAX_RATE); + // Tab 切换 const activeTab = ref("alipay"); // 状态管理 @@ -602,6 +611,9 @@ // 表单验证 const validateAmount = (val) => { const num = Number(val); + // 税前金额(用于与余额比较) + const preTaxAmount = beforeTax(num); + // 如果余额为负数,不允许提现 if (availableAmount.value < 0) { return false; @@ -609,14 +621,18 @@ if (activeTab.value === 'alipay') { // 支付宝金额需同时满足余额与额度限制 - if (alipayMonthRemain.value <= 0) { + // 税后额度剩余 + const afterTaxRemain = afterTax(alipayMonthRemain.value); + if (afterTaxRemain <= 0) { return false; } - return num >= 50 && num <= availableAmount.value && num <= alipayMonthRemain.value; + // 税后金额 >= 50,税前金额 <= 余额,税后金额 <= 税后额度剩余 + return num >= 50 && preTaxAmount <= availableAmount.value && num <= afterTaxRemain; } // 银行卡提现只受余额限制 - return num >= 50 && num <= availableAmount.value; + // 税后金额 >= 50,税前金额 <= 余额 + return num >= 50 && preTaxAmount <= availableAmount.value; }; const validateForm = () => { @@ -664,19 +680,23 @@ return false; } - if (amountNum > availableAmount.value) { + // 税前金额(用于与余额比较) + const preTaxAmount = beforeTax(amountNum); + + if (preTaxAmount > availableAmount.value) { showToast("超过可提现金额"); return false; } // 支付宝额度检查 if (activeTab.value === 'alipay') { - if (alipayMonthRemain.value <= 0) { + const afterTaxRemain = afterTax(alipayMonthRemain.value); + if (afterTaxRemain <= 0) { showToast("本月支付宝提现额度已用完,请使用银行卡提现"); return false; } - if (amountNum > alipayMonthRemain.value) { - showToast(`本月支付宝最高可提现 ${alipayMonthRemain.value.toFixed(2)} 元,请调整提现金额或使用银行卡提现`); + if (amountNum > afterTaxRemain) { + showToast(`本月支付宝最高可提现 ${afterTaxRemain.toFixed(2)} 元,请调整提现金额或使用银行卡提现`); return false; } } @@ -711,9 +731,12 @@ isSubmitting.value = true; try { const withdrawalType = activeTab.value === 'alipay' ? 1 : 2; + // 用户输入的是税后金额,传给后端需要逆推为税前金额 + const preTaxWithdrawAmount = beforeTax(Number(amount.value)); + const params = { withdrawal_type: withdrawalType, - amount: Number(amount.value), + amount: preTaxWithdrawAmount, // 传税前金额给后端 payee_name: realName.value, }; @@ -756,14 +779,14 @@ if (status.value === 2) resetPage(); } }; - // 填充最大金额 + // 填充最大金额(税后金额) const fillMaxAmount = () => { if (activeTab.value === 'alipay') { - const maxByQuota = alipayMonthRemain.value || 0; - const maxByBalance = availableAmount.value || 0; - amount.value = Math.min(maxByQuota, maxByBalance); + const maxByQuotaAfterTax = afterTax(alipayMonthRemain.value) || 0; + const maxByBalanceAfterTax = afterTax(availableAmount.value) || 0; + amount.value = Math.min(maxByQuotaAfterTax, maxByBalanceAfterTax); } else { - amount.value = availableAmount.value; + amount.value = afterTax(availableAmount.value); } }; diff --git a/vite.config.js.timestamp-1771994358985-793c3aa69da34.mjs b/vite.config.js.timestamp-1771994358985-793c3aa69da34.mjs new file mode 100644 index 0000000..d693aac --- /dev/null +++ b/vite.config.js.timestamp-1771994358985-793c3aa69da34.mjs @@ -0,0 +1,99 @@ +// vite.config.js +import { fileURLToPath, URL } from "node:url"; +import AutoImport from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/unplugin-auto-import@0.18.5_50625f5cebf4df05ecf78275692ab72e/node_modules/unplugin-auto-import/dist/vite.js"; +import Components from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/unplugin-vue-components@0.2_7a998863e003c647fcddc8da197d7058/node_modules/unplugin-vue-components/dist/vite.js"; +import { VantResolver } from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/@vant+auto-import-resolver@1.2.1/node_modules/@vant/auto-import-resolver/dist/index.esm.mjs"; +import { defineConfig } from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/vite@5.4.11_sass-embedded@1.81.0_terser@5.43.1/node_modules/vite/dist/node/index.js"; +import vue from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/@vitejs+plugin-vue@5.2.0_vi_7884609547a4714267a4084011d6753f/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import vueJsx from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.1._62a5d188701d5e2b6505e81520915a90/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs"; +import vueDevTools from "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/node_modules/.pnpm/vite-plugin-vue-devtools@7._daef52fa252018fa499b954bbd20e769/node_modules/vite-plugin-vue-devtools/dist/vite.mjs"; +var __vite_injected_original_import_meta_url = "file:///C:/Users/a1726/Desktop/ycc/ycc-proxy-webview/vite.config.js"; +var vite_config_default = defineConfig({ + server: { + host: "0.0.0.0", + // 设置为 0.0.0.0 允许局域网访问 + port: 5678, + // 自定义端口号,可选 + strictPort: true, + // 如果端口被占用则抛出错误而不是使用下一个可用端口 + proxy: { + "/api/v1": { + target: "http://127.0.0.1:8888", + // 本地接口地址 + // target: "https://www.onecha.cn", // 修改为带 www 的域名,避免 301 重定向 + changeOrigin: true, + rewrite: (path) => path + // 可选:确保路径不被修改 + } + } + }, + build: { + // 构建优化 + target: "es2015", + // 支持更多浏览器 + minify: "terser", + // 使用terser进行压缩 + terserOptions: { + compress: { + drop_console: true, + // 移除console.log + drop_debugger: true + // 移除debugger + } + }, + rollupOptions: { + output: { + // 代码分割策略 + manualChunks: { + vendor: ["vue", "vue-router", "pinia"], + vant: ["vant"], + utils: ["axios", "lodash", "crypto-js"], + charts: ["echarts", "vue-echarts"] + }, + // 文件名策略 + chunkFileNames: "assets/js/[name]-[hash].js", + entryFileNames: "assets/js/[name]-[hash].js", + assetFileNames: "assets/[ext]/[name]-[hash].[ext]" + } + }, + // 启用CSS代码分割 + cssCodeSplit: true, + // 设置资源内联阈值 + assetsInlineLimit: 4096 + }, + plugins: [ + vue(), + AutoImport({ + imports: [ + "vue", + // 自动引入 Vue Composition API,如 ref、computed、onMounted 等 + "vue-router", + // 自动引入 vue-router 中的方法,如 useRoute、useRouter 等(可选) + "@vueuse/core" + // 自动引入 VueUse 中的工具函数(可选) + ], + dts: "src/auto-imports.d.ts", + // 生成类型定义文件(可选) + dirs: ["src/composables", "src/stores", "src/components"], + resolvers: [VantResolver()] + }), + Components({ + resolvers: [VantResolver()] + }), + vueJsx() + // vueDevTools(), + ], + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) + } + }, + // 优化依赖预构建 + optimizeDeps: { + include: ["vue", "vue-router", "pinia", "vant", "axios"] + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxhMTcyNlxcXFxEZXNrdG9wXFxcXHljY1xcXFx5Y2MtcHJveHktd2Vidmlld1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcYTE3MjZcXFxcRGVza3RvcFxcXFx5Y2NcXFxceWNjLXByb3h5LXdlYnZpZXdcXFxcdml0ZS5jb25maWcuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL2ExNzI2L0Rlc2t0b3AveWNjL3ljYy1wcm94eS13ZWJ2aWV3L3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XHJcbmltcG9ydCBBdXRvSW1wb3J0IGZyb20gXCJ1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlXCI7XHJcbmltcG9ydCBDb21wb25lbnRzIGZyb20gXCJ1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlXCI7XHJcbmltcG9ydCB7IFZhbnRSZXNvbHZlciB9IGZyb20gXCJAdmFudC9hdXRvLWltcG9ydC1yZXNvbHZlclwiO1xyXG5pbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tIFwidml0ZVwiO1xyXG5pbXBvcnQgdnVlIGZyb20gXCJAdml0ZWpzL3BsdWdpbi12dWVcIjtcclxuaW1wb3J0IHZ1ZUpzeCBmcm9tIFwiQHZpdGVqcy9wbHVnaW4tdnVlLWpzeFwiO1xyXG5pbXBvcnQgdnVlRGV2VG9vbHMgZnJvbSBcInZpdGUtcGx1Z2luLXZ1ZS1kZXZ0b29sc1wiO1xyXG5cclxuLy8gaHR0cHM6Ly92aXRlLmRldi9jb25maWcvXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgICBzZXJ2ZXI6IHtcclxuICAgICAgICBob3N0OiBcIjAuMC4wLjBcIiwgLy8gXHU4QkJFXHU3RjZFXHU0RTNBIDAuMC4wLjAgXHU1MTQxXHU4QkI4XHU1QzQwXHU1N0RGXHU3RjUxXHU4QkJGXHU5NUVFXHJcbiAgICAgICAgcG9ydDogNTY3OCwgLy8gXHU4MUVBXHU1QjlBXHU0RTQ5XHU3QUVGXHU1M0UzXHU1M0Y3XHVGRjBDXHU1M0VGXHU5MDA5XHJcbiAgICAgICAgc3RyaWN0UG9ydDogdHJ1ZSwgLy8gXHU1OTgyXHU2NzlDXHU3QUVGXHU1M0UzXHU4OEFCXHU1MzYwXHU3NTI4XHU1MjE5XHU2MjlCXHU1MUZBXHU5NTE5XHU4QkVGXHU4MDBDXHU0RTBEXHU2NjJGXHU0RjdGXHU3NTI4XHU0RTBCXHU0RTAwXHU0RTJBXHU1M0VGXHU3NTI4XHU3QUVGXHU1M0UzXHJcbiAgICAgICAgcHJveHk6IHtcclxuICAgICAgICAgICAgXCIvYXBpL3YxXCI6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldDogXCJodHRwOi8vMTI3LjAuMC4xOjg4ODhcIiwgLy8gXHU2NzJDXHU1NzMwXHU2M0E1XHU1M0UzXHU1NzMwXHU1NzQwXHJcbiAgICAgICAgICAgICAgICAvLyB0YXJnZXQ6IFwiaHR0cHM6Ly93d3cub25lY2hhLmNuXCIsIC8vIFx1NEZFRVx1NjUzOVx1NEUzQVx1NUUyNiB3d3cgXHU3Njg0XHU1N0RGXHU1NDBEXHVGRjBDXHU5MDdGXHU1MTREIDMwMSBcdTkxQ0RcdTVCOUFcdTU0MTFcclxuICAgICAgICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLCAvLyBcdTUzRUZcdTkwMDlcdUZGMUFcdTc4NkVcdTRGRERcdThERUZcdTVGODRcdTRFMERcdTg4QUJcdTRGRUVcdTY1MzlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgfSxcclxuICAgIGJ1aWxkOiB7XHJcbiAgICAgICAgLy8gXHU2Nzg0XHU1RUZBXHU0RjE4XHU1MzE2XHJcbiAgICAgICAgdGFyZ2V0OiBcImVzMjAxNVwiLCAvLyBcdTY1MkZcdTYzMDFcdTY2RjRcdTU5MUFcdTZENEZcdTg5QzhcdTU2NjhcclxuICAgICAgICBtaW5pZnk6IFwidGVyc2VyXCIsIC8vIFx1NEY3Rlx1NzUyOHRlcnNlclx1OEZEQlx1ODg0Q1x1NTM4Qlx1N0YyOVxyXG4gICAgICAgIHRlcnNlck9wdGlvbnM6IHtcclxuICAgICAgICAgICAgY29tcHJlc3M6IHtcclxuICAgICAgICAgICAgICAgIGRyb3BfY29uc29sZTogdHJ1ZSwgLy8gXHU3OUZCXHU5NjY0Y29uc29sZS5sb2dcclxuICAgICAgICAgICAgICAgIGRyb3BfZGVidWdnZXI6IHRydWUsIC8vIFx1NzlGQlx1OTY2NGRlYnVnZ2VyXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICByb2xsdXBPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIG91dHB1dDoge1xyXG4gICAgICAgICAgICAgICAgLy8gXHU0RUUzXHU3ODAxXHU1MjA2XHU1MjcyXHU3QjU2XHU3NTY1XHJcbiAgICAgICAgICAgICAgICBtYW51YWxDaHVua3M6IHtcclxuICAgICAgICAgICAgICAgICAgICB2ZW5kb3I6IFtcInZ1ZVwiLCBcInZ1ZS1yb3V0ZXJcIiwgXCJwaW5pYVwiXSxcclxuICAgICAgICAgICAgICAgICAgICB2YW50OiBbXCJ2YW50XCJdLFxyXG4gICAgICAgICAgICAgICAgICAgIHV0aWxzOiBbXCJheGlvc1wiLCBcImxvZGFzaFwiLCBcImNyeXB0by1qc1wiXSxcclxuICAgICAgICAgICAgICAgICAgICBjaGFydHM6IFtcImVjaGFydHNcIiwgXCJ2dWUtZWNoYXJ0c1wiXSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAvLyBcdTY1ODdcdTRFRjZcdTU0MERcdTdCNTZcdTc1NjVcclxuICAgICAgICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiBcImFzc2V0cy9qcy9bbmFtZV0tW2hhc2hdLmpzXCIsXHJcbiAgICAgICAgICAgICAgICBlbnRyeUZpbGVOYW1lczogXCJhc3NldHMvanMvW25hbWVdLVtoYXNoXS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IFwiYXNzZXRzL1tleHRdL1tuYW1lXS1baGFzaF0uW2V4dF1cIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIFx1NTQyRlx1NzUyOENTU1x1NEVFM1x1NzgwMVx1NTIwNlx1NTI3MlxyXG4gICAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcclxuICAgICAgICAvLyBcdThCQkVcdTdGNkVcdThENDRcdTZFOTBcdTUxODVcdTgwNTRcdTk2MDhcdTUwM0NcclxuICAgICAgICBhc3NldHNJbmxpbmVMaW1pdDogNDA5NixcclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiBbXHJcbiAgICAgICAgdnVlKCksXHJcbiAgICAgICAgQXV0b0ltcG9ydCh7XHJcbiAgICAgICAgICAgIGltcG9ydHM6IFtcclxuICAgICAgICAgICAgICAgIFwidnVlXCIsIC8vIFx1ODFFQVx1NTJBOFx1NUYxNVx1NTE2NSBWdWUgQ29tcG9zaXRpb24gQVBJXHVGRjBDXHU1OTgyIHJlZlx1MzAwMWNvbXB1dGVkXHUzMDAxb25Nb3VudGVkIFx1N0I0OVxyXG4gICAgICAgICAgICAgICAgXCJ2dWUtcm91dGVyXCIsIC8vIFx1ODFFQVx1NTJBOFx1NUYxNVx1NTE2NSB2dWUtcm91dGVyIFx1NEUyRFx1NzY4NFx1NjVCOVx1NkNENVx1RkYwQ1x1NTk4MiB1c2VSb3V0ZVx1MzAwMXVzZVJvdXRlciBcdTdCNDlcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcclxuICAgICAgICAgICAgICAgIFwiQHZ1ZXVzZS9jb3JlXCIsIC8vIFx1ODFFQVx1NTJBOFx1NUYxNVx1NTE2NSBWdWVVc2UgXHU0RTJEXHU3Njg0XHU1REU1XHU1MTc3XHU1MUZEXHU2NTcwXHVGRjA4XHU1M0VGXHU5MDA5XHVGRjA5XHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIGR0czogXCJzcmMvYXV0by1pbXBvcnRzLmQudHNcIiwgLy8gXHU3NTFGXHU2MjEwXHU3QzdCXHU1NzhCXHU1QjlBXHU0RTQ5XHU2NTg3XHU0RUY2XHVGRjA4XHU1M0VGXHU5MDA5XHVGRjA5XHJcbiAgICAgICAgICAgIGRpcnM6IFtcInNyYy9jb21wb3NhYmxlc1wiLCBcInNyYy9zdG9yZXNcIiwgXCJzcmMvY29tcG9uZW50c1wiXSxcclxuICAgICAgICAgICAgcmVzb2x2ZXJzOiBbVmFudFJlc29sdmVyKCldLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIENvbXBvbmVudHMoe1xyXG4gICAgICAgICAgICByZXNvbHZlcnM6IFtWYW50UmVzb2x2ZXIoKV0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdnVlSnN4KCksXHJcbiAgICAgICAgLy8gdnVlRGV2VG9vbHMoKSxcclxuICAgIF0sXHJcbiAgICByZXNvbHZlOiB7XHJcbiAgICAgICAgYWxpYXM6IHtcclxuICAgICAgICAgICAgXCJAXCI6IGZpbGVVUkxUb1BhdGgobmV3IFVSTChcIi4vc3JjXCIsIGltcG9ydC5tZXRhLnVybCkpLFxyXG4gICAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgLy8gXHU0RjE4XHU1MzE2XHU0RjlEXHU4RDU2XHU5ODg0XHU2Nzg0XHU1RUZBXHJcbiAgICBvcHRpbWl6ZURlcHM6IHtcclxuICAgICAgICBpbmNsdWRlOiBbXCJ2dWVcIiwgXCJ2dWUtcm91dGVyXCIsIFwicGluaWFcIiwgXCJ2YW50XCIsIFwiYXhpb3NcIl0sXHJcbiAgICB9LFxyXG59KTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFrVSxTQUFTLGVBQWUsV0FBVztBQUNyVyxPQUFPLGdCQUFnQjtBQUN2QixPQUFPLGdCQUFnQjtBQUN2QixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLG9CQUFvQjtBQUM3QixPQUFPLFNBQVM7QUFDaEIsT0FBTyxZQUFZO0FBQ25CLE9BQU8saUJBQWlCO0FBUG1MLElBQU0sMkNBQTJDO0FBVTVQLElBQU8sc0JBQVEsYUFBYTtBQUFBLEVBQ3hCLFFBQVE7QUFBQSxJQUNKLE1BQU07QUFBQTtBQUFBLElBQ04sTUFBTTtBQUFBO0FBQUEsSUFDTixZQUFZO0FBQUE7QUFBQSxJQUNaLE9BQU87QUFBQSxNQUNILFdBQVc7QUFBQSxRQUNQLFFBQVE7QUFBQTtBQUFBO0FBQUEsUUFFUixjQUFjO0FBQUEsUUFDZCxTQUFTLENBQUMsU0FBUztBQUFBO0FBQUEsTUFDdkI7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBQUEsSUFFSCxRQUFRO0FBQUE7QUFBQSxJQUNSLFFBQVE7QUFBQTtBQUFBLElBQ1IsZUFBZTtBQUFBLE1BQ1gsVUFBVTtBQUFBLFFBQ04sY0FBYztBQUFBO0FBQUEsUUFDZCxlQUFlO0FBQUE7QUFBQSxNQUNuQjtBQUFBLElBQ0o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNYLFFBQVE7QUFBQTtBQUFBLFFBRUosY0FBYztBQUFBLFVBQ1YsUUFBUSxDQUFDLE9BQU8sY0FBYyxPQUFPO0FBQUEsVUFDckMsTUFBTSxDQUFDLE1BQU07QUFBQSxVQUNiLE9BQU8sQ0FBQyxTQUFTLFVBQVUsV0FBVztBQUFBLFVBQ3RDLFFBQVEsQ0FBQyxXQUFXLGFBQWE7QUFBQSxRQUNyQztBQUFBO0FBQUEsUUFFQSxnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxNQUNwQjtBQUFBLElBQ0o7QUFBQTtBQUFBLElBRUEsY0FBYztBQUFBO0FBQUEsSUFFZCxtQkFBbUI7QUFBQSxFQUN2QjtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ0wsSUFBSTtBQUFBLElBQ0osV0FBVztBQUFBLE1BQ1AsU0FBUztBQUFBLFFBQ0w7QUFBQTtBQUFBLFFBQ0E7QUFBQTtBQUFBLFFBQ0E7QUFBQTtBQUFBLE1BQ0o7QUFBQSxNQUNBLEtBQUs7QUFBQTtBQUFBLE1BQ0wsTUFBTSxDQUFDLG1CQUFtQixjQUFjLGdCQUFnQjtBQUFBLE1BQ3hELFdBQVcsQ0FBQyxhQUFhLENBQUM7QUFBQSxJQUM5QixDQUFDO0FBQUEsSUFDRCxXQUFXO0FBQUEsTUFDUCxXQUFXLENBQUMsYUFBYSxDQUFDO0FBQUEsSUFDOUIsQ0FBQztBQUFBLElBQ0QsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ0wsT0FBTztBQUFBLE1BQ0gsS0FBSyxjQUFjLElBQUksSUFBSSxTQUFTLHdDQUFlLENBQUM7QUFBQSxJQUN4RDtBQUFBLEVBQ0o7QUFBQTtBQUFBLEVBRUEsY0FBYztBQUFBLElBQ1YsU0FBUyxDQUFDLE9BQU8sY0FBYyxTQUFTLFFBQVEsT0FBTztBQUFBLEVBQzNEO0FBQ0osQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K