Compare commits

..

4 Commits

Author SHA1 Message Date
70f0f98cf9 f 2026-03-02 14:32:58 +08:00
Mrx
ced2cd04db add seo 2026-02-28 16:10:29 +08:00
Mrx
2c97f724f5 f 2026-02-26 14:58:46 +08:00
Mrx
d6e460d7b6 add limit 2026-02-26 13:15:09 +08:00
38 changed files with 2620 additions and 220 deletions

6
.env
View File

@@ -19,4 +19,8 @@ VITE_CHAT_AES_IV=345GDFED433223DF
VITE_SHARE_TITLE=真爱查官网_婚姻状态核验_婚前背景互信平台
VITE_SHARE_DESC=提供个人信用评估、入职背调、信贷风控、企业风险监测等服务
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

View File

@@ -15,7 +15,7 @@ VITE_WECHAT_APP_ID=wx442ee1ac1ee75917
# 微信授权回调域名(必须与微信后台配置的授权回调域名一致)
# 例如https://www.zhenaicha.com 或 https://www.zhenaicha.com
# 如果不配置则使用当前访问的域名window.location.origin
VITE_WECHAT_REDIRECT_DOMAIN=https://www.zhinengcha.cn
VITE_WECHAT_REDIRECT_DOMAIN=https://www.zhenaicha.com
VITE_CHAT_AES_KEY=qw5w6SFE2D1jmxyd

View File

@@ -45,7 +45,7 @@
<!-- Open Graph / Facebook -->
<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
property="og:title"
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
@@ -59,7 +59,7 @@
<!-- Twitter -->
<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
property="twitter:title"
content="真爱查官网_婚姻状态核验_婚前背景互信平台"
@@ -83,11 +83,11 @@
"@context": "https://schema.org",
"@type": "WebSite",
"name": "真爱查",
"url": "https://www.zhinengcha.cn/",
"url": "https://www.zhenaicha.com/",
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
"potentialAction": {
"@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"
}
}
@@ -98,7 +98,7 @@
"@context": "https://schema.org",
"@type": "Organization",
"name": "真爱查",
"url": "https://www.zhinengcha.cn/",
"url": "https://www.zhenaicha.com/",
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
}
</script>
@@ -109,10 +109,19 @@
delete window.wx;
</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="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" />
<style>
@@ -207,6 +216,8 @@
<div class="loading-text">加载中</div>
</div>
<div id="app"></div>
<!-- 阿里云验证码挂载容器 -->
<div id="captcha-element"></div>
<script type="module" src="/src/main.js"></script>
</body>

View File

@@ -44,7 +44,7 @@ Disallow: /js/
Disallow: /css/
# 网站地图
Sitemap: https://www.zhinengcha.cn/sitemap.xml
Sitemap: https://www.zhenaicha.com/sitemap.xml
# 爬取延迟(毫秒)
Crawl-delay: 1

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@@ -1,67 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.zhinengcha.cn/</loc>
<loc>https://www.zhenaicha.com/</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/agent</loc>
<loc>https://www.zhenaicha.com/agent</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/help</loc>
<loc>https://www.zhenaicha.com/help</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/help/guide</loc>
<loc>https://www.zhenaicha.com/help/guide</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/example</loc>
<loc>https://www.zhenaicha.com/example</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/service</loc>
<loc>https://www.zhenaicha.com/service</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/privacyPolicy</loc>
<loc>https://www.zhenaicha.com/privacyPolicy</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/userAgreement</loc>
<loc>https://www.zhenaicha.com/userAgreement</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/agentManageAgreement</loc>
<loc>https://www.zhenaicha.com/agentManageAgreement</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/agentSerivceAgreement</loc>
<loc>https://www.zhenaicha.com/agentSerivceAgreement</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://www.zhinengcha.cn/authorization</loc>
<loc>https://www.zhenaicha.com/authorization</loc>
<lastmod>2025-08-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>

170
server/crawler-detector.js Normal file
View 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

View 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
View 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
View 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"
}
}

View 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

View File

