diff --git a/public/seo-templates/agent-invitation.html b/public/seo-templates/agent-invitation.html index c614357..553df98 100644 --- a/public/seo-templates/agent-invitation.html +++ b/public/seo-templates/agent-invitation.html @@ -7,11 +7,11 @@ 邀请合作伙伴_发展代理享收益_推广返利计划_赤眉 - + - + @@ -21,7 +21,7 @@ - + @@ -31,7 +31,7 @@ "@context": "https://schema.org", "@type": "WebPage", "name": "邀请合作伙伴_发展代理享收益_推广返利计划_赤眉", - "description": "赤眉推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单不仅可获得推广收益,还可叠加合作伙伴活跃奖励及定价差额收益。打造专属推广团队,实现收益持续增长。", + "description": "赤眉推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单可获得推广收益及定价差额收益。打造专属推广团队,实现收益持续增长。", "url": "https://www.xxxxxx.com/agent/invitation", "mainEntity": { "@type": "Organization", @@ -61,7 +61,7 @@

正在跳转到完整版网站...

如果浏览器没有自动跳转,请 点击这里

-

赤眉推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单不仅可获得推广收益,还可叠加合作伙伴活跃奖励及定价差额收益。打造专属推广团队,实现收益持续增长。

+

赤眉推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单可获得推广收益及定价差额收益。打造专属推广团队,实现收益持续增长。

关于赤眉

赤眉提供背调报告代理加盟与个人风控系统搭建,合规数据服务平台。支持职场背调、家政背景核验、企业风控服务与数据报告分销。

diff --git a/seo/generate-seo-templates.cjs b/seo/generate-seo-templates.cjs index c5384be..8e00db8 100644 --- a/seo/generate-seo-templates.cjs +++ b/seo/generate-seo-templates.cjs @@ -127,7 +127,7 @@ function buildPageSEOConfigs() { "agent-invitation.html": { title: `邀请合作伙伴_发展代理享收益_推广返利计划_${N}`, description: - `${N}推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单不仅可获得推广收益,还可叠加合作伙伴活跃奖励及定价差额收益。打造专属推广团队,实现收益持续增长。`, + `${N}推出合伙人邀请奖励机制。邀请好友注册成为合作伙伴,每单可获得推广收益及定价差额收益。打造专属推广团队,实现收益持续增长。`, keywords: "渠道合作伙伴,商业收益管理,流量合规变现,业务推广系统,代理后台", url: `${O}/agent/invitation`, diff --git a/src/api/user.js b/src/api/user.js index 2bd2e2f..c0614ef 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -6,13 +6,15 @@ if (API_URL === undefined) throw new Error("缺少环境变量: VITE_API_URL"); const API_PREFIX = import.meta.env.VITE_API_PREFIX; if (!API_PREFIX) throw new Error("缺少环境变量: VITE_API_PREFIX"); -// 注销账号API -export function cancelAccount() { +// 注销账号API(需传入短信验证码) +export function cancelAccount(code) { return axios({ method: "post", url: `${API_URL}${API_PREFIX}/user/cancelOut`, + data: { code }, headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", }, }); } diff --git a/src/assets/images/me/cancelAccount.svg b/src/assets/images/me/cancelAccount.svg new file mode 100644 index 0000000..123451f --- /dev/null +++ b/src/assets/images/me/cancelAccount.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/yq_qrcode_1.png b/src/assets/images/yq_qrcode_1.png index d8d4fcc..ca49e96 100644 Binary files a/src/assets/images/yq_qrcode_1.png and b/src/assets/images/yq_qrcode_1.png differ diff --git a/src/bootstrap/appWebviewToken.js b/src/bootstrap/appWebviewToken.js new file mode 100644 index 0000000..c4af870 --- /dev/null +++ b/src/bootstrap/appWebviewToken.js @@ -0,0 +1,15 @@ +/** + * App 内嵌 WebView 通过 URL 携带 `?source=app&token=`。 + * 在路由守卫最前写入 localStorage,保证 requiresAuth 与 useApiFetch 能读到 token。 + */ +export function applyAppWebViewTokenFromRoute(to) { + try { + const q = to?.query + if (!q || q.source !== 'app' || !q.token) + return + localStorage.setItem('token', String(q.token)) + } + catch { + /* ignore */ + } +} diff --git a/src/components/InquireForm.vue b/src/components/InquireForm.vue index cd86634..d4ff630 100644 --- a/src/components/InquireForm.vue +++ b/src/components/InquireForm.vue @@ -73,7 +73,7 @@ -->
- 为保证用户的隐私及数据安全,查询结果生成30天后将自动删除 + 为保证用户的隐私及数据安全,查询结果生成{{ appConfig.query.retention_days }}天后将自动删除
@@ -259,7 +259,7 @@ v-html="featureData.description">
- 为保证用户的隐私以及数据安全,查询的结果生成30天之后将自动清除。 + 为保证用户的隐私以及数据安全,查询的结果生成{{ appConfig.query.retention_days }}天之后将自动清除。
@@ -285,6 +285,7 @@ import { useUserStore } from "@/stores/userStore"; import { useDialogStore } from "@/stores/dialogStore"; import { useEnv } from "@/composables/useEnv"; import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha"; +import { useAppConfig } from "@/composables/useAppConfig"; import { showConfirmDialog } from "vant"; import Payment from "@/components/Payment.vue"; @@ -359,6 +360,7 @@ const dialogStore = useDialogStore(); const userStore = useUserStore(); const { isWeChat } = useEnv(); const { runWithCaptcha } = useAliyunCaptcha(); +const { appConfig, loadAppConfig } = useAppConfig(); // 响应式数据 const showPayment = ref(false); @@ -710,6 +712,7 @@ const toHistory = () => { onMounted(async () => { await loadBackgroundImage(); await loadTrapezoidBackground(); + await loadAppConfig(); }); // 加载背景图片 diff --git a/src/components/Payment.vue b/src/components/Payment.vue index 95ec414..0755c7c 100644 --- a/src/components/Payment.vue +++ b/src/components/Payment.vue @@ -12,19 +12,15 @@
{{ data.product_name }}
-
- ¥ {{ data.sell_price }} +
+ ¥ {{ displayAmount }}
¥ {{ discountPrice - ? (data.sell_price * 0.2).toFixed(2) - : data.sell_price + ? displayDiscountAmount + : displayAmount }}
@@ -115,7 +111,7 @@ diff --git a/src/router/index.js b/src/router/index.js index 734a7a1..eac9563 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { useDialogStore } from "@/stores/dialogStore"; import { useEnv } from "@/composables/useEnv"; import { storeToRefs } from "pinia"; import { useSEO } from "@/composables/useSEO"; +import { applyAppWebViewTokenFromRoute } from "@/bootstrap/appWebviewToken"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -123,6 +124,21 @@ const router = createRouter({ import("@/views/UserAgreement.vue"), meta: { title: "用户协议" }, }, + { + path: "/accountCancelAgreement", + name: "accountCancelAgreement", + component: () => + import("@/views/AccountCancelAgreement.vue"), + meta: { title: "账号注销协议" }, + }, + { + path: "/cancelAccount", + name: "cancelAccount", + component: () => + import("@/views/CancelAccount.vue"), + meta: { title: "注销账号", requiresAuth: true }, + }, + { path: "/agentManageAgreement", name: "agentManageAgreement", @@ -319,6 +335,42 @@ const router = createRouter({ import("@/views/AgentServiceAgreement.vue"), meta: { title: "信息技术服务合同" }, }, + { + path: "/accountCancelAgreement", + name: "accountCancelAgreementApp", + component: () => + import("@/views/AccountCancelAgreement.vue"), + meta: { title: "账号注销协议" }, + }, + { + path: "cancelAccount", + name: "appCancelAccount", + component: () => + import("@/views/CancelAccount.vue"), + meta: { title: "注销账号", requiresAuth: true }, + }, + /** 无 PageLayout 顶栏,专供 App WebView;与 /report、/example 共用组件 */ + { + path: "report", + name: "appReport", + component: () => import("@/views/Report.vue"), + meta: { + title: "报告结果", + requiresAuth: true, + notNeedBindPhone: true, + embedForApp: true, + }, + }, + { + path: "example", + name: "appExample", + component: () => import("@/views/Example.vue"), + meta: { + title: "示例报告", + notNeedBindPhone: true, + embedForApp: true, + }, + }, ], }, ], @@ -364,6 +416,7 @@ NProgress.configure({ // 路由导航守卫 router.beforeEach(async (to, from, next) => { NProgress.start(); // 启动进度条 + applyAppWebViewTokenFromRoute(to); const isAuthenticated = localStorage.getItem("token"); const agentStore = useAgentStore(); const userStore = useUserStore(); diff --git a/src/views/AccountCancelAgreement.vue b/src/views/AccountCancelAgreement.vue new file mode 100644 index 0000000..5a4795f --- /dev/null +++ b/src/views/AccountCancelAgreement.vue @@ -0,0 +1,56 @@ + + + diff --git a/src/views/Agent.vue b/src/views/Agent.vue index 22382d5..7b629a4 100644 --- a/src/views/Agent.vue +++ b/src/views/Agent.vue @@ -105,86 +105,17 @@
- +
-
-
- - 活跃下级奖励 -
-
-
- ¥ - {{ - (data?.active_reward?.total_reward || 0).toFixed(2) - }} -
-
活跃下级 0 位
-
-
- - -
- -
- -
-
-
- 本日奖励 -
-
- ¥ - {{ (currentActiveData.active_reward || 0).toFixed(2) }} -
-
-
-
- 下级推广奖励 -
-
- ¥ - {{ - (currentActiveData.sub_promote_reward || 0).toFixed( - 2 - ) - }} -
-
-
-
- 下级转化奖励 -
-
- ¥ - {{ - ( - currentActiveData.sub_withdraw_reward || 0 - ).toFixed(2) - }} -
-
-
- -
- 查看奖励明细 - -
- - -
-
右箭头 +