Compare commits
4 Commits
fb8dea93a0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 70f0f98cf9 | |||
| ced2cd04db | |||
| 2c97f724f5 | |||
| d6e460d7b6 |
4
.env
4
.env
@@ -20,3 +20,7 @@ VITE_SHARE_TITLE=真爱查官网_婚姻状态核验_婚前背景互信平台
|
|||||||
VITE_SHARE_DESC=提供个人信用评估、入职背调、信贷风控、企业风险监测等服务
|
VITE_SHARE_DESC=提供个人信用评估、入职背调、信贷风控、企业风险监测等服务
|
||||||
VITE_SHARE_IMG=https://www.zhenaicha.com/logo.png
|
VITE_SHARE_IMG=https://www.zhenaicha.com/logo.png
|
||||||
VITE_TOKEN_VERSION=1.0
|
VITE_TOKEN_VERSION=1.0
|
||||||
|
|
||||||
|
# 阿里云验证码配置(当前使用非加密模式)
|
||||||
|
VITE_ALIYUN_CAPTCHA_ENCRYPTED=false
|
||||||
|
VITE_ALIYUN_CAPTCHA_SCENE_ID=wynt39to
|
||||||
@@ -15,7 +15,7 @@ VITE_WECHAT_APP_ID=wx442ee1ac1ee75917
|
|||||||
# 微信授权回调域名(必须与微信后台配置的授权回调域名一致)
|
# 微信授权回调域名(必须与微信后台配置的授权回调域名一致)
|
||||||
# 例如:https://www.zhenaicha.com 或 https://www.zhenaicha.com
|
# 例如:https://www.zhenaicha.com 或 https://www.zhenaicha.com
|
||||||
# 如果不配置,则使用当前访问的域名(window.location.origin)
|
# 如果不配置,则使用当前访问的域名(window.location.origin)
|
||||||
VITE_WECHAT_REDIRECT_DOMAIN=https://www.zhinengcha.cn
|
VITE_WECHAT_REDIRECT_DOMAIN=https://www.zhenaicha.com
|
||||||
|
|
||||||
|
|
||||||
VITE_CHAT_AES_KEY=qw5w6SFE2D1jmxyd
|
VITE_CHAT_AES_KEY=qw5w6SFE2D1jmxyd
|
||||||
|
|||||||
25
index.html
25
index.html
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
<!-- Open Graph / Facebook -->
|
<!-- Open Graph / Facebook -->
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="https://www.zhinengcha.cn/" />
|
<meta property="og:url" content="https://www.zhenaicha.com/" />
|
||||||
<meta
|
<meta
|
||||||
property="og:title"
|
property="og:title"
|
||||||
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
|
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
|
|
||||||
<!-- Twitter -->
|
<!-- Twitter -->
|
||||||
<meta property="twitter:card" content="summary" />
|
<meta property="twitter:card" content="summary" />
|
||||||
<meta property="twitter:url" content="https://www.zhinengcha.cn/" />
|
<meta property="twitter:url" content="https://www.zhenaicha.com/" />
|
||||||
<meta
|
<meta
|
||||||
property="twitter:title"
|
property="twitter:title"
|
||||||
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
|
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
|
||||||
@@ -83,11 +83,11 @@
|
|||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "WebSite",
|
"@type": "WebSite",
|
||||||
"name": "真爱查",
|
"name": "真爱查",
|
||||||
"url": "https://www.zhinengcha.cn/",
|
"url": "https://www.zhenaicha.com/",
|
||||||
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
||||||
"potentialAction": {
|
"potentialAction": {
|
||||||
"@type": "SearchAction",
|
"@type": "SearchAction",
|
||||||
"target": "https://www.zhinengcha.cn/search?q={search_term_string}",
|
"target": "https://www.zhenaicha.com/search?q={search_term_string}",
|
||||||
"query-input": "required name=search_term_string"
|
"query-input": "required name=search_term_string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
"name": "真爱查",
|
"name": "真爱查",
|
||||||
"url": "https://www.zhinengcha.cn/",
|
"url": "https://www.zhenaicha.com/",
|
||||||
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -109,10 +109,19 @@
|
|||||||
delete window.wx;
|
delete window.wx;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- 阿里云滑块验证码 -->
|
||||||
|
<script>
|
||||||
|
window.AliyunCaptchaConfig = { region: "cn", prefix: "12zxnj" };
|
||||||
|
</script>
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="https://o.alicdn.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js"
|
||||||
|
></script>
|
||||||
|
|
||||||
<!-- 预加载关键资源 -->
|
<!-- 预加载关键资源 -->
|
||||||
<link rel="preconnect" href="https://www.zhinengcha.cn" />
|
<link rel="preconnect" href="https://www.zhenaicha.com" />
|
||||||
<link rel="preconnect" href="https://res.wx.qq.com" />
|
<link rel="preconnect" href="https://res.wx.qq.com" />
|
||||||
<link rel="dns-prefetch" href="https://www.zhinengcha.cn" />
|
<link rel="dns-prefetch" href="https://www.zhenaicha.com" />
|
||||||
<link rel="dns-prefetch" href="https://res.wx.qq.com" />
|
<link rel="dns-prefetch" href="https://res.wx.qq.com" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@@ -207,6 +216,8 @@
|
|||||||
<div class="loading-text">加载中</div>
|
<div class="loading-text">加载中</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
<!-- 阿里云验证码挂载容器 -->
|
||||||
|
<div id="captcha-element"></div>
|
||||||
|
|
||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Disallow: /js/
|
|||||||
Disallow: /css/
|
Disallow: /css/
|
||||||
|
|
||||||
# 网站地图
|
# 网站地图
|
||||||
Sitemap: https://www.zhinengcha.cn/sitemap.xml
|
Sitemap: https://www.zhenaicha.com/sitemap.xml
|
||||||
|
|
||||||
# 爬取延迟(毫秒)
|
# 爬取延迟(毫秒)
|
||||||
Crawl-delay: 1
|
Crawl-delay: 1
|
||||||
|
|||||||
119
public/seo-templates/agent.html
Normal file
119
public/seo-templates/agent.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>真爱查代理 - 免费开通代理权限 | 大数据风险报告代理</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta name="keywords" content="真爱查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="真爱查代理 - 免费开通代理权限 | 大数据风险报告代理">
|
||||||
|
<meta property="og:description" content="真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/agent">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="真爱查代理 - 免费开通代理权限 | 大数据风险报告代理">
|
||||||
|
<meta name="twitter:description" content="真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/agent">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/agent">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "真爱查代理 - 免费开通代理权限 | 大数据风险报告代理",
|
||||||
|
"description": "真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。",
|
||||||
|
"url": "https://www.zhenaicha.com/agent",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>真爱查代理 - 免费开通代理权限 | 大数据风险报告代理</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/agent">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/agent';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/example.html
Normal file
119
public/seo-templates/example.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>示例报告 - 真爱查报告展示 | 大数据风险报告样例</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta name="keywords" content="示例报告, 报告展示, 报告样例, 大数据风险报告, 婚姻查询报告">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="示例报告 - 真爱查报告展示 | 大数据风险报告样例">
|
||||||
|
<meta property="og:description" content="真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/example">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="示例报告 - 真爱查报告展示 | 大数据风险报告样例">
|
||||||
|
<meta name="twitter:description" content="真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/example">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/example">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "示例报告 - 真爱查报告展示 | 大数据风险报告样例",
|
||||||
|
"description": "真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。",
|
||||||
|
"url": "https://www.zhenaicha.com/example",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>示例报告 - 真爱查报告展示 | 大数据风险报告样例</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/example">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/example';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/help-guide.html
Normal file
119
public/seo-templates/help-guide.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>使用指南 - 真爱查操作教程 | 功能说明</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta name="keywords" content="使用指南, 操作教程, 功能说明, 快速上手, 真爱查教程">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="使用指南 - 真爱查操作教程 | 功能说明">
|
||||||
|
<meta property="og:description" content="真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/help/guide">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="使用指南 - 真爱查操作教程 | 功能说明">
|
||||||
|
<meta name="twitter:description" content="真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/help/guide">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/help/guide">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "使用指南 - 真爱查操作教程 | 功能说明",
|
||||||
|
"description": "真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。",
|
||||||
|
"url": "https://www.zhenaicha.com/help/guide",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>使用指南 - 真爱查操作教程 | 功能说明</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/help/guide">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/help/guide';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/help.html
Normal file
119
public/seo-templates/help.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>帮助中心 - 真爱查使用指南 | 常见问题解答</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta name="keywords" content="真爱查帮助, 使用指南, 常见问题, 操作教程, 客服支持">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="帮助中心 - 真爱查使用指南 | 常见问题解答">
|
||||||
|
<meta property="og:description" content="真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/help">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="帮助中心 - 真爱查使用指南 | 常见问题解答">
|
||||||
|
<meta name="twitter:description" content="真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/help">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/help">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "帮助中心 - 真爱查使用指南 | 常见问题解答",
|
||||||
|
"description": "真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。",
|
||||||
|
"url": "https://www.zhenaicha.com/help",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>帮助中心 - 真爱查使用指南 | 常见问题解答</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/help">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/help';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/index.html
Normal file
119
public/seo-templates/index.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>真爱查官网_婚姻状态核验_婚前背景互信平台</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。">
|
||||||
|
<meta name="keywords" content="真爱查, 婚姻状态查询, 婚姻历史核验, 再婚背景调查, 情感风险评估, 婚恋互信工具">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="真爱查官网_婚姻状态核验_婚前背景互信平台">
|
||||||
|
<meta property="og:description" content="真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="真爱查官网_婚姻状态核验_婚前背景互信平台">
|
||||||
|
<meta name="twitter:description" content="真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "真爱查官网_婚姻状态核验_婚前背景互信平台",
|
||||||
|
"description": "真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。",
|
||||||
|
"url": "https://www.zhenaicha.com",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>真爱查官网_婚姻状态核验_婚前背景互信平台</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/inquire-companyinfo.html
Normal file
119
public/seo-templates/inquire-companyinfo.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>商业背景真实性核验_企业主经营实力与司法风险_真爱查</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。">
|
||||||
|
<meta name="keywords" content="商业背景核验,企业主信用评估,公司经营风险,工商信息核验,资产风险评估">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="商业背景真实性核验_企业主经营实力与司法风险_真爱查">
|
||||||
|
<meta property="og:description" content="真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/inquire/companyinfo">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="商业背景真实性核验_企业主经营实力与司法风险_真爱查">
|
||||||
|
<meta name="twitter:description" content="真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/inquire/companyinfo">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/inquire/companyinfo">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "商业背景真实性核验_企业主经营实力与司法风险_真爱查",
|
||||||
|
"description": "真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。",
|
||||||
|
"url": "https://www.zhenaicha.com/inquire/companyinfo",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>商业背景真实性核验_企业主经营实力与司法风险_真爱查</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/inquire/companyinfo">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/inquire/companyinfo';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/inquire-marriage.html
Normal file
119
public/seo-templates/inquire-marriage.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。">
|
||||||
|
<meta name="keywords" content="婚前背景核验,恋爱对象风险,婚姻司法记录,情感互信报告,家庭履约风险">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查">
|
||||||
|
<meta property="og:description" content="真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/inquire/marriage">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查">
|
||||||
|
<meta name="twitter:description" content="真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/inquire/marriage">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/inquire/marriage">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查",
|
||||||
|
"description": "真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。",
|
||||||
|
"url": "https://www.zhenaicha.com/inquire/marriage",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/inquire/marriage">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/inquire/marriage';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/inquire-riskassessment.html
Normal file
119
public/seo-templates/inquire-riskassessment.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。">
|
||||||
|
<meta name="keywords" content="个人风险画像,履约能力评估,综合风险指数,信用健康体检,个人数据分析">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查">
|
||||||
|
<meta property="og:description" content="深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/inquire/riskassessment">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查">
|
||||||
|
<meta name="twitter:description" content="深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/inquire/riskassessment">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/inquire/riskassessment">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查",
|
||||||
|
"description": "深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。",
|
||||||
|
"url": "https://www.zhenaicha.com/inquire/riskassessment",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/inquire/riskassessment">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/inquire/riskassessment';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/promote.html
Normal file
119
public/seo-templates/promote.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。">
|
||||||
|
<meta name="keywords" content="婚恋行业合作,情感咨询工具,风控系统代理,渠道合作伙伴,婚介数据服务">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募">
|
||||||
|
<meta property="og:description" content="真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/promote">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募">
|
||||||
|
<meta name="twitter:description" content="真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/promote">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/promote">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募",
|
||||||
|
"description": "真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。",
|
||||||
|
"url": "https://www.zhenaicha.com/promote",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/promote">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/promote';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
public/seo-templates/service.html
Normal file
119
public/seo-templates/service.html
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>客服中心 - 真爱查在线客服 | 技术支持</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta name="keywords" content="客服中心, 在线客服, 技术支持, 问题反馈, 真爱查客服">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="客服中心 - 真爱查在线客服 | 技术支持">
|
||||||
|
<meta property="og:description" content="真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta property="og:url" content="https://www.zhenaicha.com/service">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="客服中心 - 真爱查在线客服 | 技术支持">
|
||||||
|
<meta name="twitter:description" content="真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta name="twitter:url" content="https://www.zhenaicha.com/service">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="https://www.zhenaicha.com/service">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "客服中心 - 真爱查在线客服 | 技术支持",
|
||||||
|
"description": "真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。",
|
||||||
|
"url": "https://www.zhenaicha.com/service",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>客服中心 - 真爱查在线客服 | 技术支持</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="https://www.zhenaicha.com/service">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = 'https://www.zhenaicha.com/service';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,67 +1,67 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/</loc>
|
<loc>https://www.zhenaicha.com/</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>daily</changefreq>
|
<changefreq>daily</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agent</loc>
|
<loc>https://www.zhenaicha.com/agent</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/help</loc>
|
<loc>https://www.zhenaicha.com/help</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/help/guide</loc>
|
<loc>https://www.zhenaicha.com/help/guide</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/example</loc>
|
<loc>https://www.zhenaicha.com/example</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/service</loc>
|
<loc>https://www.zhenaicha.com/service</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.5</priority>
|
<priority>0.5</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/privacyPolicy</loc>
|
<loc>https://www.zhenaicha.com/privacyPolicy</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/userAgreement</loc>
|
<loc>https://www.zhenaicha.com/userAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agentManageAgreement</loc>
|
<loc>https://www.zhenaicha.com/agentManageAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agentSerivceAgreement</loc>
|
<loc>https://www.zhenaicha.com/agentSerivceAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/authorization</loc>
|
<loc>https://www.zhenaicha.com/authorization</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
|
|||||||
170
server/crawler-detector.js
Normal file
170
server/crawler-detector.js
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**
|
||||||
|
* 爬虫检测模块
|
||||||
|
* 用于识别搜索引擎爬虫和社交媒体爬虫
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CrawlerDetector {
|
||||||
|
constructor() {
|
||||||
|
// 常见搜索引擎爬虫User-Agent列表
|
||||||
|
this.crawlerPatterns = [
|
||||||
|
// 百度爬虫
|
||||||
|
'baiduspider',
|
||||||
|
'baiduspider-mobile',
|
||||||
|
'baiduspider-image',
|
||||||
|
'baiduspider-video',
|
||||||
|
'baiduspider-news',
|
||||||
|
'baiduboxapp',
|
||||||
|
|
||||||
|
// Google爬虫
|
||||||
|
'googlebot',
|
||||||
|
'googlebot-image',
|
||||||
|
'googlebot-news',
|
||||||
|
'googlebot-mobile',
|
||||||
|
'googlebot-video',
|
||||||
|
'google-web-snippet',
|
||||||
|
|
||||||
|
// 360搜索
|
||||||
|
'360spider',
|
||||||
|
'soha-agent',
|
||||||
|
'haosouspider',
|
||||||
|
|
||||||
|
// 搜狗搜索
|
||||||
|
'sogou spider',
|
||||||
|
'sogou news spider',
|
||||||
|
'sogou orion spider',
|
||||||
|
'sogou-blog',
|
||||||
|
|
||||||
|
// 必应
|
||||||
|
'bingbot',
|
||||||
|
'msnbot',
|
||||||
|
|
||||||
|
// 雅虎
|
||||||
|
'slurp',
|
||||||
|
|
||||||
|
// 搜搜
|
||||||
|
'sosospider',
|
||||||
|
'sosoimagespider',
|
||||||
|
|
||||||
|
// 有道
|
||||||
|
'youdaobot',
|
||||||
|
'yodaobot',
|
||||||
|
|
||||||
|
// 头条搜索
|
||||||
|
'bytedance-spider',
|
||||||
|
'toutiaospider',
|
||||||
|
|
||||||
|
// 社交媒体爬虫
|
||||||
|
'facebookexternalhit',
|
||||||
|
'facebookcatalog',
|
||||||
|
'twitterbot',
|
||||||
|
'linkedinbot',
|
||||||
|
'whatsapp',
|
||||||
|
'telegrambot',
|
||||||
|
'viber',
|
||||||
|
'line',
|
||||||
|
|
||||||
|
// 其他常见爬虫
|
||||||
|
'applebot',
|
||||||
|
'semrushbot',
|
||||||
|
'ahrefsbot',
|
||||||
|
'mj12bot',
|
||||||
|
'dotbot',
|
||||||
|
'crawler',
|
||||||
|
'spider',
|
||||||
|
'bot'
|
||||||
|
]
|
||||||
|
|
||||||
|
// 需要检测的头部字段
|
||||||
|
this.crawlerHeaders = ['x-bot', 'x-crawler', 'x-forwarded-for']
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测请求是否来自爬虫
|
||||||
|
* @param {Object} req - HTTP请求对象
|
||||||
|
* @returns {Boolean} 是否为爬虫
|
||||||
|
*/
|
||||||
|
isCrawler(req) {
|
||||||
|
const userAgent = req.headers['user-agent']?.toLowerCase() || ''
|
||||||
|
const headers = req.headers
|
||||||
|
|
||||||
|
// 1. 通过User-Agent检测
|
||||||
|
if (this.checkUserAgent(userAgent)) {
|
||||||
|
console.log(`[CrawlerDetector] 检测到爬虫 UA: ${userAgent}`)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 通过特定头部检测
|
||||||
|
if (this.checkHeaders(headers)) {
|
||||||
|
console.log(`[CrawlerDetector] 检测到爬虫 Headers`)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 通过IP地址检测(可选)
|
||||||
|
// if (this.checkIP(req.connection.remoteAddress)) {
|
||||||
|
// return true
|
||||||
|
// }
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查User-Agent
|
||||||
|
* @param {String} userAgent
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkUserAgent(userAgent) {
|
||||||
|
if (!userAgent) return false
|
||||||
|
|
||||||
|
return this.crawlerPatterns.some(pattern => {
|
||||||
|
return userAgent.includes(pattern.toLowerCase())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查请求头
|
||||||
|
* @param {Object} headers
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkHeaders(headers) {
|
||||||
|
for (const header of this.crawlerHeaders) {
|
||||||
|
const headerValue = headers[header]?.toLowerCase()
|
||||||
|
if (headerValue && (headerValue.includes('bot') || headerValue.includes('crawler'))) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查IP地址是否为已知爬虫IP
|
||||||
|
* @param {String} ip
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkIP(ip) {
|
||||||
|
// 这里可以添加已知爬虫IP段的检测
|
||||||
|
// 需要定期更新爬虫IP列表
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取爬虫类型
|
||||||
|
* @param {String} userAgent
|
||||||
|
* @returns {String} 爬虫类型
|
||||||
|
*/
|
||||||
|
getCrawlerType(userAgent) {
|
||||||
|
const ua = userAgent.toLowerCase()
|
||||||
|
|
||||||
|
if (ua.includes('baiduspider')) return 'baidu'
|
||||||
|
if (ua.includes('googlebot')) return 'google'
|
||||||
|
if (ua.includes('bingbot') || ua.includes('msnbot')) return 'bing'
|
||||||
|
if (ua.includes('360spider')) return '360'
|
||||||
|
if (ua.includes('sogou spider')) return 'sogou'
|
||||||
|
if (ua.includes('facebookexternalhit')) return 'facebook'
|
||||||
|
if (ua.includes('twitterbot')) return 'twitter'
|
||||||
|
if (ua.includes('linkedinbot')) return 'linkedin'
|
||||||
|
|
||||||
|
return 'unknown'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = CrawlerDetector
|
||||||
242
server/generate-seo-templates.cjs
Normal file
242
server/generate-seo-templates.cjs
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
/**
|
||||||
|
* SEO模板生成器
|
||||||
|
* 根据路由配置自动生成静态HTML模板
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
// 页面SEO配置(与useSEO.js保持一致)
|
||||||
|
const pageSEOConfigs = {
|
||||||
|
'index.html': {
|
||||||
|
title: '真爱查官网_婚姻状态核验_婚前背景互信平台',
|
||||||
|
description: '真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。',
|
||||||
|
keywords: '真爱查, 婚姻状态查询, 婚姻历史核验, 再婚背景调查, 情感风险评估, 婚恋互信工具',
|
||||||
|
url: 'https://www.zhenaicha.com'
|
||||||
|
},
|
||||||
|
'agent.html': {
|
||||||
|
title: '真爱查代理 - 免费开通代理权限 | 大数据风险报告代理',
|
||||||
|
description: '真爱查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。',
|
||||||
|
keywords: '真爱查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益',
|
||||||
|
url: 'https://www.zhenaicha.com/agent'
|
||||||
|
},
|
||||||
|
'help.html': {
|
||||||
|
title: '帮助中心 - 真爱查使用指南 | 常见问题解答',
|
||||||
|
description: '真爱查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。',
|
||||||
|
keywords: '真爱查帮助, 使用指南, 常见问题, 操作教程, 客服支持',
|
||||||
|
url: 'https://www.zhenaicha.com/help'
|
||||||
|
},
|
||||||
|
'help-guide.html': {
|
||||||
|
title: '使用指南 - 真爱查操作教程 | 功能说明',
|
||||||
|
description: '真爱查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。',
|
||||||
|
keywords: '使用指南, 操作教程, 功能说明, 快速上手, 真爱查教程',
|
||||||
|
url: 'https://www.zhenaicha.com/help/guide'
|
||||||
|
},
|
||||||
|
'example.html': {
|
||||||
|
title: '示例报告 - 真爱查报告展示 | 大数据风险报告样例',
|
||||||
|
description: '真爱查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。',
|
||||||
|
keywords: '示例报告, 报告展示, 报告样例, 大数据风险报告, 婚姻查询报告',
|
||||||
|
url: 'https://www.zhenaicha.com/example'
|
||||||
|
},
|
||||||
|
'service.html': {
|
||||||
|
title: '客服中心 - 真爱查在线客服 | 技术支持',
|
||||||
|
description: '真爱查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。',
|
||||||
|
keywords: '客服中心, 在线客服, 技术支持, 问题反馈, 真爱查客服',
|
||||||
|
url: 'https://www.zhenaicha.com/service'
|
||||||
|
},
|
||||||
|
'inquire-riskassessment.html': {
|
||||||
|
title: '个人综合履约能力画像_多维风险指数检测_信用健康度_真爱查',
|
||||||
|
description: '深度解析个人履约能力综合状况,辅助用户进行风险自查。报告维度包含历史履约趋势、多维生活经营风险指数及关联负面标签。数据客观中立,实时更新,帮助用户优化个人资信档案,提升生活经营能力。',
|
||||||
|
keywords: '个人风险画像,履约能力评估,综合风险指数,信用健康体检,个人数据分析',
|
||||||
|
url: 'https://www.zhenaicha.com/inquire/riskassessment'
|
||||||
|
},
|
||||||
|
'inquire-companyinfo.html': {
|
||||||
|
title: '商业背景真实性核验_企业主经营实力与司法风险_真爱查',
|
||||||
|
description: '真爱查企业版助您鉴别商业背景的真实性。一键核验目标对象的名下关联企业、工商变更记录、司法被执行信息及股权冻结状况。全方位评估经营实力与法律风险,规避商业合作或家庭资产联保隐患。',
|
||||||
|
keywords: '商业背景核验,企业主信用评估,公司经营风险,工商信息核验,资产风险评估',
|
||||||
|
url: 'https://www.zhenaicha.com/inquire/companyinfo'
|
||||||
|
},
|
||||||
|
'inquire-marriage.html': {
|
||||||
|
title: '婚前综合背景了解_涉婚司法风险评估_情感诚意度报告_真爱查',
|
||||||
|
description: '真爱查婚恋报告基于公开司法大数据,提供客观的婚前背景参考。深度评估对象的涉婚法律诉讼、失信被执行历史及社会不良标签。旨在消除信息不对称,辅助用户建立透明、安全的婚姻基础。',
|
||||||
|
keywords: '婚前背景核验,恋爱对象风险,婚姻司法记录,情感互信报告,家庭履约风险',
|
||||||
|
url: 'https://www.zhenaicha.com/inquire/marriage'
|
||||||
|
},
|
||||||
|
'promote.html': {
|
||||||
|
title: '真爱查合作伙伴计划_婚恋行业数字化风控解决方案_渠道招募',
|
||||||
|
description: '真爱查开放全国渠道合作,为婚介机构及情感咨询师提供专业的数据化风控工具。一键接入婚恋风险评估系统,支持推广海报生成与多级数据管理。正规项目,赋能合作伙伴,共同挖掘婚恋市场的合规商业价值。',
|
||||||
|
keywords: '婚恋行业合作,情感咨询工具,风控系统代理,渠道合作伙伴,婚介数据服务',
|
||||||
|
url: 'https://www.zhenaicha.com/promote'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规范化文案:移除损坏字符(U+FFFD),统一为中文标点,避免乱码
|
||||||
|
*/
|
||||||
|
function normalizeText(str) {
|
||||||
|
if (typeof str !== 'string') return str
|
||||||
|
return str
|
||||||
|
.replace(/\uFFFD/g, '') // 移除 UTF-8 替换符(乱码)
|
||||||
|
.replace(/。/g, '。')
|
||||||
|
.replace(/、/g, '、')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成HTML模板
|
||||||
|
*/
|
||||||
|
function generateHTMLTemplate(config) {
|
||||||
|
const title = normalizeText(config.title)
|
||||||
|
const description = normalizeText(config.description)
|
||||||
|
const keywords = normalizeText(config.keywords)
|
||||||
|
const structuredData = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": title,
|
||||||
|
"description": description,
|
||||||
|
"url": config.url,
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "真爱查",
|
||||||
|
"url": "https://www.zhenaicha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return `<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<!-- 页面标题 -->
|
||||||
|
<title>${title}</title>
|
||||||
|
|
||||||
|
<!-- SEO Meta标签 -->
|
||||||
|
<meta name="description" content="${description}">
|
||||||
|
<meta name="keywords" content="${keywords}">
|
||||||
|
|
||||||
|
<!-- Open Graph标签 -->
|
||||||
|
<meta property="og:title" content="${title}">
|
||||||
|
<meta property="og:description" content="${description}">
|
||||||
|
<meta property="og:url" content="${config.url}">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="真爱查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="${title}">
|
||||||
|
<meta name="twitter:description" content="${description}">
|
||||||
|
<meta name="twitter:url" content="${config.url}">
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="${config.url}">
|
||||||
|
|
||||||
|
<!-- 结构化数据 -->
|
||||||
|
<script type="application/ld+json">
|
||||||
|
${JSON.stringify(structuredData, null, 8)}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 其他Meta标签 -->
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<meta name="googlebot" content="index, follow">
|
||||||
|
<meta name="baiduspider" content="index, follow">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
.seo-content {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
h1 { color: #333; }
|
||||||
|
p { color: #666; }
|
||||||
|
.redirect-notice {
|
||||||
|
background: #fff3cd;
|
||||||
|
border: 1px solid #ffc107;
|
||||||
|
color: #856404;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 20px 0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="seo-content">
|
||||||
|
<h1>${title}</h1>
|
||||||
|
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="${config.url}">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>${description}</p>
|
||||||
|
|
||||||
|
<!-- 这里可以添加更多SEO友好的静态内容 -->
|
||||||
|
<section>
|
||||||
|
<h2>关于真爱查</h2>
|
||||||
|
<p>真爱查是专业的婚姻状态核验与婚前背景互信平台,提供全方位的风险查询服务。我们的核心使命是帮助用户建立安全、可信赖的婚姻基础。</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合履约能力画像</li>
|
||||||
|
<li>商业背景真实性核验</li>
|
||||||
|
<li>婚前综合背景了解</li>
|
||||||
|
<li>涉婚司法风险评估</li>
|
||||||
|
<li>情感诚意度报告</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>为什么选择真爱查</h2>
|
||||||
|
<p>真爱查依托大数据技术,为用户提供准确、及时的婚恋风险评估报告,帮助您做出明智决策。</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 可选:自动跳转到SPA应用
|
||||||
|
// setTimeout(function() {
|
||||||
|
// window.location.href = '${config.url}';
|
||||||
|
// }, 2000);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主函数
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
const outputDir = path.join(__dirname, '../public/seo-templates')
|
||||||
|
|
||||||
|
// 创建输出目录
|
||||||
|
if (!fs.existsSync(outputDir)) {
|
||||||
|
fs.mkdirSync(outputDir, { recursive: true })
|
||||||
|
console.log(`✓ 创建模板目录: ${outputDir}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成所有模板文件
|
||||||
|
let successCount = 0
|
||||||
|
Object.entries(pageSEOConfigs).forEach(([filename, config]) => {
|
||||||
|
const htmlContent = generateHTMLTemplate(config)
|
||||||
|
const filePath = path.join(outputDir, filename)
|
||||||
|
|
||||||
|
fs.writeFileSync(filePath, htmlContent, 'utf-8')
|
||||||
|
console.log(`✓ 生成模板: ${filename}`)
|
||||||
|
successCount++
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`\n✓ 成功生成 ${successCount} 个SEO模板文件`)
|
||||||
|
console.log(`📁 模板目录: ${outputDir}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行生成
|
||||||
|
main()
|
||||||
174
server/middleware.js
Normal file
174
server/middleware.js
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
/**
|
||||||
|
* SEO中间件
|
||||||
|
* 用于在Node.js服务器中检测爬虫并返回静态HTML
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const CrawlerDetector = require('./crawler-detector')
|
||||||
|
|
||||||
|
class SEOMiddleware {
|
||||||
|
constructor(options = {}) {
|
||||||
|
this.detector = new CrawlerDetector()
|
||||||
|
this.templateDir = options.templateDir || path.join(__dirname, '../public/seo-templates')
|
||||||
|
this.defaultTemplate = options.defaultTemplate || 'index.html'
|
||||||
|
this.fallbackToSPA = options.fallbackToSPA !== false
|
||||||
|
this.debug = options.debug || false
|
||||||
|
|
||||||
|
// 路由到模板的映射(与useSEO.js保持一致)
|
||||||
|
this.routeTemplateMap = {
|
||||||
|
'/': 'index.html',
|
||||||
|
'/agent': 'agent.html',
|
||||||
|
'/help': 'help.html',
|
||||||
|
'/help/guide': 'help-guide.html',
|
||||||
|
'/example': 'example.html',
|
||||||
|
'/service': 'service.html',
|
||||||
|
'/inquire/riskassessment': 'inquire-riskassessment.html',
|
||||||
|
'/inquire/companyinfo': 'inquire-companyinfo.html',
|
||||||
|
'/inquire/marriage': 'inquire-marriage.html',
|
||||||
|
'/promote': 'promote.html'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化模板缓存
|
||||||
|
this.templateCache = new Map()
|
||||||
|
this.cacheTemplates()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存所有模板文件
|
||||||
|
*/
|
||||||
|
cacheTemplates() {
|
||||||
|
try {
|
||||||
|
if (!fs.existsSync(this.templateDir)) {
|
||||||
|
console.warn(`[SEOMiddleware] 模板目录不存在: ${this.templateDir}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = fs.readdirSync(this.templateDir)
|
||||||
|
files.forEach(file => {
|
||||||
|
const filePath = path.join(this.templateDir, file)
|
||||||
|
if (fs.statSync(filePath).isFile()) {
|
||||||
|
this.templateCache.set(file, fs.readFileSync(filePath, 'utf-8'))
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 已缓存模板: ${file}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`[SEOMiddleware] 已缓存 ${this.templateCache.size} 个模板文件`)
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[SEOMiddleware] 缓存模板失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取对应的模板文件名
|
||||||
|
* @param {String} path - 请求路径
|
||||||
|
* @returns {String} 模板文件名
|
||||||
|
*/
|
||||||
|
getTemplatePath(requestPath) {
|
||||||
|
// 完全匹配
|
||||||
|
if (this.routeTemplateMap[requestPath]) {
|
||||||
|
return this.routeTemplateMap[requestPath]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模糊匹配(处理动态路由)
|
||||||
|
const matchedKey = Object.keys(this.routeTemplateMap).find(route => {
|
||||||
|
return requestPath.startsWith(route)
|
||||||
|
})
|
||||||
|
|
||||||
|
return matchedKey ? this.routeTemplateMap[matchedKey] : this.defaultTemplate
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取模板内容
|
||||||
|
* @param {String} templateName - 模板文件名
|
||||||
|
* @returns {String|null} 模板内容
|
||||||
|
*/
|
||||||
|
getTemplate(templateName) {
|
||||||
|
// 首先尝试缓存
|
||||||
|
let content = this.templateCache.get(templateName)
|
||||||
|
|
||||||
|
// 如果缓存中没有,尝试从磁盘读取
|
||||||
|
if (!content) {
|
||||||
|
try {
|
||||||
|
const filePath = path.join(this.templateDir, templateName)
|
||||||
|
if (fs.existsSync(filePath)) {
|
||||||
|
content = fs.readFileSync(filePath, 'utf-8')
|
||||||
|
this.templateCache.set(templateName, content)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[SEOMiddleware] 读取模板失败: ${templateName}`, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content || null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Express中间件
|
||||||
|
*/
|
||||||
|
express() {
|
||||||
|
return (req, res, next) => {
|
||||||
|
// 检测是否为爬虫
|
||||||
|
if (this.detector.isCrawler(req)) {
|
||||||
|
const templateName = this.getTemplatePath(req.path)
|
||||||
|
const template = this.getTemplate(templateName)
|
||||||
|
|
||||||
|
if (template) {
|
||||||
|
// 设置响应头
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
||||||
|
res.setHeader('X-SEOMiddleware', 'prerendered')
|
||||||
|
|
||||||
|
// 返回静态HTML
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 返回SEO模板: ${templateName} for ${req.path}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.send(template)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不是爬虫或模板不存在,继续处理SPA
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Koa中间件
|
||||||
|
*/
|
||||||
|
koa() {
|
||||||
|
return async (ctx, next) => {
|
||||||
|
// 检测是否为爬虫
|
||||||
|
if (this.detector.isCrawler(ctx.req)) {
|
||||||
|
const templateName = this.getTemplatePath(ctx.path)
|
||||||
|
const template = this.getTemplate(templateName)
|
||||||
|
|
||||||
|
if (template) {
|
||||||
|
ctx.type = 'text/html; charset=utf-8'
|
||||||
|
ctx.set('X-SEOMiddleware', 'prerendered')
|
||||||
|
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 返回SEO模板: ${templateName} for ${ctx.path}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.body = template
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新加载模板缓存
|
||||||
|
*/
|
||||||
|
reloadCache() {
|
||||||
|
this.templateCache.clear()
|
||||||
|
this.cacheTemplates()
|
||||||
|
console.log('[SEOMiddleware] 模板缓存已重新加载')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SEOMiddleware
|
||||||
28
server/package.json
Normal file
28
server/package.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "xfc-seo-server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "幸福查SEO优化服务器 - 爬虫检测与静态HTML回退",
|
||||||
|
"main": "server-example-express.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server-example-express.js",
|
||||||
|
"dev": "node server-example-express.js",
|
||||||
|
"generate": "node generate-seo-templates.cjs",
|
||||||
|
"test": "node test-seo.js",
|
||||||
|
"test:crawler": "node test-crawler-detection.js"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"seo",
|
||||||
|
"crawler",
|
||||||
|
"spa",
|
||||||
|
"prerender"
|
||||||
|
],
|
||||||
|
"author": "xingfucha",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"compression": "^1.7.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^3.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
36
server/server-example-express.js
Normal file
36
server/server-example-express.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/**
|
||||||
|
* Express服务器示例
|
||||||
|
* 展示如何集成SEO中间件
|
||||||
|
*/
|
||||||
|
|
||||||
|
const express = require('express')
|
||||||
|
const path = require('path')
|
||||||
|
const SEOMiddleware = require('./middleware')
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
const port = process.env.PORT || 3000
|
||||||
|
|
||||||
|
// 初始化SEO中间件
|
||||||
|
const seoMiddleware = new SEOMiddleware({
|
||||||
|
templateDir: path.join(__dirname, '../public/seo-templates'),
|
||||||
|
debug: process.env.NODE_ENV === 'development'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 应用SEO中间件(必须在静态文件服务之前)
|
||||||
|
app.use(seoMiddleware.express())
|
||||||
|
|
||||||
|
// 静态文件服务
|
||||||
|
app.use(express.static(path.join(__dirname, '../dist')))
|
||||||
|
|
||||||
|
// SPA路由处理
|
||||||
|
app.get('*', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../dist/index.html'))
|
||||||
|
})
|
||||||
|
|
||||||
|
// 启动服务器
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`🚀 服务器运行在 http://localhost:${port}`)
|
||||||
|
console.log(`🔍 SEO中间件已启用`)
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = app
|
||||||
@@ -87,9 +87,7 @@ const handleWeixinAuthCallback = async (code) => {
|
|||||||
const tokenVersion = import.meta.env.VITE_TOKEN_VERSION || "1.1";
|
const tokenVersion = import.meta.env.VITE_TOKEN_VERSION || "1.1";
|
||||||
localStorage.setItem("tokenVersion", tokenVersion);
|
localStorage.setItem("tokenVersion", tokenVersion);
|
||||||
|
|
||||||
console.log("✅ Token saved successfully, token:", token.substring(0, 20) + "...");
|
|
||||||
console.log("✅ Token saved to localStorage, userId:", data.value.data.userId || "unknown");
|
|
||||||
console.log(`✅ TokenVersion set to ${tokenVersion}`);
|
|
||||||
|
|
||||||
// 验证 token 是否真的保存成功
|
// 验证 token 是否真的保存成功
|
||||||
const savedToken = localStorage.getItem("token");
|
const savedToken = localStorage.getItem("token");
|
||||||
|
|||||||
@@ -278,3 +278,67 @@ export function getInviteLink(params) {
|
|||||||
const queryString = buildQueryString(params || {});
|
const queryString = buildQueryString(params || {});
|
||||||
return useApiFetch(`/agent/invite_link${queryString}`).get().json();
|
return useApiFetch(`/agent/invite_link${queryString}`).get().json();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================== 白名单相关接口 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取可屏蔽的 feature 列表(带价格)
|
||||||
|
*/
|
||||||
|
export function getWhitelistFeatures() {
|
||||||
|
return useApiFetch("/agent/whitelist/features").get().json();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建白名单订单
|
||||||
|
* @param {object} params - 创建参数
|
||||||
|
* @param {string} params.id_card - 身份证号
|
||||||
|
* @param {string[]} params.feature_ids - 要屏蔽的 feature ID 列表
|
||||||
|
* @param {string} params.order_id - 关联的查询订单 ID(可选)
|
||||||
|
*/
|
||||||
|
export function createWhitelistOrder(params) {
|
||||||
|
return useApiFetch("/agent/whitelist/order/create").post(params).json();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询白名单列表
|
||||||
|
* @param {object} params - 查询参数
|
||||||
|
* @param {number} params.page - 页码
|
||||||
|
* @param {number} params.page_size - 每页数量
|
||||||
|
* @param {string} params.id_card - 身份证号(可选)
|
||||||
|
*/
|
||||||
|
export function getWhitelistList(params) {
|
||||||
|
const queryString = buildQueryString(params || {});
|
||||||
|
return useApiFetch(`/agent/whitelist/list${queryString}`).get().json();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查模块是否已下架
|
||||||
|
* @param {object} params - 查询参数
|
||||||
|
* @param {string} params.id_card - 身份证号
|
||||||
|
* @param {string} params.feature_api_id - Feature 的 API 标识
|
||||||
|
* @param {string} params.query_id - 查询记录 ID(可选)
|
||||||
|
*/
|
||||||
|
export function checkFeatureWhitelistStatus(params) {
|
||||||
|
const queryString = buildQueryString(params || {});
|
||||||
|
return useApiFetch(`/agent/whitelist/check${queryString}`).get().json();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下架单个模块(创建订单并支付或免费下架)
|
||||||
|
* @param {object} params - 下架参数
|
||||||
|
* @param {string} params.query_id - 查询记录 ID
|
||||||
|
* @param {string} params.feature_api_id - Feature 的 API 标识
|
||||||
|
*/
|
||||||
|
export function offlineFeature(params) {
|
||||||
|
return useApiFetch("/agent/whitelist/offline").post(params).json();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查订单是否属于当前代理推广
|
||||||
|
* @param {object} params - 查询参数
|
||||||
|
* @param {string} params.order_id - 订单 ID
|
||||||
|
*/
|
||||||
|
export function checkOrderAgent(params) {
|
||||||
|
const queryString = buildQueryString(params || {});
|
||||||
|
return useApiFetch(`/agent/order/agent${queryString}`).get().json();
|
||||||
|
}
|
||||||
|
|||||||
1
src/auto-imports.d.ts
vendored
1
src/auto-imports.d.ts
vendored
@@ -117,6 +117,7 @@ declare global {
|
|||||||
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
||||||
const useAgent: typeof import('./composables/useAgent.js')['useAgent']
|
const useAgent: typeof import('./composables/useAgent.js')['useAgent']
|
||||||
const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore']
|
const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore']
|
||||||
|
const useAliyunCaptcha: typeof import('./composables/useAliyunCaptcha.js')['default']
|
||||||
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
||||||
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
|
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
|
||||||
const useAppStore: typeof import('./stores/appStore.js')['useAppStore']
|
const useAppStore: typeof import('./stores/appStore.js')['useAppStore']
|
||||||
|
|||||||
@@ -127,7 +127,9 @@ const router = useRouter();
|
|||||||
const show = defineModel("show");
|
const show = defineModel("show");
|
||||||
import { useCascaderAreaData } from "@vant/area-data";
|
import { useCascaderAreaData } from "@vant/area-data";
|
||||||
import { showToast } from "vant"; // 引入 showToast 方法
|
import { showToast } from "vant"; // 引入 showToast 方法
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
const emit = defineEmits(); // 确保 emit 可以正确使用
|
const emit = defineEmits(); // 确保 emit 可以正确使用
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isSelf: {
|
isSelf: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
@@ -173,20 +175,22 @@ const getSmsCode = async () => {
|
|||||||
|
|
||||||
loadingSms.value = true;
|
loadingSms.value = true;
|
||||||
|
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
// 使用阿里云滑块验证码
|
||||||
.post({ mobile: form.value.mobile, actionType: "agentApply" })
|
runWithCaptcha(
|
||||||
.json();
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("auth/sendSms")
|
||||||
|
.post({ mobile: form.value.mobile, actionType: "agentApply", captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
loadingSms.value = false;
|
loadingSms.value = false;
|
||||||
|
if (res.code === 200) {
|
||||||
if (data.value && !error.value) {
|
|
||||||
if (data.value.code === 200) {
|
|
||||||
showToast({ message: "获取成功" });
|
showToast({ message: "获取成功" });
|
||||||
startCountdown(); // 启动倒计时
|
startCountdown(); // 启动倒计时
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg);
|
showToast(res.msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
let timer = null;
|
let timer = null;
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,15 @@ import ShareReportButton from "./ShareReportButton.vue";
|
|||||||
import TitleBanner from "./TitleBanner.vue";
|
import TitleBanner from "./TitleBanner.vue";
|
||||||
import VerificationCard from "./VerificationCard.vue";
|
import VerificationCard from "./VerificationCard.vue";
|
||||||
import StyledTabs from "./StyledTabs.vue";
|
import StyledTabs from "./StyledTabs.vue";
|
||||||
|
import Payment from "./Payment.vue";
|
||||||
import { splitDWBG8B4DForTabs } from '@/ui/CDWBG8B4D/utils/simpleSplitter.js';
|
import { splitDWBG8B4DForTabs } from '@/ui/CDWBG8B4D/utils/simpleSplitter.js';
|
||||||
import { splitDWBG6A2CForTabs } from '@/ui/DWBG6A2C/utils/simpleSplitter.js';
|
import { splitDWBG6A2CForTabs } from '@/ui/DWBG6A2C/utils/simpleSplitter.js';
|
||||||
import { splitJRZQ7F1AForTabs } from '@/ui/JRZQ7F1A/utils/simpleSplitter.js';
|
import { splitJRZQ7F1AForTabs } from '@/ui/JRZQ7F1A/utils/simpleSplitter.js';
|
||||||
import { splitCJRZQ5E9FForTabs } from '@/ui/CJRZQ5E9F/utils/simpleSplitter.js';
|
import { splitCJRZQ5E9FForTabs } from '@/ui/CJRZQ5E9F/utils/simpleSplitter.js';
|
||||||
import { splitCQYGL3F8EForTabs } from '@/ui/CQYGL3F8E/utils/simpleSplitter.js';
|
import { splitCQYGL3F8EForTabs } from '@/ui/CQYGL3F8E/utils/simpleSplitter.js';
|
||||||
import { useAppStore } from "@/stores/appStore";
|
import { useAppStore } from "@/stores/appStore";
|
||||||
|
import { showFailToast } from "vant";
|
||||||
|
import { checkFeatureWhitelistStatus, offlineFeature, checkOrderAgent } from "@/api/agent";
|
||||||
|
|
||||||
// 动态导入产品背景图片的函数
|
// 动态导入产品背景图片的函数
|
||||||
const loadProductBackground = async (productType) => {
|
const loadProductBackground = async (productType) => {
|
||||||
@@ -53,6 +56,11 @@ const props = defineProps({
|
|||||||
type: String,
|
type: String,
|
||||||
default: "",
|
default: "",
|
||||||
},
|
},
|
||||||
|
queryId: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
feature: {
|
feature: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
@@ -98,8 +106,163 @@ const {
|
|||||||
isEmpty,
|
isEmpty,
|
||||||
isDone,
|
isDone,
|
||||||
isExample,
|
isExample,
|
||||||
|
orderId,
|
||||||
|
orderNo,
|
||||||
|
queryId,
|
||||||
} = toRefs(props);
|
} = toRefs(props);
|
||||||
|
|
||||||
|
// 订单是否属于当前代理推广(仅代理订单才显示模块下架)
|
||||||
|
const isAgentOrder = ref(false);
|
||||||
|
const idCard = computed(() => reportParams.value?.id_card || "");
|
||||||
|
|
||||||
|
// 模块下架状态映射:主模块ID -> { isOfflined, whitelistPrice, isSubmitting }
|
||||||
|
const featureOfflineStatus = ref(new Map());
|
||||||
|
const getMainApiId = (apiId) => {
|
||||||
|
if (!apiId) return "";
|
||||||
|
const index = apiId.indexOf("_");
|
||||||
|
return index > 0 ? apiId.substring(0, index) : apiId;
|
||||||
|
};
|
||||||
|
const checkFeatureStatus = async (featureApiId, forceRefresh = false) => {
|
||||||
|
if (!idCard.value || !featureApiId) return;
|
||||||
|
const mainApiId = getMainApiId(featureApiId);
|
||||||
|
if (!mainApiId) return;
|
||||||
|
if (!forceRefresh && featureOfflineStatus.value.has(mainApiId)) return;
|
||||||
|
try {
|
||||||
|
const { data, error } = await checkFeatureWhitelistStatus({
|
||||||
|
id_card: idCard.value,
|
||||||
|
feature_api_id: mainApiId,
|
||||||
|
query_id: queryId.value || "",
|
||||||
|
});
|
||||||
|
if (data.value && !error.value && data.value.code === 200) {
|
||||||
|
const isWhitelisted = data.value.data.is_whitelisted || false;
|
||||||
|
const dataDeleted = data.value.data.data_deleted !== undefined ? data.value.data.data_deleted : true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, {
|
||||||
|
isOfflined: isWhitelisted && dataDeleted,
|
||||||
|
whitelistPrice: data.value.data.whitelist_price || 0,
|
||||||
|
isSubmitting: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("检查模块状态失败:", err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const checkAllFeaturesStatus = async () => {
|
||||||
|
if (!idCard.value || !isAgentOrder.value || isExample.value) return;
|
||||||
|
const mainApiIds = [...new Set(processedReportData.value.map((item) => getMainApiId(item.data.apiID)))];
|
||||||
|
for (const mainApiId of mainApiIds) {
|
||||||
|
if (mainApiId) await checkFeatureStatus(mainApiId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const getFeatureStatus = (featureApiId) => {
|
||||||
|
const mainApiId = getMainApiId(featureApiId);
|
||||||
|
return featureOfflineStatus.value.get(mainApiId) || { isOfflined: false, whitelistPrice: 0, isSubmitting: false };
|
||||||
|
};
|
||||||
|
const currentOfflineFeature = ref(null);
|
||||||
|
const showOfflineConfirmDialog = ref(false);
|
||||||
|
const handleOfflineClick = async (featureApiId, featureName) => {
|
||||||
|
const mainApiId = getMainApiId(featureApiId);
|
||||||
|
const status = getFeatureStatus(mainApiId);
|
||||||
|
if (status.isOfflined) {
|
||||||
|
showFailToast("该模块已下架");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (status.whitelistPrice <= 0) {
|
||||||
|
await confirmOfflineDirectly(mainApiId, featureName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
currentOfflineFeature.value = { featureApiId: mainApiId, featureName, whitelistPrice: status.whitelistPrice };
|
||||||
|
showOfflineConfirmDialog.value = true;
|
||||||
|
};
|
||||||
|
const showWhitelistPayment = ref(false);
|
||||||
|
const whitelistPaymentData = ref({ product_name: "", sell_price: 0 });
|
||||||
|
const whitelistPaymentId = ref("");
|
||||||
|
const whitelistPaymentType = ref("whitelist");
|
||||||
|
const confirmOfflineDirectly = async (mainApiId, featureName) => {
|
||||||
|
if (!idCard.value || !mainApiId) return;
|
||||||
|
const status = getFeatureStatus(mainApiId);
|
||||||
|
status.isSubmitting = true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...status });
|
||||||
|
try {
|
||||||
|
if (!queryId.value) {
|
||||||
|
showFailToast("缺少查询记录ID,无法下架");
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { data, error } = await offlineFeature({ query_id: queryId.value, feature_api_id: mainApiId });
|
||||||
|
if (!data.value || error.value || data.value.code !== 200) {
|
||||||
|
showFailToast(data.value?.msg || "下架失败");
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const resp = data.value.data || {};
|
||||||
|
if (resp.need_pay) {
|
||||||
|
const currentStatus = getFeatureStatus(mainApiId);
|
||||||
|
currentStatus.isSubmitting = false;
|
||||||
|
currentStatus.whitelistPrice = resp.amount || 0;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...currentStatus });
|
||||||
|
whitelistPaymentData.value = { product_name: `${featureName || "模块"} 下架`, sell_price: resp.amount || 0 };
|
||||||
|
whitelistPaymentId.value = `${idCard.value}|${mainApiId}`;
|
||||||
|
whitelistPaymentType.value = "whitelist";
|
||||||
|
showWhitelistPayment.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
showFailToast("下架成功");
|
||||||
|
const updatedStatus = getFeatureStatus(mainApiId);
|
||||||
|
updatedStatus.isSubmitting = false;
|
||||||
|
updatedStatus.isOfflined = true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...updatedStatus });
|
||||||
|
if (queryId.value || orderId.value) window.location.reload();
|
||||||
|
} catch (err) {
|
||||||
|
console.error("下架模块失败:", err);
|
||||||
|
showFailToast("下架模块失败");
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const confirmOffline = async () => {
|
||||||
|
if (!currentOfflineFeature.value) return;
|
||||||
|
const mainApiId = currentOfflineFeature.value.featureApiId;
|
||||||
|
if (!queryId.value) {
|
||||||
|
showFailToast("缺少查询记录ID,无法下架");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const status = getFeatureStatus(mainApiId);
|
||||||
|
status.isSubmitting = true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...status });
|
||||||
|
try {
|
||||||
|
const { data, error } = await offlineFeature({ query_id: queryId.value, feature_api_id: mainApiId });
|
||||||
|
if (!data.value || error.value || data.value.code !== 200) {
|
||||||
|
showFailToast(data.value?.msg || "下架失败");
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const resp = data.value.data || {};
|
||||||
|
if (resp.need_pay) {
|
||||||
|
showOfflineConfirmDialog.value = false;
|
||||||
|
whitelistPaymentData.value = {
|
||||||
|
product_name: `${currentOfflineFeature.value?.featureName || "模块"} 下架`,
|
||||||
|
sell_price: resp.amount || 0,
|
||||||
|
};
|
||||||
|
whitelistPaymentId.value = `${idCard.value}|${mainApiId}`;
|
||||||
|
whitelistPaymentType.value = "whitelist";
|
||||||
|
showWhitelistPayment.value = true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
showFailToast("下架成功");
|
||||||
|
showOfflineConfirmDialog.value = false;
|
||||||
|
currentOfflineFeature.value = null;
|
||||||
|
const updatedStatus = getFeatureStatus(mainApiId);
|
||||||
|
updatedStatus.isSubmitting = false;
|
||||||
|
updatedStatus.isOfflined = true;
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...updatedStatus });
|
||||||
|
if (queryId.value || orderId.value) window.location.reload();
|
||||||
|
} catch (err) {
|
||||||
|
console.error("下架模块失败:", err);
|
||||||
|
showFailToast("下架模块失败");
|
||||||
|
featureOfflineStatus.value.set(mainApiId, { ...getFeatureStatus(mainApiId), isSubmitting: false });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const active = ref(null);
|
const active = ref(null);
|
||||||
const backgroundContainerRef = ref(null); // 背景容器的引用
|
const backgroundContainerRef = ref(null); // 背景容器的引用
|
||||||
|
|
||||||
@@ -153,8 +316,29 @@ onMounted(async () => {
|
|||||||
|
|
||||||
// 监听窗口大小变化,重新计算高度
|
// 监听窗口大小变化,重新计算高度
|
||||||
window.addEventListener('resize', handleResize);
|
window.addEventListener('resize', handleResize);
|
||||||
|
|
||||||
|
// 检查订单是否属于当前代理推广(仅代理订单显示模块下架)
|
||||||
|
if (!isExample.value && orderId.value) {
|
||||||
|
try {
|
||||||
|
const { data, error } = await checkOrderAgent({ order_id: orderId.value });
|
||||||
|
if (data.value && !error.value && data.value.code === 200) {
|
||||||
|
isAgentOrder.value = data.value.data.is_agent_order || false;
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("检查订单代理状态失败:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isAgentOrder.value && idCard.value && !isExample.value) {
|
||||||
|
checkAllFeaturesStatus();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
watch([() => isAgentOrder.value, idCard, processedReportData], () => {
|
||||||
|
if (isAgentOrder.value && idCard.value && !isExample.value) {
|
||||||
|
checkAllFeaturesStatus();
|
||||||
|
}
|
||||||
|
}, { deep: true });
|
||||||
|
|
||||||
// 处理窗口大小变化(带防抖)
|
// 处理窗口大小变化(带防抖)
|
||||||
const handleResize = () => {
|
const handleResize = () => {
|
||||||
if (resizeTimer) {
|
if (resizeTimer) {
|
||||||
@@ -892,6 +1076,16 @@ const showPublicSecurityRecord = import.meta.env.VITE_SHOW_PUBLIC_SECURITY_RECOR
|
|||||||
</component>
|
</component>
|
||||||
<LRemark v-if="featureMap[item.data.apiID]?.remark"
|
<LRemark v-if="featureMap[item.data.apiID]?.remark"
|
||||||
:content="featureMap[item.data.apiID]?.remark" />
|
:content="featureMap[item.data.apiID]?.remark" />
|
||||||
|
<!-- 代理订单才显示模块下架入口 -->
|
||||||
|
<div v-if="!isShare && !isExample && isAgentOrder && !getFeatureStatus(item.data.apiID).isOfflined"
|
||||||
|
class="mt-4">
|
||||||
|
<van-button plain type="default" size="small" :loading="getFeatureStatus(item.data.apiID).isSubmitting"
|
||||||
|
@click="handleOfflineClick(item.data.apiID, featureMap[item.data.apiID]?.name)">
|
||||||
|
下架该模块
|
||||||
|
</van-button>
|
||||||
|
</div>
|
||||||
|
<div v-else-if="!isShare && isAgentOrder && getFeatureStatus(item.data.apiID).isOfflined"
|
||||||
|
class="mt-4 text-gray-500 text-sm">该模块已下架</div>
|
||||||
</van-tab>
|
</van-tab>
|
||||||
<ShareReportButton v-if="!isShare" class="h-12 text-3xl mt-8" :order-id="orderId"
|
<ShareReportButton v-if="!isShare" class="h-12 text-3xl mt-8" :order-id="orderId"
|
||||||
:order-no="orderNo" :isExample="isExample" />
|
:order-no="orderNo" :isExample="isExample" />
|
||||||
@@ -918,6 +1112,16 @@ const showPublicSecurityRecord = import.meta.env.VITE_SHOW_PUBLIC_SECURITY_RECOR
|
|||||||
</StyledTabs>
|
</StyledTabs>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<!-- 付费下架确认弹窗 -->
|
||||||
|
<van-dialog v-model:show="showOfflineConfirmDialog" title="确认下架" show-cancel-button
|
||||||
|
@confirm="confirmOffline">
|
||||||
|
<div class="p-4 text-gray-700">
|
||||||
|
下架该模块需支付 ¥{{ currentOfflineFeature?.whitelistPrice ?? 0 }},是否继续?
|
||||||
|
</div>
|
||||||
|
</van-dialog>
|
||||||
|
<!-- 白名单下架支付弹窗 -->
|
||||||
|
<Payment v-model="showWhitelistPayment" :data="whitelistPaymentData" :id="whitelistPaymentId"
|
||||||
|
:type="whitelistPaymentType" />
|
||||||
</div>
|
</div>
|
||||||
<div class="disclaimer">
|
<div class="disclaimer">
|
||||||
<div class="flex flex-col items-center">
|
<div class="flex flex-col items-center">
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useUserStore } from "@/stores/userStore";
|
|||||||
import { showToast } from "vant";
|
import { showToast } from "vant";
|
||||||
import useApiFetch from "@/composables/useApiFetch";
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
import { registerByInviteCode } from "@/api/agent";
|
import { registerByInviteCode } from "@/api/agent";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const emit = defineEmits(['register-success'])
|
const emit = defineEmits(['register-success'])
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -14,6 +15,7 @@ const route = useRoute();
|
|||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
|
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
|
||||||
const phoneNumber = ref("");
|
const phoneNumber = ref("");
|
||||||
const verificationCode = ref("");
|
const verificationCode = ref("");
|
||||||
@@ -81,12 +83,15 @@ async function sendVerificationCode() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const actionType = hasAccount.value ? "bindMobile" : "agentApply";
|
const actionType = hasAccount.value ? "bindMobile" : "agentApply";
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 使用阿里云滑块验证码
|
||||||
if (data.value.code === 200) {
|
runWithCaptcha(
|
||||||
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("auth/sendSms")
|
||||||
|
.post({ mobile: phoneNumber.value, actionType, captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
showToast({ message: "获取成功" });
|
showToast({ message: "获取成功" });
|
||||||
startCountdown();
|
startCountdown();
|
||||||
// 聚焦到验证码输入框
|
// 聚焦到验证码输入框
|
||||||
@@ -97,9 +102,10 @@ async function sendVerificationCode() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg);
|
showToast(res.msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -1,12 +1,19 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, nextTick } from "vue";
|
import { ref, computed, nextTick } from "vue";
|
||||||
import { useDialogStore } from "@/stores/dialogStore";
|
import { useDialogStore } from "@/stores/dialogStore";
|
||||||
|
import { useAgentStore } from "@/stores/agentStore";
|
||||||
|
import { useUserStore } from "@/stores/userStore";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import { showToast } from "vant";
|
||||||
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const emit = defineEmits(['bind-success'])
|
const emit = defineEmits(['bind-success'])
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
|
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
|
||||||
const phoneNumber = ref("");
|
const phoneNumber = ref("");
|
||||||
const verificationCode = ref("");
|
const verificationCode = ref("");
|
||||||
@@ -37,12 +44,15 @@ async function sendVerificationCode() {
|
|||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: "请输入有效的手机号" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType: "bindMobile" })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 使用阿里云滑块验证码
|
||||||
if (data.value.code === 200) {
|
runWithCaptcha(
|
||||||
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("auth/sendSms")
|
||||||
|
.post({ mobile: phoneNumber.value, actionType: "bindMobile", captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
showToast({ message: "获取成功" });
|
showToast({ message: "获取成功" });
|
||||||
startCountdown();
|
startCountdown();
|
||||||
// 聚焦到验证码输入框
|
// 聚焦到验证码输入框
|
||||||
@@ -53,9 +63,10 @@ async function sendVerificationCode() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg);
|
showToast(res.msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -35,7 +35,8 @@
|
|||||||
<input v-model="formData.mobile" id="mobile" type="tel" placeholder="请输入手机号"
|
<input v-model="formData.mobile" id="mobile" type="tel" placeholder="请输入手机号"
|
||||||
class="flex-1 border-none outline-none" @click="handleInputClick" />
|
class="flex-1 border-none outline-none" @click="handleInputClick" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center py-3 border-b border-gray-100">
|
<!-- 验证码输入框:仅需要短信验证码的产品显示 -->
|
||||||
|
<div v-if="needSmsCode" class="flex items-center py-3 border-b border-gray-100">
|
||||||
<label for="verificationCode" class="w-20 font-medium text-gray-700">验证码</label>
|
<label for="verificationCode" class="w-20 font-medium text-gray-700">验证码</label>
|
||||||
<input v-model="formData.verificationCode" id="verificationCode" placeholder="请输入验证码"
|
<input v-model="formData.verificationCode" id="verificationCode" placeholder="请输入验证码"
|
||||||
maxlength="6" class="flex-1 border-none outline-none" @click="handleInputClick" />
|
maxlength="6" class="flex-1 border-none outline-none" @click="handleInputClick" />
|
||||||
@@ -133,6 +134,7 @@ import { useUserStore } from "@/stores/userStore";
|
|||||||
import { useDialogStore } from "@/stores/dialogStore";
|
import { useDialogStore } from "@/stores/dialogStore";
|
||||||
import { useEnv } from "@/composables/useEnv";
|
import { useEnv } from "@/composables/useEnv";
|
||||||
import { showConfirmDialog } from "vant";
|
import { showConfirmDialog } from "vant";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
import Payment from "@/components/Payment.vue";
|
import Payment from "@/components/Payment.vue";
|
||||||
import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue";
|
import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue";
|
||||||
@@ -200,6 +202,7 @@ const dialogStore = useDialogStore();
|
|||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const { isWeChat } = useEnv();
|
const { isWeChat } = useEnv();
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
|
|
||||||
// 响应式数据
|
// 响应式数据
|
||||||
const showPayment = ref(false);
|
const showPayment = ref(false);
|
||||||
@@ -210,6 +213,14 @@ const trapezoidBgImage = ref('');
|
|||||||
const isCountingDown = ref(false);
|
const isCountingDown = ref(false);
|
||||||
const countdown = ref(60);
|
const countdown = ref(60);
|
||||||
|
|
||||||
|
// 不需要短信验证码的产品列表(使用拼图验证)
|
||||||
|
const noSmsCodeRequiredProducts = ['marriage'];
|
||||||
|
|
||||||
|
// 判断当前产品是否需要短信验证码
|
||||||
|
const needSmsCode = computed(() => {
|
||||||
|
return !noSmsCodeRequiredProducts.includes(props.feature);
|
||||||
|
});
|
||||||
|
|
||||||
// 使用传入的featureData或创建响应式引用
|
// 使用传入的featureData或创建响应式引用
|
||||||
const featureData = computed(() => props.featureData || {});
|
const featureData = computed(() => props.featureData || {});
|
||||||
|
|
||||||
@@ -349,34 +360,75 @@ function handleSubmit() {
|
|||||||
formData.idCard,
|
formData.idCard,
|
||||||
(v) => isIdCardValid.value,
|
(v) => isIdCardValid.value,
|
||||||
"请输入有效的身份证号码"
|
"请输入有效的身份证号码"
|
||||||
) ||
|
|
||||||
!validateField(
|
|
||||||
"verificationCode",
|
|
||||||
formData.verificationCode,
|
|
||||||
(v) => v,
|
|
||||||
"请输入验证码"
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 需要短信验证码的产品,校验验证码
|
||||||
|
if (needSmsCode.value && !formData.verificationCode) {
|
||||||
|
showToast({ message: "请输入验证码" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 不需要登录也能查询,直接提交请求
|
// 不需要登录也能查询,直接提交请求
|
||||||
// 如果是已登录用户在微信环境且未绑定手机号,提示绑定(但不强制)
|
// 如果是已登录用户在微信环境且未绑定手机号,提示绑定(但不强制)
|
||||||
if (isLoggedIn.value && !userStore.mobile && props.type !== 'promotion' && isWeChat.value) {
|
if (isLoggedIn.value && !userStore.mobile && props.type !== 'promotion' && isWeChat.value) {
|
||||||
pendingPayment.value = true;
|
pendingPayment.value = true;
|
||||||
dialogStore.openBindPhone();
|
dialogStore.openBindPhone();
|
||||||
} else {
|
} else {
|
||||||
submitRequest();
|
// 不需要短信验证码的产品,使用拼图验证
|
||||||
|
if (!needSmsCode.value) {
|
||||||
|
runWithCaptcha(
|
||||||
|
(captchaVerifyParam) => submitRequest(captchaVerifyParam),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
|
handleQuerySuccess(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// 需要短信验证码的产品,直接提交
|
||||||
|
submitRequest().then(({ data, error }) => {
|
||||||
|
if (data?.code === 200) {
|
||||||
|
handleQuerySuccess(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function submitRequest() {
|
// 处理查询成功
|
||||||
|
function handleQuerySuccess(res) {
|
||||||
|
queryId.value = res.data.id;
|
||||||
|
if (props.type === 'promotion') {
|
||||||
|
localStorage.setItem("token", res.data.accessToken);
|
||||||
|
localStorage.setItem("refreshAfter", res.data.refreshAfter);
|
||||||
|
localStorage.setItem("accessExpire", res.data.accessExpire);
|
||||||
|
const tokenVersion = import.meta.env.VITE_TOKEN_VERSION || "1.1";
|
||||||
|
localStorage.setItem("tokenVersion", tokenVersion);
|
||||||
|
}
|
||||||
|
showPayment.value = true;
|
||||||
|
emit('submit-success', res.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function submitRequest(captchaVerifyParam = null) {
|
||||||
const req = {
|
const req = {
|
||||||
name: formData.name,
|
name: formData.name,
|
||||||
id_card: formData.idCard,
|
id_card: formData.idCard,
|
||||||
mobile: formData.mobile,
|
mobile: formData.mobile
|
||||||
code: formData.verificationCode
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 需要短信验证码的产品,添加 code 字段
|
||||||
|
if (needSmsCode.value) {
|
||||||
|
req.code = formData.verificationCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不需要短信验证码的产品,添加拼图验证参数
|
||||||
|
if (captchaVerifyParam) {
|
||||||
|
req.captchaVerifyParam = captchaVerifyParam;
|
||||||
|
}
|
||||||
|
|
||||||
const reqStr = JSON.stringify(req);
|
const reqStr = JSON.stringify(req);
|
||||||
const encodeData = aesEncrypt(
|
const encodeData = aesEncrypt(
|
||||||
reqStr,
|
reqStr,
|
||||||
@@ -397,22 +449,7 @@ async function submitRequest() {
|
|||||||
.post(requestData)
|
.post(requestData)
|
||||||
.json();
|
.json();
|
||||||
|
|
||||||
if (data.value.code === 200) {
|
return { data: data.value, error };
|
||||||
queryId.value = data.value.data.id;
|
|
||||||
|
|
||||||
// 推广查询需要保存token
|
|
||||||
if (props.type === 'promotion') {
|
|
||||||
localStorage.setItem("token", data.value.data.accessToken);
|
|
||||||
localStorage.setItem("refreshAfter", data.value.data.refreshAfter);
|
|
||||||
localStorage.setItem("accessExpire", data.value.data.accessExpire);
|
|
||||||
// ⚠️ 重要:保存 token 后立即设置 tokenVersion,防止被 checkTokenVersion 清除
|
|
||||||
const tokenVersion = import.meta.env.VITE_TOKEN_VERSION || "1.1";
|
|
||||||
localStorage.setItem("tokenVersion", tokenVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
showPayment.value = true;
|
|
||||||
emit('submit-success', data.value.data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendVerificationCode() {
|
async function sendVerificationCode() {
|
||||||
@@ -422,11 +459,14 @@ async function sendVerificationCode() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch("/auth/sendSms")
|
// 使用阿里云滑块验证码
|
||||||
.post({ mobile: formData.mobile, actionType: "query" })
|
runWithCaptcha(
|
||||||
.json();
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("/auth/sendSms")
|
||||||
if (!error.value && data.value.code === 200) {
|
.post({ mobile: formData.mobile, actionType: "query", captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
showToast({ message: "验证码发送成功", type: "success" });
|
showToast({ message: "验证码发送成功", type: "success" });
|
||||||
startCountdown();
|
startCountdown();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
@@ -436,9 +476,11 @@ async function sendVerificationCode() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showToast({ message: "验证码发送失败,请重试" });
|
showToast({ message: res.msg || "验证码发送失败,请重试" });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let timer = null;
|
let timer = null;
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,14 @@ import { useAgentStore } from "@/stores/agentStore";
|
|||||||
import { useUserStore } from "@/stores/userStore";
|
import { useUserStore } from "@/stores/userStore";
|
||||||
import { showToast } from "vant";
|
import { showToast } from "vant";
|
||||||
import { realNameAuth } from "@/api/agent";
|
import { realNameAuth } from "@/api/agent";
|
||||||
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
// 表单数据
|
// 表单数据
|
||||||
const realName = ref("");
|
const realName = ref("");
|
||||||
const idCard = ref("");
|
const idCard = ref("");
|
||||||
@@ -59,18 +62,22 @@ async function sendVerificationCode() {
|
|||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: "请输入有效的手机号" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType: "realName" })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 使用阿里云滑块验证码
|
||||||
if (data.value.code === 200) {
|
runWithCaptcha(
|
||||||
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("auth/sendSms")
|
||||||
|
.post({ mobile: phoneNumber.value, actionType: "realName", captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
showToast({ message: "获取成功" });
|
showToast({ message: "获取成功" });
|
||||||
startCountdown();
|
startCountdown();
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg);
|
showToast(res.msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
173
src/composables/useAliyunCaptcha.js
Normal file
173
src/composables/useAliyunCaptcha.js
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
import { showToast, showLoadingToast, closeToast } from "vant";
|
||||||
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
|
|
||||||
|
// 阿里云验证码场景 ID
|
||||||
|
const ALIYUN_CAPTCHA_SCENE_ID = "wynt39to";
|
||||||
|
// 是否启用加密模式(通过环境变量控制,非加密模式时前端不调用后端获取 EncryptedSceneId)
|
||||||
|
const ENABLE_ENCRYPTED =import.meta.env.VITE_ALIYUN_CAPTCHA_ENCRYPTED === "false";
|
||||||
|
|
||||||
|
let captchaInitialised = false;
|
||||||
|
/** 首次初始化后,SDK 会异步调用 getInstance,用此 Promise 在实例就绪后再 show */
|
||||||
|
let captchaReadyPromise = null;
|
||||||
|
let captchaReadyResolve = null;
|
||||||
|
|
||||||
|
async function ensureCaptchaInit() {
|
||||||
|
if (captchaInitialised || typeof window === "undefined") return;
|
||||||
|
if (typeof window.initAliyunCaptcha !== "function") return;
|
||||||
|
|
||||||
|
captchaInitialised = true;
|
||||||
|
window.captcha = null;
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
captchaReadyPromise = new Promise((resolve) => {
|
||||||
|
captchaReadyResolve = resolve;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 非加密模式:仅传 SceneId,不调用后端接口
|
||||||
|
if (ENABLE_ENCRYPTED) {
|
||||||
|
console.log("非加密", ALIYUN_CAPTCHA_SCENE_ID);
|
||||||
|
window.initAliyunCaptcha({
|
||||||
|
SceneId: ALIYUN_CAPTCHA_SCENE_ID,
|
||||||
|
mode: "popup",
|
||||||
|
element: "#captcha-element",
|
||||||
|
getInstance(instance) {
|
||||||
|
window.captcha = instance;
|
||||||
|
if (typeof captchaReadyResolve === "function") {
|
||||||
|
captchaReadyResolve();
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
captchaVerifyCallback(param) {
|
||||||
|
return typeof window.__captchaVerifyCallback === "function"
|
||||||
|
? window.__captchaVerifyCallback(param)
|
||||||
|
: Promise.resolve({
|
||||||
|
captchaResult: false,
|
||||||
|
bizResult: false,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onBizResultCallback(bizResult) {
|
||||||
|
if (typeof window.__onBizResultCallback === "function") {
|
||||||
|
window.__onBizResultCallback(bizResult);
|
||||||
|
}
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
},
|
||||||
|
slideStyle: { width: 360, height: 40 },
|
||||||
|
language: "cn",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密模式:先从后端获取 EncryptedSceneId,再初始化
|
||||||
|
const { data, error } = await useApiFetch("/captcha/encryptedSceneId")
|
||||||
|
.post()
|
||||||
|
.json();
|
||||||
|
const resp = data?.value;
|
||||||
|
console.log("加密", resp);
|
||||||
|
const encryptedSceneId = resp?.data?.encryptedSceneId;
|
||||||
|
if (error?.value || !encryptedSceneId) {
|
||||||
|
showToast({ message: "获取验证码参数失败,请稍后重试" });
|
||||||
|
captchaInitialised = false;
|
||||||
|
captchaReadyPromise = null;
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.initAliyunCaptcha({
|
||||||
|
SceneId: ALIYUN_CAPTCHA_SCENE_ID,
|
||||||
|
EncryptedSceneId: encryptedSceneId,
|
||||||
|
mode: "popup",
|
||||||
|
element: "#captcha-element",
|
||||||
|
getInstance(instance) {
|
||||||
|
window.captcha = instance;
|
||||||
|
if (typeof captchaReadyResolve === "function") {
|
||||||
|
captchaReadyResolve();
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
captchaVerifyCallback(param) {
|
||||||
|
return typeof window.__captchaVerifyCallback === "function"
|
||||||
|
? window.__captchaVerifyCallback(param)
|
||||||
|
: Promise.resolve({ captchaResult: false, bizResult: false });
|
||||||
|
},
|
||||||
|
onBizResultCallback(bizResult) {
|
||||||
|
if (typeof window.__onBizResultCallback === "function") {
|
||||||
|
window.__onBizResultCallback(bizResult);
|
||||||
|
}
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
},
|
||||||
|
slideStyle: { width: 360, height: 40 },
|
||||||
|
language: "cn",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阿里云滑块验证码通用封装。
|
||||||
|
* 依赖 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
const loading = 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 };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useAliyunCaptcha;
|
||||||
@@ -11,7 +11,7 @@ export function useSEO() {
|
|||||||
"真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。",
|
"真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。",
|
||||||
keywords:
|
keywords:
|
||||||
"真爱查, 婚姻状态查询, 婚姻历史核验, 再婚背景调查, 情感风险评估, 婚恋互信工具",
|
"真爱查, 婚姻状态查询, 婚姻历史核验, 再婚背景调查, 情感风险评估, 婚恋互信工具",
|
||||||
url: "https://www.zhinengcha.cn",
|
url: "https://www.zhenaicha.com",
|
||||||
};
|
};
|
||||||
|
|
||||||
// 页面SEO配置
|
// 页面SEO配置
|
||||||
@@ -137,7 +137,7 @@ export function useSEO() {
|
|||||||
mainEntity: {
|
mainEntity: {
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
name: "真爱查",
|
name: "真爱查",
|
||||||
url: "https://www.zhinengcha.cn/",
|
url: "https://www.zhenaicha.com/",
|
||||||
description:
|
description:
|
||||||
"专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
"专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
||||||
},
|
},
|
||||||
@@ -226,7 +226,7 @@ export function useSEO() {
|
|||||||
|
|
||||||
updateSEO({
|
updateSEO({
|
||||||
...config,
|
...config,
|
||||||
url: `https://www.zhinengcha.cn${currentPath}`,
|
url: `https://www.zhenaicha.com${currentPath}`,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ router.afterEach((to) => {
|
|||||||
const seoConfig = {
|
const seoConfig = {
|
||||||
title: `${to.meta.title} - 真爱查`,
|
title: `${to.meta.title} - 真爱查`,
|
||||||
description: `真爱查${to.meta.title}页面,提供专业的大数据风险管控服务。`,
|
description: `真爱查${to.meta.title}页面,提供专业的大数据风险管控服务。`,
|
||||||
url: `https://www.zhinengcha.cn${to.path}`,
|
url: `https://www.zhenaicha.com${to.path}`,
|
||||||
};
|
};
|
||||||
updateSEO(seoConfig);
|
updateSEO(seoConfig);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 添加婚姻查询的特殊处理
|
// 添加婚姻查询的特殊处理
|
||||||
if (feature.value === 'marriage') {
|
// if (feature.value === 'marriage') {
|
||||||
showMarriageUpgradeNotice();
|
// showMarriageUpgradeNotice();
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 直接加载产品信息,不需要登录
|
// 直接加载产品信息,不需要登录
|
||||||
await getProduct();
|
await getProduct();
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import { useUserStore } from '@/stores/userStore'
|
|||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
import { mobileCodeLogin } from '@/api/user'
|
import { mobileCodeLogin } from '@/api/user'
|
||||||
import useApiFetch from '@/composables/useApiFetch'
|
import useApiFetch from '@/composables/useApiFetch'
|
||||||
|
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const agentStore = useAgentStore()
|
const agentStore = useAgentStore()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha()
|
||||||
|
|
||||||
const phoneNumber = ref('')
|
const phoneNumber = ref('')
|
||||||
const verificationCode = ref('')
|
const verificationCode = ref('')
|
||||||
@@ -35,12 +37,18 @@ async function sendVerificationCode() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch('auth/sendSms')
|
// 使用阿里云滑块验证码
|
||||||
.post({ mobile: phoneNumber.value, actionType: 'login' })
|
runWithCaptcha(
|
||||||
.json()
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch('auth/sendSms')
|
||||||
if (data.value && !error.value) {
|
.post({
|
||||||
if (data.value.code === 200) {
|
mobile: phoneNumber.value,
|
||||||
|
actionType: 'login',
|
||||||
|
captchaVerifyParam
|
||||||
|
})
|
||||||
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
showToast({ message: "获取成功" });
|
showToast({ message: "获取成功" });
|
||||||
startCountdown()
|
startCountdown()
|
||||||
// 聚焦到验证码输入框
|
// 聚焦到验证码输入框
|
||||||
@@ -51,9 +59,10 @@ async function sendVerificationCode() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg)
|
showToast(res.msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ onMounted(() => {
|
|||||||
title: '404 - 页面未找到 | 真爱查',
|
title: '404 - 页面未找到 | 真爱查',
|
||||||
description: '抱歉,您访问的页面不存在。真爱查专业大数据风险管控平台,提供大数据风险报告查询、婚姻状况查询、个人信用评估等服务。',
|
description: '抱歉,您访问的页面不存在。真爱查专业大数据风险管控平台,提供大数据风险报告查询、婚姻状况查询、个人信用评估等服务。',
|
||||||
keywords: '404, 页面未找到, 真爱查, 大数据风险管控',
|
keywords: '404, 页面未找到, 真爱查, 大数据风险管控',
|
||||||
url: 'https://www.zhinengcha.cn/404'
|
url: 'https://www.zhenaicha.com/404'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -31,18 +31,23 @@
|
|||||||
<span class="text-gray-800">{{
|
<span class="text-gray-800">{{
|
||||||
paymentType === "agent_upgrade"
|
paymentType === "agent_upgrade"
|
||||||
? "代理升级"
|
? "代理升级"
|
||||||
|
: paymentType === "whitelist"
|
||||||
|
? "模块下架"
|
||||||
: "查询服务"
|
: "查询服务"
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="paymentType === 'agent_upgrade'" class="text-center text-gray-600 mb-4">恭喜你升级代理等级成功,享受更多权益
|
<div v-if="paymentType === 'agent_upgrade'" class="text-center text-gray-600 mb-4">恭喜你升级代理等级成功,享受更多权益
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="paymentType === 'whitelist'" class="text-center text-gray-600 mb-4">模块已下架,报告将不再展示该模块内容</div>
|
||||||
|
|
||||||
<div class="action-buttons grid grid-cols-1 gap-4">
|
<div class="action-buttons grid grid-cols-1 gap-4">
|
||||||
<van-button block type="primary" class="rounded-lg" @click="handleNavigation">
|
<van-button block type="primary" class="rounded-lg" @click="handleNavigation">
|
||||||
{{
|
{{
|
||||||
paymentType === "agent_upgrade"
|
paymentType === "agent_upgrade"
|
||||||
? "查看代理信息"
|
? "查看代理信息"
|
||||||
|
: paymentType === "whitelist"
|
||||||
|
? "返回报告"
|
||||||
: "查看查询结果"
|
: "查看查询结果"
|
||||||
}}
|
}}
|
||||||
</van-button>
|
</van-button>
|
||||||
@@ -74,6 +79,8 @@
|
|||||||
<span class="text-gray-800">{{
|
<span class="text-gray-800">{{
|
||||||
paymentType === "agent_upgrade"
|
paymentType === "agent_upgrade"
|
||||||
? "代理升级"
|
? "代理升级"
|
||||||
|
: paymentType === "whitelist"
|
||||||
|
? "模块下架"
|
||||||
: "查询服务"
|
: "查询服务"
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,9 +90,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="paymentType === 'query'" class="action-buttons grid grid-cols-1 gap-4">
|
<div v-if="paymentType === 'query' || paymentType === 'whitelist'" class="action-buttons grid grid-cols-1 gap-4">
|
||||||
<van-button block type="primary" class="rounded-lg" @click="handleNavigation">
|
<van-button block type="primary" class="rounded-lg" @click="handleNavigation">
|
||||||
查看查询结果
|
{{ paymentType === "whitelist" ? "返回报告" : "查看查询结果" }}
|
||||||
</van-button>
|
</van-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -137,6 +144,8 @@
|
|||||||
<span class="text-gray-800">{{
|
<span class="text-gray-800">{{
|
||||||
paymentType === "agent_upgrade"
|
paymentType === "agent_upgrade"
|
||||||
? "代理升级"
|
? "代理升级"
|
||||||
|
: paymentType === "whitelist"
|
||||||
|
? "模块下架"
|
||||||
: "查询服务"
|
: "查询服务"
|
||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -316,9 +325,9 @@ const checkPaymentStatus = async () => {
|
|||||||
if (paymentStatus.value !== newStatus) {
|
if (paymentStatus.value !== newStatus) {
|
||||||
paymentStatus.value = newStatus;
|
paymentStatus.value = newStatus;
|
||||||
|
|
||||||
// 对于查询类型,如果状态是已支付或已退款,直接跳转
|
// 对于查询或白名单类型,如果状态是已支付或已退款,直接跳转
|
||||||
if (
|
if (
|
||||||
paymentType.value === "query" &&
|
(paymentType.value === "query" || paymentType.value === "whitelist") &&
|
||||||
(newStatus === "paid" || newStatus === "refunded")
|
(newStatus === "paid" || newStatus === "refunded")
|
||||||
) {
|
) {
|
||||||
stopPolling();
|
stopPolling();
|
||||||
@@ -410,12 +419,11 @@ onBeforeUnmount(() => {
|
|||||||
// 处理导航逻辑
|
// 处理导航逻辑
|
||||||
function handleNavigation() {
|
function handleNavigation() {
|
||||||
if (paymentType.value === "agent_upgrade") {
|
if (paymentType.value === "agent_upgrade") {
|
||||||
// 跳转到代理主页
|
|
||||||
router.replace("/agent");
|
router.replace("/agent");
|
||||||
agentStore.fetchAgentStatus();
|
agentStore.fetchAgentStatus();
|
||||||
userStore.fetchUserInfo();
|
userStore.fetchUserInfo();
|
||||||
} else {
|
} else {
|
||||||
// 跳转到查询结果页面
|
// 查询服务或白名单下架:跳转到报告页
|
||||||
router.replace({
|
router.replace({
|
||||||
path: "/report",
|
path: "/report",
|
||||||
query: { orderNo: orderNo.value },
|
query: { orderNo: orderNo.value },
|
||||||
|
|||||||
@@ -6,12 +6,13 @@ import { useAgentStore } from '@/stores/agentStore'
|
|||||||
import { useUserStore } from '@/stores/userStore'
|
import { useUserStore } from '@/stores/userStore'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import useApiFetch from '@/composables/useApiFetch'
|
import useApiFetch from '@/composables/useApiFetch'
|
||||||
|
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const agentStore = useAgentStore()
|
const agentStore = useAgentStore()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
|
const { runWithCaptcha } = useAliyunCaptcha()
|
||||||
|
|
||||||
const phoneNumber = ref('')
|
const phoneNumber = ref('')
|
||||||
const verificationCode = ref('')
|
const verificationCode = ref('')
|
||||||
@@ -29,33 +30,31 @@ function fillInviteCode() {
|
|||||||
|
|
||||||
// 从URL参数中读取邀请码并自动填入,如果用户已登录且有手机号则自动填充
|
// 从URL参数中读取邀请码并自动填入,如果用户已登录且有手机号则自动填充
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
const inviteCodeParam = route.query.invite_code;
|
const inviteCodeParam = route.query.invite_code
|
||||||
if (inviteCodeParam) {
|
if (inviteCodeParam) {
|
||||||
inviteCode.value = inviteCodeParam;
|
inviteCode.value = inviteCodeParam
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从路由参数获取手机号(已注册用户继续注册成为代理的情况)
|
// 从路由参数获取手机号(已注册用户继续注册成为代理的情况)
|
||||||
const mobileParam = route.query.mobile;
|
const mobileParam = route.query.mobile
|
||||||
if (mobileParam) {
|
if (mobileParam) {
|
||||||
phoneNumber.value = mobileParam;
|
phoneNumber.value = mobileParam
|
||||||
isPhoneDisabled.value = true;
|
isPhoneDisabled.value = true
|
||||||
} else {
|
} else {
|
||||||
// 如果用户已登录且有手机号,自动填充手机号
|
// 如果用户已登录且有手机号,自动填充手机号
|
||||||
const token = localStorage.getItem("token");
|
const token = localStorage.getItem('token')
|
||||||
if (token) {
|
if (token) {
|
||||||
// 确保用户信息已加载
|
|
||||||
if (!userStore.mobile) {
|
if (!userStore.mobile) {
|
||||||
await userStore.fetchUserInfo();
|
await userStore.fetchUserInfo()
|
||||||
}
|
}
|
||||||
if (userStore.mobile) {
|
if (userStore.mobile) {
|
||||||
phoneNumber.value = userStore.mobile;
|
phoneNumber.value = userStore.mobile
|
||||||
isPhoneDisabled.value = true;
|
isPhoneDisabled.value = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
|
||||||
// 是否是已注册用户(根据注册接口返回判断)
|
|
||||||
const isRegisteredUser = ref(false)
|
const isRegisteredUser = ref(false)
|
||||||
|
|
||||||
const isPhoneNumberValid = computed(() => {
|
const isPhoneNumberValid = computed(() => {
|
||||||
@@ -73,36 +72,61 @@ const canRegister = computed(() => {
|
|||||||
isAgreed.value
|
isAgreed.value
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 发送验证码(参考登录页逻辑,使用阿里云滑块验证码)
|
||||||
async function sendVerificationCode() {
|
async function sendVerificationCode() {
|
||||||
if (isCountingDown.value || !isPhoneNumberValid.value) return
|
// 1. 基础校验
|
||||||
|
if (isCountingDown.value) return
|
||||||
if (!isPhoneNumberValid.value) {
|
if (!isPhoneNumberValid.value) {
|
||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: '请输入有效的手机号' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!isInviteCodeValid.value) {
|
if (!isInviteCodeValid.value) {
|
||||||
showToast({ message: "请先输入邀请码" });
|
showToast({ message: '请先输入邀请码' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch('auth/sendSms')
|
// 2. 使用阿里云滑块验证码发送短信
|
||||||
.post({ mobile: phoneNumber.value, actionType: 'agentApply' })
|
try {
|
||||||
.json()
|
const result = await runWithCaptcha(
|
||||||
|
// 第一个参数:调用发送短信接口的函数,传入滑块验证参数
|
||||||
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch('auth/sendSms')
|
||||||
|
.post({
|
||||||
|
mobile: phoneNumber.value,
|
||||||
|
actionType: 'agentApply', // 根据业务选择 login 或 agentApply
|
||||||
|
captchaVerifyParam,
|
||||||
|
inviteCode: inviteCode.value.trim() // 带上邀请码,后端可能需要校验
|
||||||
|
})
|
||||||
|
.json(),
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 第二个参数:滑块验证成功后,处理短信发送结果的回调
|
||||||
if (data.value.code === 200) {
|
(res) => {
|
||||||
showToast({ message: "获取成功" });
|
if (res.code === 200) {
|
||||||
|
showToast({ message: '验证码发送成功' })
|
||||||
startCountdown()
|
startCountdown()
|
||||||
// 聚焦到验证码输入框
|
// 聚焦到验证码输入框
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
const verificationCodeInput = document.getElementById('verificationCode');
|
const verificationCodeInput = document.getElementById('verificationCode')
|
||||||
if (verificationCodeInput) {
|
if (verificationCodeInput) {
|
||||||
verificationCodeInput.focus();
|
verificationCodeInput.focus()
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
return true // 告诉 runWithCaptcha 验证+发送成功
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg)
|
showToast({ message: res.msg || '验证码发送失败' })
|
||||||
|
return false // 告诉 runWithCaptcha 失败,不再继续
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 如果滑块验证或短信发送失败,直接返回
|
||||||
|
if (!result) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('发送验证码失败:', error)
|
||||||
|
showToast({ message: '发送验证码失败,请重试' })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
@@ -120,29 +144,27 @@ function startCountdown() {
|
|||||||
|
|
||||||
async function handleRegister() {
|
async function handleRegister() {
|
||||||
if (!isPhoneNumberValid.value) {
|
if (!isPhoneNumberValid.value) {
|
||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: '请输入有效的手机号' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!isInviteCodeValid.value) {
|
if (!isInviteCodeValid.value) {
|
||||||
showToast({ message: "请输入邀请码" });
|
showToast({ message: '请输入邀请码' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (verificationCode.value.length !== 6) {
|
if (verificationCode.value.length !== 6) {
|
||||||
showToast({ message: "请输入有效的验证码" });
|
showToast({ message: '请输入有效的验证码' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!isAgreed.value) {
|
if (!isAgreed.value) {
|
||||||
showToast({ message: "请先同意用户协议、隐私政策和代理管理协议" });
|
showToast({ message: '请先同意用户协议、隐私政策和代理管理协议' })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 直接执行注册逻辑
|
|
||||||
performRegister()
|
performRegister()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行实际的注册逻辑
|
// 执行实际的注册逻辑
|
||||||
async function performRegister() {
|
async function performRegister() {
|
||||||
try {
|
try {
|
||||||
// 先尝试通过邀请码注册(同时注册用户和代理)
|
|
||||||
const { data, error } = await registerByInviteCode({
|
const { data, error } = await registerByInviteCode({
|
||||||
mobile: phoneNumber.value,
|
mobile: phoneNumber.value,
|
||||||
code: verificationCode.value,
|
code: verificationCode.value,
|
||||||
@@ -166,16 +188,17 @@ async function performRegister() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
showToast({ message: "注册成功!" });
|
showToast({ message: '注册成功!' })
|
||||||
// 跳转到代理主页
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.location.href = '/'
|
window.location.href = '/'
|
||||||
}, 500)
|
}, 500)
|
||||||
|
} else {
|
||||||
|
showToast(data.value.msg || '注册失败,请重试')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('注册失败:', err)
|
console.error('注册失败:', err)
|
||||||
showToast({ message: "注册失败,请重试" });
|
showToast({ message: '注册失败,请重试' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,36 +213,34 @@ async function applyForAgentAsRegisteredUser() {
|
|||||||
|
|
||||||
if (data.value && !error.value) {
|
if (data.value && !error.value) {
|
||||||
if (data.value.code === 200) {
|
if (data.value.code === 200) {
|
||||||
// 保存token
|
|
||||||
localStorage.setItem('token', data.value.data.accessToken)
|
localStorage.setItem('token', data.value.data.accessToken)
|
||||||
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
|
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
|
||||||
localStorage.setItem('accessExpire', data.value.data.accessExpire)
|
localStorage.setItem('accessExpire', data.value.data.accessExpire)
|
||||||
|
|
||||||
showToast({ message: "申请成功!" });
|
showToast({ message: '申请成功!' })
|
||||||
// 跳转到代理主页
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.location.href = '/'
|
window.location.href = '/'
|
||||||
}, 500)
|
}, 500)
|
||||||
} else {
|
} else {
|
||||||
showToast(data.value.msg || "申请失败,请重试")
|
showToast(data.value.msg || '申请失败,请重试')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('申请失败:', err)
|
console.error('申请失败:', err)
|
||||||
showToast({ message: "申请失败,请重试" });
|
showToast({ message: '申请失败,请重试' })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function toUserAgreement() {
|
function toUserAgreement() {
|
||||||
router.push(`/userAgreement`)
|
router.push('/userAgreement')
|
||||||
}
|
}
|
||||||
|
|
||||||
function toPrivacyPolicy() {
|
function toPrivacyPolicy() {
|
||||||
router.push(`/privacyPolicy`)
|
router.push('/privacyPolicy')
|
||||||
}
|
}
|
||||||
|
|
||||||
function toAgentManageAgreement() {
|
function toAgentManageAgreement() {
|
||||||
router.push(`/agentManageAgreement`)
|
router.push('/agentManageAgreement')
|
||||||
}
|
}
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
@@ -309,6 +330,7 @@ const onClickLeft = () => {
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
/* 样式保持不变,和之前一样 */
|
||||||
.login-layout {
|
.login-layout {
|
||||||
background-image: url('@/assets/images/login_bg.png');
|
background-image: url('@/assets/images/login_bg.png');
|
||||||
background-position: center;
|
background-position: center;
|
||||||
@@ -319,7 +341,6 @@ const onClickLeft = () => {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 登录表单 */
|
|
||||||
.login-form {
|
.login-form {
|
||||||
background-color: var(--color-bg-primary);
|
background-color: var(--color-bg-primary);
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
@@ -328,7 +349,6 @@ const onClickLeft = () => {
|
|||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 表单项 */
|
|
||||||
.form-item {
|
.form-item {
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -337,7 +357,6 @@ const onClickLeft = () => {
|
|||||||
border-bottom: 1px solid var(--color-border-primary);
|
border-bottom: 1px solid var(--color-border-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 输入框和按钮组合 */
|
|
||||||
.input-with-btn {
|
.input-with-btn {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -374,7 +393,6 @@ const onClickLeft = () => {
|
|||||||
.form-input {
|
.form-input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0.875rem 0;
|
padding: 0.875rem 0;
|
||||||
|
|
||||||
font-size: 0.9375rem;
|
font-size: 0.9375rem;
|
||||||
color: var(--color-text-primary);
|
color: var(--color-text-primary);
|
||||||
outline: none;
|
outline: none;
|
||||||
@@ -395,7 +413,6 @@ const onClickLeft = () => {
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 验证码输入 */
|
|
||||||
.verification-input-wrapper {
|
.verification-input-wrapper {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -425,7 +442,6 @@ const onClickLeft = () => {
|
|||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 协议同意 */
|
|
||||||
.agreement-wrapper {
|
.agreement-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -450,7 +466,6 @@ const onClickLeft = () => {
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 提示文字 */
|
|
||||||
.notice-text {
|
.notice-text {
|
||||||
font-size: 0.6875rem;
|
font-size: 0.6875rem;
|
||||||
color: var(--color-text-tertiary);
|
color: var(--color-text-tertiary);
|
||||||
@@ -458,7 +473,6 @@ const onClickLeft = () => {
|
|||||||
margin-bottom: 2rem;
|
margin-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 登录按钮 */
|
|
||||||
.login-btn {
|
.login-btn {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0.875rem;
|
padding: 0.875rem;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<BaseReport v-if="queryState === 'success'" :order-id="orderId" :order-no="orderNo" :feature="feature"
|
<BaseReport v-if="queryState === 'success'" :order-id="orderId" :order-no="orderNo" :query-id="queryId"
|
||||||
:reportData="reportData" :reportParams="reportParams" :reportName="reportName" :reportDateTime="reportDateTime"
|
:feature="feature" :reportData="reportData" :reportParams="reportParams" :reportName="reportName"
|
||||||
:isEmpty="isEmpty" :isDone="isDone" :isExample="false" />
|
:reportDateTime="reportDateTime" :isEmpty="isEmpty" :isDone="isDone" :isExample="false" />
|
||||||
<div v-else-if="queryState === 'pending'" class="loading-container">
|
<div v-else-if="queryState === 'pending'" class="loading-container">
|
||||||
<div class="loading-spinner"></div>
|
<div class="loading-spinner"></div>
|
||||||
<p>报告生成中,请稍候...</p>
|
<p>报告生成中,请稍候...</p>
|
||||||
@@ -27,6 +27,7 @@ const isEmpty = ref(false);
|
|||||||
const isDone = ref(false);
|
const isDone = ref(false);
|
||||||
const orderId = ref(null);
|
const orderId = ref(null);
|
||||||
const orderNo = ref("");
|
const orderNo = ref("");
|
||||||
|
const queryId = ref("");
|
||||||
const queryState = ref("");
|
const queryState = ref("");
|
||||||
const pollingInterval = ref(null);
|
const pollingInterval = ref(null);
|
||||||
|
|
||||||
@@ -98,6 +99,9 @@ const getReport = async () => {
|
|||||||
queryState.value = decryptedData.query_state;
|
queryState.value = decryptedData.query_state;
|
||||||
if (queryState.value === "success") {
|
if (queryState.value === "success") {
|
||||||
feature.value = decryptedData.product || "";
|
feature.value = decryptedData.product || "";
|
||||||
|
// 查询记录 ID,供报告页模块下架使用
|
||||||
|
const rawId = decryptedData.id ?? decryptedData.query_id;
|
||||||
|
queryId.value = rawId != null ? String(rawId) : "";
|
||||||
|
|
||||||
const sortedQueryData = Array.isArray(decryptedData.query_data)
|
const sortedQueryData = Array.isArray(decryptedData.query_data)
|
||||||
? [...decryptedData.query_data].sort((a, b) => {
|
? [...decryptedData.query_data].sort((a, b) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user