@@ -87,9 +87,7 @@ const handleWeixinAuthCallback = async (code) => {
const tokenVersion = import.meta.env.VITE_TOKEN_VERSION || "1.1";
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 是否真的保存成功
const savedToken = localStorage.getItem("token");

View File

@@ -278,3 +278,67 @@ export function getInviteLink(params) {
const queryString = buildQueryString(params || {});
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();
}

View File

@@ -117,6 +117,7 @@ declare global {
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
const useAgent: typeof import('./composables/useAgent.js')['useAgent']
const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore']
const useAliyunCaptcha: typeof import('./composables/useAliyunCaptcha.js')['default']
const useAnimate: typeof import('@vueuse/core')['useAnimate']
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
const useAppStore: typeof import('./stores/appStore.js')['useAppStore']

View File

@@ -127,7 +127,9 @@ const router = useRouter();
const show = defineModel("show");
import { useCascaderAreaData } from "@vant/area-data";
import { showToast } from "vant"; // 引入 showToast 方法
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
const emit = defineEmits(); // 确保 emit 可以正确使用
const { runWithCaptcha } = useAliyunCaptcha();
const props = defineProps({
isSelf: {
type: Boolean,
@@ -173,20 +175,22 @@ const getSmsCode = async () => {
loadingSms.value = true;
const { data, error } = await useApiFetch("auth/sendSms")
.post({ mobile: form.value.mobile, actionType: "agentApply" })
.json();
loadingSms.value = false;
if (data.value && !error.value) {
if (data.value.code === 200) {
showToast({ message: "获取成功" });
startCountdown(); // 启动倒计时
} else {
showToast(data.value.msg);
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: form.value.mobile, actionType: "agentApply", captchaVerifyParam })
.json(),
(res) => {
loadingSms.value = false;
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown(); // 启动倒计时
} else {
showToast(res.msg);
}
}
}
);
};
let timer = null;

View File

@@ -3,12 +3,15 @@ import ShareReportButton from "./ShareReportButton.vue";
import TitleBanner from "./TitleBanner.vue";
import VerificationCard from "./VerificationCard.vue";
import StyledTabs from "./StyledTabs.vue";
import Payment from "./Payment.vue";
import { splitDWBG8B4DForTabs } from '@/ui/CDWBG8B4D/utils/simpleSplitter.js';
import { splitDWBG6A2CForTabs } from '@/ui/DWBG6A2C/utils/simpleSplitter.js';
import { splitJRZQ7F1AForTabs } from '@/ui/JRZQ7F1A/utils/simpleSplitter.js';
import { splitCJRZQ5E9FForTabs } from '@/ui/CJRZQ5E9F/utils/simpleSplitter.js';
import { splitCQYGL3F8EForTabs } from '@/ui/CQYGL3F8E/utils/simpleSplitter.js';
import { useAppStore } from "@/stores/appStore";
import { showFailToast } from "vant";
import { checkFeatureWhitelistStatus, offlineFeature, checkOrderAgent } from "@/api/agent";
// 动态导入产品背景图片的函数
const loadProductBackground = async (productType) => {
@@ -53,6 +56,11 @@ const props = defineProps({
type: String,
default: "",
},
queryId: {
type: String,
required: false,
default: "",
},
feature: {
type: String,
required: true,
@@ -98,8 +106,163 @@ const {
isEmpty,
isDone,
isExample,
orderId,
orderNo,
queryId,
} = 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 backgroundContainerRef = ref(null); // 背景容器的引用
@@ -153,8 +316,29 @@ onMounted(async () => {
// 监听窗口大小变化,重新计算高度
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 = () => {
if (resizeTimer) {
@@ -892,6 +1076,16 @@ const showPublicSecurityRecord = import.meta.env.VITE_SHOW_PUBLIC_SECURITY_RECOR
</component>
<LRemark v-if="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>
<ShareReportButton v-if="!isShare" class="h-12 text-3xl mt-8" :order-id="orderId"
:order-no="orderNo" :isExample="isExample" />
@@ -918,6 +1112,16 @@ const showPublicSecurityRecord = import.meta.env.VITE_SHOW_PUBLIC_SECURITY_RECOR
</StyledTabs>
</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 class="disclaimer">
<div class="flex flex-col items-center">

View File

@@ -7,6 +7,7 @@ import { useUserStore } from "@/stores/userStore";
import { showToast } from "vant";
import useApiFetch from "@/composables/useApiFetch";
import { registerByInviteCode } from "@/api/agent";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
const emit = defineEmits(['register-success'])
const router = useRouter();
@@ -14,6 +15,7 @@ const route = useRoute();
const dialogStore = useDialogStore();
const agentStore = useAgentStore();
const userStore = useUserStore();
const { runWithCaptcha } = useAliyunCaptcha();
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
const phoneNumber = ref("");
const verificationCode = ref("");
@@ -81,25 +83,29 @@ async function sendVerificationCode() {
return;
}
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) {
showToast({ message: "获取成功" });
startCountdown();
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('registerVerificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(data.value.msg);
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: phoneNumber.value, actionType, captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown();
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('registerVerificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(res.msg);
}
}
}
);
}
function startCountdown() {

View File

@@ -1,12 +1,19 @@
<script setup>
import { ref, computed, nextTick } from "vue";
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 router = useRouter();
const dialogStore = useDialogStore();
const agentStore = useAgentStore();
const userStore = useUserStore();
const { runWithCaptcha } = useAliyunCaptcha();
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
const phoneNumber = ref("");
const verificationCode = ref("");
@@ -37,25 +44,29 @@ async function sendVerificationCode() {
showToast({ message: "请输入有效的手机号" });
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) {
showToast({ message: "获取成功" });
startCountdown();
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('bindPhoneVerificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(data.value.msg);
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: phoneNumber.value, actionType: "bindMobile", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown();
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('bindPhoneVerificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(res.msg);
}
}
}
);
}
function startCountdown() {

View File

@@ -35,7 +35,8 @@
<input v-model="formData.mobile" id="mobile" type="tel" placeholder="请输入手机号"
class="flex-1 border-none outline-none" @click="handleInputClick" />
</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>
<input v-model="formData.verificationCode" id="verificationCode" placeholder="请输入验证码"
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 { useEnv } from "@/composables/useEnv";
import { showConfirmDialog } from "vant";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
import Payment from "@/components/Payment.vue";
import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue";
@@ -200,6 +202,7 @@ const dialogStore = useDialogStore();
const userStore = useUserStore();
const { isWeChat } = useEnv();
const appStore = useAppStore();
const { runWithCaptcha } = useAliyunCaptcha();
// 响应式数据
const showPayment = ref(false);
@@ -210,6 +213,14 @@ const trapezoidBgImage = ref('');
const isCountingDown = ref(false);
const countdown = ref(60);
// 不需要短信验证码的产品列表(使用拼图验证)
const noSmsCodeRequiredProducts = ['marriage'];
// 判断当前产品是否需要短信验证码
const needSmsCode = computed(() => {
return !noSmsCodeRequiredProducts.includes(props.feature);
});
// 使用传入的featureData或创建响应式引用
const featureData = computed(() => props.featureData || {});
@@ -349,34 +360,75 @@ function handleSubmit() {
formData.idCard,
(v) => isIdCardValid.value,
"请输入有效的身份证号码"
) ||
!validateField(
"verificationCode",
formData.verificationCode,
(v) => v,
"请输入验证码"
)
) {
return;
}
// 需要短信验证码的产品,校验验证码
if (needSmsCode.value && !formData.verificationCode) {
showToast({ message: "请输入验证码" });
return;
}
// 不需要登录也能查询,直接提交请求
// 如果是已登录用户在微信环境且未绑定手机号,提示绑定(但不强制)
if (isLoggedIn.value && !userStore.mobile && props.type !== 'promotion' && isWeChat.value) {
pendingPayment.value = true;
dialogStore.openBindPhone();
} 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 = {
name: formData.name,
id_card: formData.idCard,
mobile: formData.mobile,
code: formData.verificationCode
mobile: formData.mobile
};
// 需要短信验证码的产品,添加 code 字段
if (needSmsCode.value) {
req.code = formData.verificationCode;
}
// 不需要短信验证码的产品,添加拼图验证参数
if (captchaVerifyParam) {
req.captchaVerifyParam = captchaVerifyParam;
}
const reqStr = JSON.stringify(req);
const encodeData = aesEncrypt(
reqStr,
@@ -397,22 +449,7 @@ async function submitRequest() {
.post(requestData)
.json();
if (data.value.code === 200) {
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);
}
return { data: data.value, error };
}
async function sendVerificationCode() {
@@ -422,22 +459,27 @@ async function sendVerificationCode() {
return;
}
const { data, error } = await useApiFetch("/auth/sendSms")
.post({ mobile: formData.mobile, actionType: "query" })
.json();
if (!error.value && data.value.code === 200) {
showToast({ message: "验证码发送成功", type: "success" });
startCountdown();
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("/auth/sendSms")
.post({ mobile: formData.mobile, actionType: "query", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "验证码发送成功", type: "success" });
startCountdown();
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast({ message: res.msg || "验证码发送失败,请重试" });
}
});
} else {
showToast({ message: "验证码发送失败,请重试" });
}
}
);
}
let timer = null;

View File

@@ -6,11 +6,14 @@ import { useAgentStore } from "@/stores/agentStore";
import { useUserStore } from "@/stores/userStore";
import { showToast } from "vant";
import { realNameAuth } from "@/api/agent";
import useApiFetch from "@/composables/useApiFetch";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
const router = useRouter();
const dialogStore = useDialogStore();
const agentStore = useAgentStore();
const userStore = useUserStore();
const { runWithCaptcha } = useAliyunCaptcha();
// 表单数据
const realName = ref("");
const idCard = ref("");
@@ -59,18 +62,22 @@ async function sendVerificationCode() {
showToast({ message: "请输入有效的手机号" });
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) {
showToast({ message: "获取成功" });
startCountdown();
} else {
showToast(data.value.msg);
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: phoneNumber.value, actionType: "realName", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown();
} else {
showToast(res.msg);
}
}
}
);
}
function startCountdown() {

View 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;

View File

@@ -11,7 +11,7 @@ export function useSEO() {
"真爱查致力于维护婚姻家庭安全。提供基于合法公开数据的婚姻状态报告与综合风险检测。核心排查历史婚姻涉诉记录、失信记录及潜在情感隐患。拒绝盲目信任,一键生成婚恋状态评估,为爱护航。",
keywords:
"真爱查, 婚姻状态查询, 婚姻历史核验, 再婚背景调查, 情感风险评估, 婚恋互信工具",
url: "https://www.zhinengcha.cn",
url: "https://www.zhenaicha.com",
};
// 页面SEO配置
@@ -137,7 +137,7 @@ export function useSEO() {
mainEntity: {
"@type": "Organization",
name: "真爱查",
url: "https://www.zhinengcha.cn/",
url: "https://www.zhenaicha.com/",
description:
"专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
},
@@ -226,7 +226,7 @@ export function useSEO() {
updateSEO({
...config,
url: `https://www.zhinengcha.cn${currentPath}`,
url: `https://www.zhenaicha.com${currentPath}`,
});
};

View File

@@ -509,7 +509,7 @@ router.afterEach((to) => {
const seoConfig = {
title: `${to.meta.title} - 真爱查`,
description: `真爱查${to.meta.title}页面,提供专业的大数据风险管控服务。`,
url: `https://www.zhinengcha.cn${to.path}`,
url: `https://www.zhenaicha.com${to.path}`,
};
updateSEO(seoConfig);
}

View File

@@ -40,9 +40,9 @@ onMounted(async () => {
}
// 添加婚姻查询的特殊处理
if (feature.value === 'marriage') {
showMarriageUpgradeNotice();
}
// if (feature.value === 'marriage') {
// showMarriageUpgradeNotice();
// }
// 直接加载产品信息,不需要登录
await getProduct();

View File

@@ -6,11 +6,13 @@ import { useUserStore } from '@/stores/userStore'
import { useRouter, useRoute } from 'vue-router'
import { mobileCodeLogin } from '@/api/user'
import useApiFetch from '@/composables/useApiFetch'
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
const router = useRouter()
const route = useRoute()
const agentStore = useAgentStore()
const userStore = useUserStore()
const { runWithCaptcha } = useAliyunCaptcha()
const phoneNumber = ref('')
const verificationCode = ref('')
@@ -35,25 +37,32 @@ async function sendVerificationCode() {
return
}
const { data, error } = await useApiFetch('auth/sendSms')
.post({ mobile: phoneNumber.value, actionType: 'login' })
.json()
if (data.value && !error.value) {
if (data.value.code === 200) {
showToast({ message: "获取成功" });
startCountdown()
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(data.value.msg)
// 使用阿里云滑块验证码
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch('auth/sendSms')
.post({
mobile: phoneNumber.value,
actionType: 'login',
captchaVerifyParam
})
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown()
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
}
});
} else {
showToast(res.msg)
}
}
}
)
}
function startCountdown() {

View File

@@ -32,7 +32,7 @@ onMounted(() => {
title: '404 - 页面未找到 | 真爱查',
description: '抱歉,您访问的页面不存在。真爱查专业大数据风险管控平台,提供大数据风险报告查询、婚姻状况查询、个人信用评估等服务。',
keywords: '404, 页面未找到, 真爱查, 大数据风险管控',
url: 'https://www.zhinengcha.cn/404'
url: 'https://www.zhenaicha.com/404'
})
})
</script>

View File

@@ -31,19 +31,24 @@
<span class="text-gray-800">{{
paymentType === "agent_upgrade"
? "代理升级"
: "查询服务"
: paymentType === "whitelist"
? "模块下架"
: "查询服务"
}}</span>
</div>
</div>
<div v-if="paymentType === 'agent_upgrade'" class="text-center text-gray-600 mb-4">恭喜你升级代理等级成功享受更多权益
</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">
<van-button block type="primary" class="rounded-lg" @click="handleNavigation">
{{
paymentType === "agent_upgrade"
? "查看代理信息"
: "查看查询结果"
: paymentType === "whitelist"
? "返回报告"
: "查看查询结果"
}}
</van-button>
</div>
@@ -74,7 +79,9 @@
<span class="text-gray-800">{{
paymentType === "agent_upgrade"
? "代理升级"
: "查询服务"
: paymentType === "whitelist"
? "模块下架"
: "查询服务"
}}</span>
</div>
<div class="flex justify-between">
@@ -83,9 +90,9 @@
</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">
查看查询结果
{{ paymentType === "whitelist" ? "返回报告" : "查看查询结果" }}
</van-button>
</div>
@@ -137,7 +144,9 @@
<span class="text-gray-800">{{
paymentType === "agent_upgrade"
? "代理升级"
: "查询服务"
: paymentType === "whitelist"
? "模块下架"
: "查询服务"
}}</span>
</div>
<div class="flex justify-between">
@@ -316,9 +325,9 @@ const checkPaymentStatus = async () => {
if (paymentStatus.value !== newStatus) {
paymentStatus.value = newStatus;
// 对于查询类型,如果状态是已支付或已退款,直接跳转
// 对于查询或白名单类型,如果状态是已支付或已退款,直接跳转
if (
paymentType.value === "query" &&
(paymentType.value === "query" || paymentType.value === "whitelist") &&
(newStatus === "paid" || newStatus === "refunded")
) {
stopPolling();
@@ -410,12 +419,11 @@ onBeforeUnmount(() => {
// 处理导航逻辑
function handleNavigation() {
if (paymentType.value === "agent_upgrade") {
// 跳转到代理主页
router.replace("/agent");
agentStore.fetchAgentStatus();
userStore.fetchUserInfo();
} else {
// 跳转到查询结果页面
// 查询服务或白名单下架:跳转到报告页
router.replace({
path: "/report",
query: { orderNo: orderNo.value },

View File

@@ -6,12 +6,13 @@ import { useAgentStore } from '@/stores/agentStore'
import { useUserStore } from '@/stores/userStore'
import { useRoute, useRouter } from 'vue-router'
import useApiFetch from '@/composables/useApiFetch'
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
const router = useRouter()
const route = useRoute()
const agentStore = useAgentStore()
const userStore = useUserStore()
const appName = import.meta.env.VITE_APP_NAME || '真爱查';
const { runWithCaptcha } = useAliyunCaptcha()
const phoneNumber = ref('')
const verificationCode = ref('')
@@ -29,33 +30,31 @@ function fillInviteCode() {
// 从URL参数中读取邀请码并自动填入如果用户已登录且有手机号则自动填充
onMounted(async () => {
const inviteCodeParam = route.query.invite_code;
const inviteCodeParam = route.query.invite_code
if (inviteCodeParam) {
inviteCode.value = inviteCodeParam;
inviteCode.value = inviteCodeParam
}
// 从路由参数获取手机号(已注册用户继续注册成为代理的情况)
const mobileParam = route.query.mobile;
const mobileParam = route.query.mobile
if (mobileParam) {
phoneNumber.value = mobileParam;
isPhoneDisabled.value = true;
phoneNumber.value = mobileParam
isPhoneDisabled.value = true
} else {
// 如果用户已登录且有手机号,自动填充手机号
const token = localStorage.getItem("token");
const token = localStorage.getItem('token')
if (token) {
// 确保用户信息已加载
if (!userStore.mobile) {
await userStore.fetchUserInfo();
await userStore.fetchUserInfo()
}
if (userStore.mobile) {
phoneNumber.value = userStore.mobile;
isPhoneDisabled.value = true;
phoneNumber.value = userStore.mobile
isPhoneDisabled.value = true
}
}
}
});
})
// 是否是已注册用户(根据注册接口返回判断)
const isRegisteredUser = ref(false)
const isPhoneNumberValid = computed(() => {
@@ -73,35 +72,60 @@ const canRegister = computed(() => {
isAgreed.value
})
// 发送验证码(参考登录页逻辑,使用阿里云滑块验证码)
async function sendVerificationCode() {
if (isCountingDown.value || !isPhoneNumberValid.value) return
// 1. 基础校验
if (isCountingDown.value) return
if (!isPhoneNumberValid.value) {
showToast({ message: "请输入有效的手机号" });
showToast({ message: '请输入有效的手机号' })
return
}
if (!isInviteCodeValid.value) {
showToast({ message: "请先输入邀请码" });
showToast({ message: '请先输入邀请码' })
return
}
const { data, error } = await useApiFetch('auth/sendSms')
.post({ mobile: phoneNumber.value, actionType: 'agentApply' })
.json()
// 2. 使用阿里云滑块验证码发送短信
try {
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) {
showToast({ message: "获取成功" });
startCountdown()
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode');
if (verificationCodeInput) {
verificationCodeInput.focus();
// 第二个参数:滑块验证成功后,处理短信发送结果的回调
(res) => {
if (res.code === 200) {
showToast({ message: '验证码发送成功' })
startCountdown()
// 聚焦到验证码输入框
nextTick(() => {
const verificationCodeInput = document.getElementById('verificationCode')
if (verificationCodeInput) {
verificationCodeInput.focus()
}
})
return true // 告诉 runWithCaptcha 验证+发送成功
} else {
showToast({ message: res.msg || '验证码发送失败' })
return false // 告诉 runWithCaptcha 失败,不再继续
}
});
} else {
showToast(data.value.msg)
}
)
// 如果滑块验证或短信发送失败,直接返回
if (!result) {
return
}
} catch (error) {
console.error('发送验证码失败:', error)
showToast({ message: '发送验证码失败,请重试' })
}
}
@@ -120,29 +144,27 @@ function startCountdown() {
async function handleRegister() {
if (!isPhoneNumberValid.value) {
showToast({ message: "请输入有效的手机号" });
showToast({ message: '请输入有效的手机号' })
return
}
if (!isInviteCodeValid.value) {
showToast({ message: "请输入邀请码" });
showToast({ message: '请输入邀请码' })
return
}
if (verificationCode.value.length !== 6) {
showToast({ message: "请输入有效的验证码" });
showToast({ message: '请输入有效的验证码' })
return
}
if (!isAgreed.value) {
showToast({ message: "请先同意用户协议、隐私政策和代理管理协议" });
showToast({ message: '请先同意用户协议、隐私政策和代理管理协议' })
return
}
// 直接执行注册逻辑
performRegister()
}
// 执行实际的注册逻辑
async function performRegister() {
try {
// 先尝试通过邀请码注册(同时注册用户和代理)
const { data, error } = await registerByInviteCode({
mobile: phoneNumber.value,
code: verificationCode.value,
@@ -166,16 +188,17 @@ async function performRegister() {
})
}
showToast({ message: "注册成功!" });
// 跳转到代理主页
showToast({ message: '注册成功!' })
setTimeout(() => {
window.location.href = '/'
}, 500)
} else {
showToast(data.value.msg || '注册失败,请重试')
}
}
} catch (err) {
console.error('注册失败:', err)
showToast({ message: "注册失败,请重试" });
showToast({ message: '注册失败,请重试' })
}
}
@@ -190,36 +213,34 @@ async function applyForAgentAsRegisteredUser() {
if (data.value && !error.value) {
if (data.value.code === 200) {
// 保存token
localStorage.setItem('token', data.value.data.accessToken)
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
localStorage.setItem('accessExpire', data.value.data.accessExpire)
showToast({ message: "申请成功!" });
// 跳转到代理主页
showToast({ message: '申请成功!' })
setTimeout(() => {
window.location.href = '/'
}, 500)
} else {
showToast(data.value.msg || "申请失败,请重试")
showToast(data.value.msg || '申请失败,请重试')
}
}
} catch (err) {
console.error('申请失败:', err)
showToast({ message: "申请失败,请重试" });
showToast({ message: '申请失败,请重试' })
}
}
function toUserAgreement() {
router.push(`/userAgreement`)
router.push('/userAgreement')
}
function toPrivacyPolicy() {
router.push(`/privacyPolicy`)
router.push('/privacyPolicy')
}
function toAgentManageAgreement() {
router.push(`/agentManageAgreement`)
router.push('/agentManageAgreement')
}
onUnmounted(() => {
@@ -234,7 +255,7 @@ const onClickLeft = () => {
</script>
<template>
<div class="login-layout ">
<div class="login-layout">
<van-nav-bar fixed placeholder title="注册成为代理" left-text="" left-arrow @click-left="onClickLeft" />
<div class="login px-4 relative z-10">
<div class="mb-8 pt-20 text-left">
@@ -309,6 +330,7 @@ const onClickLeft = () => {
</template>
<style scoped>
/* 样式保持不变,和之前一样 */
.login-layout {
background-image: url('@/assets/images/login_bg.png');
background-position: center;
@@ -319,7 +341,6 @@ const onClickLeft = () => {
overflow: hidden;
}
/* 登录表单 */
.login-form {
background-color: var(--color-bg-primary);
padding: 2rem;
@@ -328,7 +349,6 @@ const onClickLeft = () => {
border-radius: 8px;
}
/* 表单项 */
.form-item {
margin-bottom: 1.5rem;
display: flex;
@@ -337,7 +357,6 @@ const onClickLeft = () => {
border-bottom: 1px solid var(--color-border-primary);
}
/* 输入框和按钮组合 */
.input-with-btn {
position: relative;
display: flex;
@@ -374,7 +393,6 @@ const onClickLeft = () => {
.form-input {
width: 100%;
padding: 0.875rem 0;
font-size: 0.9375rem;
color: var(--color-text-primary);
outline: none;
@@ -395,7 +413,6 @@ const onClickLeft = () => {
background-color: transparent;
}
/* 验证码输入 */
.verification-input-wrapper {
position: relative;
display: flex;
@@ -425,7 +442,6 @@ const onClickLeft = () => {
cursor: not-allowed;
}
/* 协议同意 */
.agreement-wrapper {
display: flex;
align-items: center;
@@ -450,7 +466,6 @@ const onClickLeft = () => {
text-decoration: none;
}
/* 提示文字 */
.notice-text {
font-size: 0.6875rem;
color: var(--color-text-tertiary);
@@ -458,7 +473,6 @@ const onClickLeft = () => {
margin-bottom: 2rem;
}
/* 登录按钮 */
.login-btn {
width: 100%;
padding: 0.875rem;
@@ -537,4 +551,4 @@ const onClickLeft = () => {
transform: translateX(-50%) scaleX(1.2);
}
}
</style>
</style>

View File

@@ -1,7 +1,7 @@
<template>
<BaseReport v-if="queryState === 'success'" :order-id="orderId" :order-no="orderNo" :feature="feature"
:reportData="reportData" :reportParams="reportParams" :reportName="reportName" :reportDateTime="reportDateTime"
:isEmpty="isEmpty" :isDone="isDone" :isExample="false" />
<BaseReport v-if="queryState === 'success'" :order-id="orderId" :order-no="orderNo" :query-id="queryId"
:feature="feature" :reportData="reportData" :reportParams="reportParams" :reportName="reportName"
:reportDateTime="reportDateTime" :isEmpty="isEmpty" :isDone="isDone" :isExample="false" />
<div v-else-if="queryState === 'pending'" class="loading-container">
<div class="loading-spinner"></div>
<p>报告生成中请稍候...</p>
@@ -27,6 +27,7 @@ const isEmpty = ref(false);
const isDone = ref(false);
const orderId = ref(null);
const orderNo = ref("");
const queryId = ref("");
const queryState = ref("");
const pollingInterval = ref(null);
@@ -98,6 +99,9 @@ const getReport = async () => {
queryState.value = decryptedData.query_state;
if (queryState.value === "success") {
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)
? [...decryptedData.query_data].sort((a, b) => {