Compare commits

..

8 Commits

Author SHA1 Message Date
Mrx
ca4052918f fclose 2026-03-21 12:05:37 +08:00
Mrx
75cda811e2 f 2026-03-01 18:05:18 +08:00
Mrx
b8defa47ab f 2026-02-28 15:43:14 +08:00
Mrx
b73de98a71 add 2026-02-27 10:29:40 +08:00
Mrx
2a7bde50db f 2026-02-14 17:21:19 +08:00
Mrx
72667b1fb0 up seo 2026-02-14 12:47:05 +08:00
Mrx
d181fd7da4 f 2026-02-04 15:19:10 +08:00
Mrx
ba924f1a95 add 2026-02-02 13:17:39 +08:00
42 changed files with 3706 additions and 256 deletions

View File

@@ -14,15 +14,15 @@
<!-- 基础SEO信息 -->
<title>
幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用
幸福查官网_家庭生活安全评估_个人履约与情感互信平台
</title>
<meta
name="description"
content="幸福查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。"
content="幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。"
/>
<meta
name="keywords"
content="大数据风险报告查询、大数据风险评估、大数据分析报告个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询"
content="幸福查,家庭风险评估,生活隐患排查,情感互信报告,个人履约评估,家庭财务分析"
/>
<meta name="author" content="幸福查" />
<meta name="robots" content="index, follow" />
@@ -32,15 +32,15 @@
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://www.xingfucha.cn/" />
<meta property="og:title" content="幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用" />
<meta property="og:description" content="幸福查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。" />
<meta property="og:title" content="幸福查官网_家庭生活安全评估_个人履约与情感互信平台" />
<meta property="og:description" content="幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。" />
<meta property="og:site_name" content="幸福查" />
<meta property="og:locale" content="zh_CN" />
<!-- Twitter -->
<meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://www.xingfucha.cn/" />
<meta property="twitter:title" content="幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用" />
<meta property="twitter:title" content="幸福查官网_家庭生活安全评估_个人履约与情感互信平台" />
<meta property="twitter:description" content="幸福查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。" />
<!-- 其他重要meta标签 -->
@@ -83,6 +83,12 @@
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.xingfucha.cn">
<link rel="preconnect" href="https://res.wx.qq.com">
@@ -181,6 +187,7 @@
<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

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/agent">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/agent">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "幸福查代理 - 免费开通代理权限 | 大数据风险报告代理",
"description": "幸福查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。",
"url": "https://www.xingfucha.cn/agent",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/agent';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/example">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/example">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "示例报告 - 幸福查报告展示 | 大数据风险报告样例",
"description": "幸福查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。",
"url": "https://www.xingfucha.cn/example",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/example';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/help/guide">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/help/guide">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "使用指南 - 幸福查操作教程 | 功能说明",
"description": "幸福查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。",
"url": "https://www.xingfucha.cn/help/guide",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/help/guide';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/help">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/help">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "幸福查帮助中心_合作伙伴操作指南_业务规则说明",
"description": "幸福查官方服务支持中心。提供全方位的平台使用指引,涵盖合作伙伴注册流程、业务权益说明、成本核算规则及数据系统操作教程。助您快速掌握平台功能,高效开展服务。",
"url": "https://www.xingfucha.cn/help",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/help';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn">
<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.xingfucha.cn">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "幸福查官网_家庭生活安全评估_个人履约与情感互信平台",
"description": "幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。",
"url": "https://www.xingfucha.cn",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn">点击这里</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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/inquire/backgroundcheck">
<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.xingfucha.cn/inquire/backgroundcheck">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/backgroundcheck">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "职业背景真实性核实_个人履约与职场信用分析_幸福查",
"description": "幸福查针对求职与用工场景,提供客观的职业背景参考。核实学历背景、职业履历一致性及潜在的竞业限制风险。降低职场信任成本,助力构建诚实守信的职业发展环境。",
"url": "https://www.xingfucha.cn/inquire/backgroundcheck",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/inquire/backgroundcheck">点击这里</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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/backgroundcheck';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/inquire/companyinfo">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/companyinfo">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "家庭经营性资产风险评估_企业工商信用透视_幸福查",
"description": "幸福查深度透视家庭经营实体的工商信用状况。评估维度覆盖企业行政处罚、司法被执行信息及经营异常名录。客观评估商业合作伙伴实力,有效规避家庭资产的连带责任风险与合同陷阱。",
"url": "https://www.xingfucha.cn/inquire/companyinfo",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/companyinfo';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/inquire/homeservice">
<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.xingfucha.cn/inquire/homeservice">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/homeservice">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "家政人员背景核验_家庭用工司法安全评估_幸福查",
"description": "幸福查专注家庭服务场景的安全用工工具。支持对保姆、月嫂及护工进行身份信息一致性核实与过往涉诉历史分析。科学识别服务人员的潜在风险标签,保障老人与儿童的居家生活安宁。",
"url": "https://www.xingfucha.cn/inquire/homeservice",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/inquire/homeservice">点击这里</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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/homeservice';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/inquire/marriage">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/marriage">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "婚前背景综合了解_涉婚风险筛查_情感互信报告_幸福查",
"description": "幸福查婚恋评估系统致力于维护家庭情感基石。深度评估对象的涉婚法律诉讼、失信被执行记录及社会不良标签。消除交往中的信息不对称,辅助构建透明、坦诚、安全的婚姻关系。",
"url": "https://www.xingfucha.cn/inquire/marriage",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/marriage';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/inquire/personalData">
<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.xingfucha.cn/inquire/personalData">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/personalData">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "个人生活信用健康度_家庭经济履约画像_综合风险分析_幸福查",
"description": "幸福查个人生活信用系统提供客观的健康指数分析。核心功能涵盖经济履约记录监测、生活消费稳定性预警及个人资质评分。通过多维数据排查潜在的信用盲点,辅助建立稳健的家庭财务档案。",
"url": "https://www.xingfucha.cn/inquire/personalData",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/inquire/personalData">点击这里</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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/personalData';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/inquire/preloanbackgroundcheck">
<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.xingfucha.cn/inquire/preloanbackgroundcheck">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/inquire/preloanbackgroundcheck">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "家庭财务健康度分析_个人经济履约压力检测_资金管理参考_幸福查",
"description": "幸福查基于大数据算法对个人近期经济行为进行多维分析。精准检测资金流转稳定性、履约历史详情及生活消费压力指数。辅助用户掌握自身财务状况,科学规划家庭资金收支平衡度,提升抗风险能力。",
"url": "https://www.xingfucha.cn/inquire/preloanbackgroundcheck",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/inquire/preloanbackgroundcheck">点击这里</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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/inquire/preloanbackgroundcheck';
// }, 2000);
</script>
</body>
</html>

View File

@@ -0,0 +1,120 @@
<!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.xingfucha.cn/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.xingfucha.cn/service">
<!-- Canonical URL -->
<link rel="canonical" href="https://www.xingfucha.cn/service">
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "客服中心 - 幸福查在线客服 | 技术支持",
"description": "幸福查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。",
"url": "https://www.xingfucha.cn/service",
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.xingfucha.cn/",
"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.xingfucha.cn/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>
<li>家政人员背景核验</li>
</ul>
</section>
<section>
<h2>为什么选择幸福查</h2>
<p>幸福查依托大数据技术,为用户提供准确、及时的风险评估报告,帮助您做出明智决策。</p>
</section>
</div>
<script>
// 可选自动跳转到SPA应用
// setTimeout(function() {
// window.location.href = 'https://www.xingfucha.cn/service';
// }, 2000);
</script>
</body>
</html>

View File

@@ -1,5 +1,5 @@
{
"name": "幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
"name": "幸福查官网_家庭生活安全评估_个人履约与情感互信平台",
"short_name": "天远数据",
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
"start_url": "/",

327
server/README-SEO.md Normal file
View File

@@ -0,0 +1,327 @@
# SPA SEO 优化解决方案
## 📋 方案概述
针对SPA应用SEO问题采用**爬虫检测 + 静态HTML回退**方案:
1. **爬虫检测**识别搜索引擎爬虫百度、Google、必应、搜狗等
2. **静态HTML**为爬虫提供预渲染的HTML模板包含完整的TDK信息
3. **正常用户**继续使用SPA应用体验不受影响
## 🏗️ 项目结构
```
server/
├── crawler-detector.js # 爬虫检测模块
├── middleware.js # SEO中间件Express/Koa
├── generate-seo-templates.js # SEO模板生成器
├── server-example-express.js # Express服务器示例
├── nginx-seo.conf # Nginx配置示例
└── README-SEO.md # 本文档
public/
└── seo-templates/ # SEO静态模板目录
├── index.html # 首页模板
├── agent.html # 代理页模板
├── help.html # 帮助中心模板
├── inquire-personalData.html # 个人查询模板
└── ... # 其他页面模板
```
## 🚀 快速开始
### 步骤1生成SEO模板
```bash
cd server
node generate-seo-templates.js
```
这会在 `public/seo-templates/` 目录下生成所有页面的静态HTML模板。
### 步骤2集成到你的服务器
#### 选项A使用Express服务器
```javascript
const express = require('express')
const SEOMiddleware = require('./server/middleware')
const app = express()
// 初始化SEO中间件
const seoMiddleware = new SEOMiddleware({
templateDir: path.join(__dirname, 'public/seo-templates'),
debug: true // 开发环境开启调试日志
})
// 应用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'))
})
```
#### 选项B使用Nginx
```bash
# 复制nginx配置文件
cp server/nginx-seo.conf /etc/nginx/sites-available/xingfucha
# 修改配置中的路径
nano /etc/nginx/sites-available/xingfucha
# 启用站点
ln -s /etc/nginx/sites-available/xingfucha /etc/nginx/sites-enabled/
# 重启Nginx
nginx -t && systemctl restart nginx
```
#### 选项C使用Koa
```javascript
const Koa = require('koa')
const serve = require('koa-static')
const SEOMiddleware = require('./server/middleware')
const app = new Koa()
// 应用SEO中间件
const seoMiddleware = new SEOMiddleware({
templateDir: path.join(__dirname, 'public/seo-templates'),
debug: true
})
app.use(seoMiddleware.koa())
// 静态文件服务
app.use(serve(path.join(__dirname, 'dist')))
app.listen(3000)
```
### 步骤3测试爬虫检测
```bash
# 模拟百度爬虫
curl -A "Baiduspider" http://localhost:3000/
# 模拟Google爬虫
curl -A "Googlebot/2.1" http://localhost:3000/
# 模拟普通用户
curl http://localhost:3000/
```
## 🔧 配置说明
### 爬虫检测器配置
`crawler-detector.js` 包含以下爬虫识别:
- **中文搜索引擎**百度、360、搜狗、必应、有道、搜搜、头条搜索
- **国际搜索引擎**Google、Bing、Yahoo
- **社交媒体爬虫**Facebook、Twitter、LinkedIn、WhatsApp等
你可以根据需要添加或修改爬虫模式:
```javascript
// 在crawler-detector.js中添加新的爬虫模式
this.crawlerPatterns.push('your-custom-bot')
```
### 路由到模板映射
`middleware.js` 中配置路由与模板的对应关系:
```javascript
this.routeTemplateMap = {
'/': 'index.html',
'/agent': 'agent.html',
// 添加新的路由映射
'/new-route': 'new-template.html'
}
```
### 模板生成配置
`generate-seo-templates.js` 中配置每个页面的SEO信息
```javascript
const pageSEOConfigs = {
'new-template.html': {
title: '页面标题',
description: '页面描述',
keywords: '关键词1,关键词2,关键词3',
url: 'https://www.xingfucha.cn/new-route'
}
}
```
## 📝 自定义模板
### 修改模板样式
编辑 `generate-seo-templates.js` 中的 `generateHTMLTemplate` 函数:
```javascript
function generateHTMLTemplate(config) {
return `<!DOCTYPE html>
<html>
<head>
<!-- 头部信息 -->
<style>
/* 自定义样式 */
body { ... }
</style>
</head>
<body>
<!-- 自定义内容 -->
</body>
</html>`
}
```
### 添加结构化数据
模板已包含基本的结构化数据JSON-LD格式如需扩展
```javascript
const structuredData = {
"@context": "https://schema.org",
"@type": "WebPage",
// 添加更多字段
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [...]
}
}
```
## 🧪 验证SEO效果
### 使用在线工具
1. **百度资源平台**https://ziyuan.baidu.com/
2. **Google Search Console**https://search.google.com/search-console
3. **必应网站管理员工具**https://www.bing.com/webmasters
### 使用命令行工具
```bash
# 查看网页源代码
curl -A "Baiduspider" http://www.xingfucha.cn/ | grep -o '<title>.*</title>'
# 检查meta标签
curl -A "Googlebot" http://www.xingfucha.cn/ | grep -E '<meta name="description"|<meta name="keywords"'
# 检查结构化数据
curl -A "Baiduspider" http://www.xingfucha.cn/ | grep -A 20 'application/ld+json'
```
## 📊 维护建议
### 定期更新爬虫列表
搜索引擎爬虫的User-Agent可能会更新建议定期检查并更新
- 百度https://ziyuan.baidu.com/spider/
- Googlehttps://support.google.com/webmasters/answer/1061943
### 保持模板内容同步
当页面内容更新时重新生成SEO模板
```bash
cd server
node generate-seo-templates.js
```
或者设置定时任务自动更新:
```bash
# 添加到crontab每小时更新一次
0 * * * * cd /path/to/xfc_webview_V2/server && node generate-seo-templates.js
```
### 监控爬虫访问
在服务器日志中监控爬虫访问情况:
```bash
# 查看百度爬虫访问
grep "Baiduspider" /var/log/nginx/access.log
# 查看Google爬虫访问
grep "Googlebot" /var/log/nginx/access.log
```
## 🐛 常见问题
### Q1: 爬虫访问的是SPA还是静态HTML
检查响应头:
```bash
curl -I -A "Baiduspider" http://www.xingfucha.cn/
```
如果看到 `X-SEOMiddleware: prerendered``X-SEOMiddleware: nginx-prerendered`说明返回的是静态HTML。
### Q2: 如何调试爬虫检测?
启用调试模式:
```javascript
const seoMiddleware = new SEOMiddleware({
templateDir: 'public/seo-templates',
debug: true // 查看详细日志
})
```
### Q3: 模板内容如何更新?
修改 `generate-seo-templates.js` 中的配置,然后重新运行:
```bash
node generate-seo-templates.js
```
### Q4: 如何处理动态内容?
静态模板只包含静态内容。如果需要包含动态数据,可以考虑:
1. **预渲染服务**:如 Prerender.io
2. **服务端渲染**:迁移到 Nuxt.js
3. **混合方案**:静态模板 + AJAX加载动态内容
### Q5: 爬虫列表是否会误判?
如果某个用户被误判为爬虫,可以:
1. 检查User-Agent是否包含爬虫关键词
2. 在检测器中添加白名单
3. 使用IP地址作为辅助判断
## 📚 参考资源
- [百度搜索蜘蛛协议](https://ziyuan.baidu.com/spider/)
- [Google 爬虫文档](https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers)
- [结构化数据规范](https://schema.org/)
- [Open Graph 协议](https://ogp.me/)
## 🆘 支持
如有问题,请检查:
1. 模板目录是否存在:`public/seo-templates/`
2. 模板文件是否生成:运行 `node generate-seo-templates.js`
3. 服务器配置是否正确检查中间件或Nginx配置
4. 爬虫User-Agent是否匹配查看检测器日志
## 📄 许可
本方案可自由使用和修改。

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,255 @@
/**
* SEO模板生成器
* 根据路由配置自动生成静态HTML模板
*/
const fs = require('fs')
const path = require('path')
// 页面SEO配置与useSEO.js保持一致
const pageSEOConfigs = {
'index.html': {
title: '幸福查官网_家庭生活安全评估_个人履约与情感互信平台',
description: '幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。',
keywords: '幸福查,家庭风险评估,生活隐患排查,情感互信报告,个人履约评估,家庭财务分析',
url: 'https://www.xingfucha.cn'
},
'agent.html': {
title: '幸福查代理 - 免费开通代理权限 | 大数据风险报告代理',
description: '幸福查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。',
keywords: '幸福查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益',
url: 'https://www.xingfucha.cn/agent'
},
'help.html': {
title: '幸福查帮助中心_合作伙伴操作指南_业务规则说明',
description: '幸福查官方服务支持中心。提供全方位的平台使用指引,涵盖合作伙伴注册流程、业务权益说明、成本核算规则及数据系统操作教程。助您快速掌握平台功能,高效开展服务。',
keywords: '幸福查使用教程,业务操作指南,合作伙伴权益,新手入门手册',
url: 'https://www.xingfucha.cn/help'
},
'help-guide.html': {
title: '使用指南 - 幸福查操作教程 | 功能说明',
description: '幸福查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。',
keywords: '使用指南, 操作教程, 功能说明, 快速上手, 幸福查教程',
url: 'https://www.xingfucha.cn/help/guide'
},
'example.html': {
title: '示例报告 - 幸福查报告展示 | 大数据风险报告样例',
description: '幸福查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。',
keywords: '示例报告, 报告展示, 报告样例, 大数据风险报告, 婚姻查询报告',
url: 'https://www.xingfucha.cn/example'
},
'service.html': {
title: '客服中心 - 幸福查在线客服 | 技术支持',
description: '幸福查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。',
keywords: '客服中心, 在线客服, 技术支持, 问题反馈, 幸福查客服',
url: 'https://www.xingfucha.cn/service'
},
'inquire-personalData.html': {
title: '个人生活信用健康度_家庭经济履约画像_综合风险分析_幸福查',
description: '幸福查个人生活信用系统提供客观的健康指数分析。核心功能涵盖经济履约记录监测、生活消费稳定性预警及个人资质评分。通过多维数据排查潜在的信用盲点,辅助建立稳健的家庭财务档案。',
keywords: '个人履约评价检测,家庭经济画像,履约能力分析,生活履约评分,风险自查报告',
url: 'https://www.xingfucha.cn/inquire/personalData'
},
'inquire-companyinfo.html': {
title: '家庭经营性资产风险评估_企业工商信用透视_幸福查',
description: '幸福查深度透视家庭经营实体的工商信用状况。评估维度覆盖企业行政处罚、司法被执行信息及经营异常名录。客观评估商业合作伙伴实力,有效规避家庭资产的连带责任风险与合同陷阱。',
keywords: '企业风险评估,工商信用分析,商业合作评估,经营异常筛查,老板背景核实',
url: 'https://www.xingfucha.cn/inquire/companyinfo'
},
'inquire-preloanbackgroundcheck.html': {
title: '家庭财务健康度分析_个人经济履约压力检测_资金管理参考_幸福查',
description: '幸福查基于大数据算法对个人近期经济行为进行多维分析。精准检测资金流转稳定性、履约历史详情及生活消费压力指数。辅助用户掌握自身财务状况,科学规划家庭资金收支平衡度,提升抗风险能力。',
keywords: '财务健康检测,经济压力分析,履约能力评估,财务稳健度分析,生活消费指数',
url: 'https://www.xingfucha.cn/inquire/preloanbackgroundcheck'
},
'inquire-marriage.html': {
title: '婚前背景综合了解_涉婚风险筛查_情感互信报告_幸福查',
description: '幸福查婚恋评估系统致力于维护家庭情感基石。深度评估对象的涉婚法律诉讼、失信被执行记录及社会不良标签。消除交往中的信息不对称,辅助构建透明、坦诚<E59DA6>、安全的婚姻关系。',
keywords: '婚前背景核验,涉婚司法记录,情感互信分析,家庭安全报告,婚恋诚意度',
url: 'https://www.xingfucha.cn/inquire/marriage'
},
'inquire-backgroundcheck.html': {
title: '职业背景真实性核实_个人履约与职场信用分析_幸福查',
description: '幸福查针对求职与用工场景,提供客观的职业背景参考。核实学历背景、职业履历一致性及潜在的竞业限制风险。降低职场信任成本,助力构建诚实守信的职业发展环境。',
keywords: '入职背景核实,职业诚信档案,简历信息比对,职场风险评估,个人履历分析',
url: 'https://www.xingfucha.cn/inquire/backgroundcheck'
},
'inquire-homeservice.html': {
title: '家政人员背景核验_家庭用工司法安全评估_幸福查',
description: '幸福查专注家庭服务场景的安全用工工具。支持对保姆、月嫂及护工进行身份信息一致性核实与过往涉诉历史分析。科学识别服务人员的潜在风险标签,保障老人与儿童的居家生活安宁。',
keywords: '家政背景核实,家庭用工安全,保姆司法筛查,家政履约记录,居家安全评估',
url: 'https://www.xingfucha.cn/inquire/homeservice'
}
}
/**
* 规范化文案移除损坏字符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.xingfucha.cn/",
"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>
<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()

176
server/middleware.js Normal file
View File

@@ -0,0 +1,176 @@
/**
* 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
// 路由到模板的映射
this.routeTemplateMap = {
'/': 'index.html',
'/agent': 'agent.html',
'/help': 'help.html',
'/help/guide': 'help-guide.html',
'/example': 'example.html',
'/service': 'service.html',
'/inquire/personalData': 'inquire-personalData.html',
'/inquire/companyinfo': 'inquire-companyinfo.html',
'/inquire/preloanbackgroundcheck': 'inquire-preloanbackgroundcheck.html',
'/inquire/marriage': 'inquire-marriage.html',
'/inquire/backgroundcheck': 'inquire-backgroundcheck.html',
'/inquire/homeservice': 'inquire-homeservice.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

View File

@@ -0,0 +1,30 @@
# ========== 在服务器上替换 SEO 的 location 用这一段 ==========
#
# 步骤:
# 1. 宝塔 → 网站 → 找到 www.xingfucha.cn → 设置 → 配置文件
# 2. 在配置文件里搜索__seo__ 或 seo-templates
# 3. 删掉旧的 SEO location 块改成下面「新写法」两段seo-templates 段 + location / 里的 if+rewrite
# 4. 保存 → SSH 执行 nginx -t && nginx -s reload
#
# ---------- 新写法(用 root不依赖 alias-----------
#
# 第一段:内部 location放在 location / 之前)
location /seo-templates/ {
internal;
add_header Content-Type "text/html; charset=utf-8";
add_header X-SEOMiddleware "nginx-prerendered";
}
# 第二段:在 location / 里必须有(爬虫时重写到上面)
location / {
if ($is_crawler = 1) {
rewrite ^ /seo-templates/$seo_file break;
}
try_files $uri $uri/ /index.html;
}
# 说明root 已在 server 里设为 /www/wwwroot/www.xingfucha.cn
# 请求 /seo-templates/index.html 会读文件 .../seo-templates/index.html
# ---------- 结束 ----------

View File

@@ -0,0 +1,148 @@
# 在原有配置基础上增加 SEO 爬虫检测,其余保持不变
# 部署时请将 public/seo-templates 整个目录上传到服务器:/www/wwwroot/www.xingfucha.cn/seo-templates
server
{
listen 80;
listen 443 ssl;
listen 443 quic;
listen [::]:443 ssl;
listen [::]:443 quic;
http2 on;
listen [::]:80;
server_name xingfucha.cn www.xingfucha.cn p.xingfucha.cn;
index index.html index.htm default.htm default.html;
root /www/wwwroot/www.xingfucha.cn;
# ========== SEO 爬虫检测与模板映射(请勿删除) ==========
set $is_crawler 0;
if ($http_user_agent ~* "baiduspider|baiduspider-mobile|baiduspider-image|baiduspider-video|baiduspider-news|baiduboxapp") {
set $is_crawler 1;
}
if ($http_user_agent ~* "googlebot|googlebot-image|googlebot-news|googlebot-mobile|googlebot-video|google-web-snippet") {
set $is_crawler 1;
}
if ($http_user_agent ~* "bingbot|msnbot") {
set $is_crawler 1;
}
if ($http_user_agent ~* "360spider|soha-agent|haosouspider") {
set $is_crawler 1;
}
if ($http_user_agent ~* "sogou spider|sogou news spider|sogou orion spider|sogou-blog") {
set $is_crawler 1;
}
if ($http_user_agent ~* "slurp|sosospider|sosoimagespider|youdaobot|yodaobot") {
set $is_crawler 1;
}
if ($http_user_agent ~* "bytedance-spider|toutiaospider") {
set $is_crawler 1;
}
if ($http_user_agent ~* "facebookexternalhit|facebookcatalog|twitterbot|linkedinbot|whatsapp|telegrambot|viber|line") {
set $is_crawler 1;
}
set $seo_file index.html;
if ($uri = '/') { set $seo_file index.html; }
if ($uri = '/agent') { set $seo_file agent.html; }
if ($uri = '/help') { set $seo_file help.html; }
if ($uri = '/help/guide') { set $seo_file help-guide.html; }
if ($uri = '/example') { set $seo_file example.html; }
if ($uri = '/service') { set $seo_file service.html; }
if ($uri = '/inquire/personalData') { set $seo_file inquire-personalData.html; }
if ($uri = '/inquire/companyinfo') { set $seo_file inquire-companyinfo.html; }
if ($uri = '/inquire/preloanbackgroundcheck') { set $seo_file inquire-preloanbackgroundcheck.html; }
if ($uri = '/inquire/marriage') { set $seo_file inquire-marriage.html; }
if ($uri = '/inquire/backgroundcheck') { set $seo_file inquire-backgroundcheck.html; }
if ($uri = '/inquire/homeservice') { set $seo_file inquire-homeservice.html; }
# ========== SEO 配置结束 ==========
#CERT-APPLY-CHECK--START
include /www/server/panel/vhost/nginx/well-known/www.xingfucha.cn.conf;
#CERT-APPLY-CHECK--END
#SSL-START
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/www.xingfucha.cn/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/www.xingfucha.cn/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#REWRITE-START
include /www/server/panel/vhost/rewrite/html_www.xingfucha.cn.conf;
#REWRITE-END
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
location ~ \.well-known{
allow all;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
# SEO爬虫访问时走 /seo-templates/ 内部路径,用 root 找文件(避免 alias 兼容问题)
location /seo-templates/ {
internal;
add_header Content-Type "text/html; charset=utf-8";
add_header X-SEOMiddleware "nginx-prerendered";
}
location / {
# 爬虫则返回对应 SEO 模板root 已是 /www/wwwroot/www.xingfucha.cn故文件为 .../seo-templates/index.html
if ($is_crawler = 1) {
rewrite ^ /seo-templates/$seo_file break;
}
try_files $uri $uri/ /index.html;
}
location /api/v1 {
proxy_pass http://127.0.0.1:23204;
proxy_set_header Host 127.0.0.1:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
proxy_set_header X-Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
access_log /www/wwwlogs/www.xingfucha.cn.log;
error_log /www/wwwlogs/www.xingfucha.cn.error.log;
}

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

@@ -0,0 +1,112 @@
/**
* 爬虫检测测试脚本
* 用于验证爬虫检测功能是否正常工作
*/
const CrawlerDetector = require('./crawler-detector')
const detector = new CrawlerDetector()
// 测试用例
const testCases = [
// 爬虫User-Agent
{ userAgent: 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', expected: true, description: '百度爬虫' },
{ userAgent: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)', expected: true, description: 'Google爬虫' },
{ userAgent: 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)', expected: true, description: '必应爬虫' },
{ userAgent: 'Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)', expected: true, description: '搜狗爬虫' },
{ userAgent: '360Spider', expected: true, description: '360爬虫' },
{ userAgent: 'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)', expected: true, description: 'Facebook爬虫' },
{ userAgent: 'Twitterbot/1.0', expected: true, description: 'Twitter爬虫' },
{ userAgent: 'LinkedInBot/1.0 (compatible; Mozilla/5.0; +https://www.linkedin.com/help/linkedin/answer/8665)', expected: true, description: 'LinkedIn爬虫' },
// 正常浏览器User-Agent
{ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', expected: false, description: 'Chrome浏览器' },
{ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0', expected: false, description: 'Firefox浏览器' },
{ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15', expected: false, description: 'Safari浏览器' },
{ userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1', expected: false, description: 'iPhone Safari' },
{ userAgent: 'Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36', expected: false, description: 'Android Chrome' },
{ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0', expected: false, description: 'Edge浏览器' },
// 边界情况
{ userAgent: '', expected: false, description: '空User-Agent' },
{ userAgent: 'Mozilla/5.0 (compatible; MyBot/1.0)', expected: true, description: '包含bot关键词' },
{ userAgent: 'Mozilla/5.0 (compatible; Spider/1.0)', expected: true, description: '包含spider关键词' },
{ userAgent: 'Mozilla/5.0 (compatible; Crawler/1.0)', expected: true, description: '包含crawler关键词' }
]
console.log('='.repeat(70))
console.log('爬虫检测测试')
console.log('='.repeat(70))
console.log()
let passed = 0
let failed = 0
testCases.forEach((testCase, index) => {
const req = {
headers: {
'user-agent': testCase.userAgent
}
}
const result = detector.isCrawler(req)
const success = result === testCase.expected
const status = success ? '✓ 通过' : '✗ 失败'
const crawlerType = result ? detector.getCrawlerType(testCase.userAgent) : 'N/A'
if (success) {
passed++
console.log(`${status} 测试 ${index + 1}: ${testCase.description}`)
} else {
failed++
console.error(`${status} 测试 ${index + 1}: ${testCase.description}`)
console.error(` User-Agent: ${testCase.userAgent.substring(0, 80)}...`)
console.error(` 预期: ${testCase.expected}, 实际: ${result}`)
}
if (result) {
console.log(` 识别为: ${crawlerType} 爬虫`)
}
})
console.log()
console.log('='.repeat(70))
console.log(`测试结果: ${passed} 通过, ${failed} 失败, 共 ${testCases.length} 个测试`)
console.log('='.repeat(70))
console.log()
// 测试爬虫类型识别
console.log('爬虫类型识别测试:')
console.log('-'.repeat(70))
const crawlerTypes = [
{ userAgent: 'Baiduspider', expected: 'baidu', description: '百度爬虫' },
{ userAgent: 'Googlebot', expected: 'google', description: 'Google爬虫' },
{ userAgent: 'bingbot', expected: 'bing', description: '必应爬虫' },
{ userAgent: '360spider', expected: '360', description: '360爬虫' },
{ userAgent: 'sogou spider', expected: 'sogou', description: '搜狗爬虫' },
{ userAgent: 'facebookexternalhit', expected: 'facebook', description: 'Facebook爬虫' },
{ userAgent: 'Twitterbot', expected: 'twitter', description: 'Twitter爬虫' },
{ userAgent: 'linkedinbot', expected: 'linkedin', description: 'LinkedIn爬虫' }
]
let typePassed = 0
crawlerTypes.forEach(test => {
const result = detector.getCrawlerType(test.userAgent)
const success = result === test.expected
if (success) {
typePassed++
console.log(`${test.description}: ${result}`)
} else {
console.error(`${test.description}: 预期 ${test.expected}, 实际 ${result}`)
}
})
console.log()
console.log('='.repeat(70))
console.log(`爬虫类型识别: ${typePassed}/${crawlerTypes.length} 正确`)
console.log('='.repeat(70))
// 退出码
process.exit(failed === 0 ? 0 : 1)

176
server/test-seo.js Normal file
View File

@@ -0,0 +1,176 @@
/**
* SEO 端到端检测脚本
* 模拟爬虫与普通用户请求,验证是否返回正确的页面
*
* 使用前请先启动服务器: npm run start
* 然后运行: npm run test 或 node test-seo.js
*/
const http = require('http')
const https = require('https')
const BASE_URL = process.env.SEO_TEST_URL || 'http://localhost:3000'
// 要检测的路由及期望的 SEO 标题关键词
const ROUTES = [
{ path: '/', titleKeyword: '幸福查官网' },
{ path: '/agent', titleKeyword: '幸福查代理' },
{ path: '/help', titleKeyword: '幸福查帮助中心' },
{ path: '/inquire/personalData', titleKeyword: '个人生活信用' }
]
function request(url, userAgent) {
return new Promise((resolve, reject) => {
const lib = url.startsWith('https') ? https : http
const req = lib.get(url, {
headers: { 'User-Agent': userAgent },
timeout: 10000
}, res => {
const chunks = []
res.on('data', chunk => chunks.push(chunk))
res.on('end', () => {
resolve({
statusCode: res.statusCode,
headers: res.headers,
body: Buffer.concat(chunks).toString('utf-8')
})
})
})
req.on('error', reject)
req.on('timeout', () => {
req.destroy()
reject(new Error('请求超时'))
})
})
}
function extractTitle(html) {
const match = html.match(/<title[^>]*>([^<]+)<\/title>/i)
return match ? match[1].trim() : null
}
function hasMetaDescription(html) {
return /<meta\s+name=["']description["']\s+content=["']/i.test(html)
}
function isSEOTemplate(html) {
return (
/<meta\s+name=["']description["']/i.test(html) &&
/<meta\s+name=["']keywords["']/i.test(html) &&
/<link\s+rel=["']canonical["']/i.test(html)
)
}
async function runTest(route, titleKeyword) {
const url = BASE_URL + route
const results = { route, crawler: null, normal: null }
// 1. 爬虫请求
try {
const crawlerRes = await request(url, 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)')
const title = extractTitle(crawlerRes.body)
const seoHeader = crawlerRes.headers['x-seomiddleware']
results.crawler = {
status: crawlerRes.statusCode,
title,
hasSEOMeta: hasMetaDescription(crawlerRes.body),
isSEOTemplate: isSEOTemplate(crawlerRes.body),
seoHeader: seoHeader || '(无)'
}
if (crawlerRes.statusCode !== 200) {
results.crawler.error = `HTTP ${crawlerRes.statusCode}`
} else if (!title || !title.includes(titleKeyword)) {
results.crawler.error = `标题不匹配,期望含「${titleKeyword}」,实际: ${title || '未找到'}`
} else if (!results.crawler.isSEOTemplate) {
results.crawler.error = '响应中缺少完整 SEO 标签description/keywords/canonical'
}
} catch (e) {
results.crawler = { error: e.message || String(e) }
}
// 2. 普通用户请求(仅验证能正常返回)
try {
const normalRes = await request(url, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')
results.normal = {
status: normalRes.statusCode,
bodyLength: normalRes.body.length
}
if (normalRes.statusCode !== 200) {
results.normal.error = `HTTP ${normalRes.statusCode}`
}
} catch (e) {
results.normal = { error: e.message || String(e) }
}
return results
}
function printResult(results) {
const { route, crawler, normal } = results
console.log(`\n📍 路由: ${route}`)
console.log('─'.repeat(60))
const crawlerOk = crawler && !crawler.error && crawler.status === 200 && crawler.isSEOTemplate
if (crawlerOk) {
console.log(' 爬虫请求: ✓ 通过')
console.log(` 标题: ${crawler.title}`)
console.log(` 响应头: X-SEOMiddleware = ${crawler.seoHeader}`)
} else {
console.log(' 爬虫请求: ✗ 未通过')
if (crawler && crawler.error) console.log(` 原因: ${crawler.error}`)
else if (crawler) console.log(` 状态: ${crawler.status}, 标题: ${crawler.title || '无'}`)
else console.log(' 请求失败')
}
const normalOk = normal && !normal.error && normal.status === 200
if (normalOk) {
console.log(' 普通用户: ✓ 正常 (SPA)')
} else {
console.log(' 普通用户: ✗ 异常')
if (normal && normal.error) console.log(` 原因: ${normal.error}`)
}
}
async function main() {
console.log('='.repeat(60))
console.log('SEO 端到端检测')
console.log('='.repeat(60))
console.log(`目标地址: ${BASE_URL}`)
console.log('若服务器未启动,请先执行: npm run start')
console.log('')
let allPass = true
for (const r of ROUTES) {
try {
const results = await runTest(r.path, r.titleKeyword)
printResult(results)
const crawlerOk = results.crawler && !results.crawler.error && results.crawler.isSEOTemplate
const normalOk = results.normal && !results.normal.error && results.normal.status === 200
if (!crawlerOk || !normalOk) allPass = false
} catch (e) {
console.log(`\n📍 路由: ${r.path}`)
console.log(' 错误:', e.message)
allPass = false
}
}
console.log('\n' + '='.repeat(60))
if (allPass) {
console.log('✓ 全部检测通过:爬虫获得 SEO 模板,普通用户获得 SPA')
} else {
console.log('✗ 部分检测未通过,请检查服务器与模板配置')
}
console.log('='.repeat(60))
process.exit(allPass ? 0 : 1)
}
main().catch(err => {
console.error('检测失败:', err)
process.exit(1)
})

191
server/如何检测.md Normal file
View File

@@ -0,0 +1,191 @@
# SEO 检测指南
## 一、本地快速检测
### 1. 只测爬虫识别逻辑(不启动服务)
```bash
cd server
node test-crawler-detection.js
```
会跑多组 User-Agent看是否把百度/Google 等识别为爬虫、普通浏览器识别为非爬虫。
### 2. 端到端检测(需先启动服务)
**步骤 1启动 SEO 服务器**
```bash
cd server
npm install
npm run start
```
**步骤 2另开一个终端运行检测**
```bash
cd server
npm run test
```
或指定地址:
```bash
# Windows PowerShell
$env:SEO_TEST_URL="http://localhost:3000"; node test-seo.js
# 若部署在线上,可测线上
$env:SEO_TEST_URL="https://www.xingfucha.cn"; node test-seo.js
```
脚本会:
-**百度爬虫 UA** 请求首页、代理页、帮助中心、个人查询等
- 检查响应里是否有:`<title>``<meta name="description">``<meta name="keywords">``<link rel="canonical">`
-**普通浏览器 UA** 再请求一遍,确认仍是 200SPA 正常)
全部通过即说明:爬虫拿到的是 SEO 模板,普通用户拿到的是 SPA。
---
## 二、用 curl 手动检测
在服务器已启动的前提下,在终端执行:
### 爬虫应拿到“带 TDK 的 HTML”
```bash
# 模拟百度爬虫请求首页
curl -s -A "Baiduspider/2.0" http://localhost:3000/ | findstr /i "title description keywords canonical"
```
应能看到包含「幸福查」的 title以及 description、keywords、canonical 等标签。
```bash
# 看完整 HTML 前几行(含 <head>
curl -s -A "Baiduspider/2.0" http://localhost:3000/ | more
```
### 普通用户应拿到 SPA一般是带 script 的 index.html
```bash
# 不带爬虫 UA相当于普通浏览器
curl -s http://localhost:3000/ | findstr /i "script root app"
```
通常会有 `id="app"` 或大量 `<script>`,说明是前端 SPA。
### 看响应头(若用了 Node 中间件)
```bash
curl -I -A "Baiduspider/2.0" http://localhost:3000/
```
若返回里有 `X-SEOMiddleware: prerendered`,说明走的是 SEO 中间件、返回的是预渲染 HTML。
---
## 三、用浏览器“伪装”爬虫(可选)
1. 打开 Chrome DevTools (F12) → Network。
2. 右键列表头 → 勾选 “User-Agent”或先在 More tools 里加自定义请求头)。
3. 使用扩展(如 “User-Agent Switcher”把 UA 改成:
- `Baiduspider/2.0`
4. 刷新页面,在 Elements 里看 `<head>`
- 应看到正确的 `<title>``<meta name="description">``<meta name="keywords">` 等。
注意:若前端是 SPA同一 URL 在浏览器里仍可能先加载 SPA 再改 title用 curl 用爬虫 UA 请求,更能代表爬虫真实看到的内容。
---
## 四、线上/生产环境检测
### 1. 用本机脚本测线上
```bash
cd server
$env:SEO_TEST_URL="https://www.xingfucha.cn"; node test-seo.js
```
Linux/Mac 用 `export SEO_TEST_URL=https://www.xingfucha.cn` 再运行 `node test-seo.js`。)
### 2. 用 curl 测线上
```bash
curl -s -A "Baiduspider/2.0" https://www.xingfucha.cn/ | findstr /i "title description"
curl -I -A "Baiduspider/2.0" https://www.xingfucha.cn/
```
### 3. 使用搜索引擎工具
- **百度** [百度搜索资源平台](https://ziyuan.baidu.com/) → 抓取诊断 / 抓取频次,看抓取是否成功。
- **Google** [Google Search Console](https://search.google.com/search-console) → URL 检查,输入首页或内页 URL查看“已编入索引”的页面快照。
---
## 五、检测结果对照
| 检测项 | 预期结果 |
|------------------|----------|
| 爬虫 UA 请求 | 返回 200HTML 内含完整 title、description、keywords、canonical |
| 爬虫响应头 | 若用 Node 中间件,有 `X-SEOMiddleware: prerendered` |
| 普通浏览器请求 | 返回 200为 SPA 的 index.html#app 或大量 script |
| test-crawler-detection.js | 全部用例通过 |
| test-seo.js | 全部路由“爬虫拿到 SEO 模板 + 普通用户正常” |
若某一项不符合,按下面排查:
- **爬虫也拿到 SPA**:检查 Nginx/Node 里爬虫判断和 SEO 模板路径、路由映射是否正确。
- **普通用户报错或空白**:检查 SPA 静态资源和 fallback 的 index.html 是否正常。
- **标题/描述不对**:检查 `public/seo-templates/` 下对应模板是否已重新生成(`node generate-seo-templates.cjs`)。
---
## 六、爬虫请求返回 404 时排查
当执行 `curl -s -A "Baiduspider/2.0" https://www.xingfucha.cn/` 得到 **404 Not Found** 时,按下面顺序在**服务器上**检查。
### 1. 确认已接入 SEO 配置
- 若你**还没**在宝塔里替换/合并过 `server/nginx-www.xingfucha.cn.conf` 里的 SEO 相关配置,爬虫仍会走原来的 `location /`,不会返回 SEO 模板。
- **操作**:在宝塔 → 网站 → www.xingfucha.cn → 配置文件,确认存在:
- 上面的 `set $is_crawler``set $seo_file` 以及一堆 `if ($http_user_agent ...)``if ($uri = '/') ...`
- `location ~ ^/__seo__/(.+)$ { ... internal; }`
-`location /` 里有 `if ($is_crawler = 1) { rewrite ^ /__seo__/$seo_file break; }`
- 修改后执行 `nginx -t`,再重载 Nginx。
### 2. 确认 SEO 模板目录和文件存在
404 常见原因是 Nginx 去读 SEO 模板时路径不对或文件不存在。
在**服务器**上执行(路径按你实际部署的来,一般为宝塔默认):
```bash
# Linux 服务器上
ls -la /www/wwwroot/www.xingfucha.cn/seo-templates/
cat /www/wwwroot/www.xingfucha.cn/seo-templates/index.html | head -5
```
-`seo-templates` 不存在或没有 `index.html`,需要把本地的 `public/seo-templates/` 整个目录上传到服务器的 `/www/wwwroot/www.xingfucha.cn/seo-templates/`(与配置里的 `alias` 路径一致)。
- 若目录名或路径和 Nginx 里 `alias` 不一致(例如多写了 `public` 或少了一层目录),改成与配置一致或改配置里的 `alias`
### 3. 看 Nginx 错误日志
在服务器上:
```bash
tail -20 /www/wwwlogs/www.xingfucha.cn.error.log
```
再发一次爬虫请求,看是否有 `open() ".../seo-templates/xxx.html" failed (2: No such file or directory)` 之类,根据路径修正目录或配置。
### 4. 快速对照
| 现象 | 可能原因 | 处理 |
|------|----------|------|
| 爬虫返回 404 | 未接入 SEO 配置 | 按 1 合并/替换 Nginx 配置并重载 |
| 爬虫返回 404 | 模板目录或文件不存在 | 按 2 上传/创建 `seo-templates` 并保证有 `index.html` |
| 爬虫返回 404 | alias 路径错误 | 对照 error.log 修正 `alias` 或目录结构 |
| 爬虫返回 200 但仍是 SPA | 爬虫未命中 SEO 逻辑 | 检查 `$is_crawler``$seo_file``rewrite` 是否生效 |
按上述步骤即可完成从本地到线上的 SEO 检测。

View File

@@ -0,0 +1,57 @@
# 宝塔环境 Nginx SEO 配置说明
## 1. 已生成的配置文件
- **`server/nginx-www.xingfucha.cn.conf`**:在你这套站点上的完整 server 配置(已含 SEO 爬虫检测与静态模板),可直接对照或替换。
## 2. 部署前准备:上传 SEO 模板
在服务器上要有 SEO 静态 HTML 目录,路径必须为:
```text
/www/wwwroot/www.xingfucha.cn/seo-templates/
```
操作步骤:
1. 本地在项目里生成模板(若未生成过):
```bash
cd server
npm run generate
```
2. 将本地的 **`xfc_webview_V2/public/seo-templates/`** 整个目录上传到服务器,并放到:
```text
/www/wwwroot/www.xingfucha.cn/seo-templates/
```
即该目录下应有:`index.html`、`agent.html`、`help.html`、`help-guide.html`、`example.html`、`service.html`、`inquire-*.html` 等。
## 3. 在宝塔里修改 Nginx 配置
1. 登录宝塔面板 → **网站** → 找到 **www.xingfucha.cn** → **设置** → **配置文件**(或 **Nginx 配置**)。
2. 用下面两种方式之一应用 SEO 修改:
- **方式 A推荐**:打开 **`server/nginx-www.xingfucha.cn.conf`**,复制其中从 `# ========== SEO 爬虫检测` 到 `# ========== SEO 配置结束` 的整段,以及 **`location ~ ^/__seo__/`** 和 **`location /`** 两个块,按注释位置合并进你当前的 server 配置(保留你原有的 SSL、include、api、日志等
- **方式 B**:若你当前配置与示例几乎一致,可直接用 **`nginx-www.xingfucha.cn.conf`** 的**整个 server 块**替换当前站点的 server 块(注意先备份原配置)。
3. 保存后,在宝塔里 **重载 Nginx**(或命令行执行 `nginx -t && nginx -s reload`)。
## 4. 配置要点说明
- **爬虫判断**:根据 `User-Agent` 识别百度、Google、必应、360、搜狗、头条、社交媒体等爬虫识别为爬虫时走 SEO 逻辑。
- **路由与模板**`$uri` 与 `$seo_file` 的对应关系在配置里已写好(如 `/`→index.html`/agent`→agent.html`/help`→help.html 等),与 `public/seo-templates` 下文件名一致。
- **内部 location**`/__seo__/` 仅用于内部 `rewrite`,不对外暴露,爬虫看到的仍是正常 URL只是响应内容来自 `seo-templates` 下的静态 HTML。
## 5. 验证
在服务器或本机执行:
```bash
# 应返回带完整 title/description 的 HTML且响应头有 X-SEOMiddleware
curl -sI -A "Baiduspider/2.0" https://www.xingfucha.cn/
curl -s -A "Baiduspider/2.0" https://www.xingfucha.cn/ | grep -o '<title>.*</title>'
```
若看到正确的标题和 `X-SEOMiddleware: nginx-prerendered`,说明 SEO 已生效。
**若验证时得到 404**:说明爬虫未命中 SEO 模板,请按 **`server/如何检测.md`** 里的 **「六、爬虫请求返回 404 时排查」** 在服务器上逐项检查(是否已接入 SEO 配置、`seo-templates` 目录与文件是否存在、alias 路径与 error 日志)。
更多检测方式见:**`server/如何检测.md`**。

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 useArrayDifference: typeof import('@vueuse/core')['useArrayDifference']

View File

@@ -121,8 +121,11 @@
const router = useRouter();
const show = defineModel("show");
import { useCascaderAreaData } from "@vant/area-data";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
import { showToast } from "vant"; // 引入 showToast 方法
const emit = defineEmits(); // 确保 emit 可以正确使用
const { runWithCaptcha } = useAliyunCaptcha();
const props = defineProps({
ancestor: {
type: String,
@@ -169,22 +172,20 @@ const getSmsCode = async () => {
return;
}
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) {
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: form.value.mobile, actionType: "agentApply", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown(); // 启动倒计时
startCountdown();
} else {
showToast(data.value.msg);
showToast(res.msg || "获取失败,请重试");
}
}
);
};
let timer = null;

View File

@@ -372,10 +372,10 @@ const featureMap = {
name: "逾期风险综述",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")),
},
// DWBG8B4D_CourtInfo: {
// name: "法院曝光台信息",
// component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")),
// },
DWBG8B4D_CourtInfo: {
name: "法院曝光台信息",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")),
},
DWBG8B4D_LoanEvaluation: {
name: "借贷评估",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")),
@@ -461,10 +461,10 @@ const featureMap = {
name: "关联风险监督",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
},
// DWBG6A2C_CourtRiskInfo: {
// name: "法院风险信息",
// component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
// },
DWBG6A2C_CourtRiskInfo: {
name: "法院风险信息",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
},
// 贷款风险报告
JRZQ5E9F: {
name: "贷款风险评估",
@@ -607,6 +607,7 @@ const featureRiskLevels = {
'DWBG8B4D_LeasingRisk': 6,
'DWBG8B4D_RiskSupervision': 8,
'DWBG8B4D_RiskWarningTab': 9,
'DWBG8B4D_CourtInfo':9,
// 司南报告子模块
'DWBG6A2C_StandLiveInfo': 4,
@@ -621,6 +622,7 @@ const featureRiskLevels = {
'DWBG6A2C_CreditDetail': 5,
'DWBG6A2C_RentalBehavior': 5,
'DWBG6A2C_RiskSupervision': 8,
'DWBG6A2C_CourtRiskInfo':13,
// 贷款风险评估子模块
'CJRZQ5E9F_RiskOverview': 8,

View File

@@ -1,12 +1,15 @@
<script setup>
import { ref, computed, nextTick } from "vue";
import { useDialogStore } from "@/stores/dialogStore";
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 phoneNumber = ref("");
const verificationCode = ref("");
const isCountingDown = ref(false);
@@ -36,12 +39,14 @@ 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) {
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: phoneNumber.value, actionType: "bindMobile", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown();
// 聚焦到验证码输入框
@@ -52,9 +57,10 @@ async function sendVerificationCode() {
}
});
} else {
showToast(data.value.msg);
showToast(res.msg || "获取失败,请重试");
}
}
);
}
function startCountdown() {

View File

@@ -35,7 +35,7 @@
<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="needVerificationCode" 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" />
@@ -282,8 +282,11 @@ import { useRoute, useRouter } from "vue-router";
import { useUserStore } from "@/stores/userStore";
import { useDialogStore } from "@/stores/dialogStore";
import { useEnv } from "@/composables/useEnv";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
import { showConfirmDialog } from "vant";
const { runWithCaptcha } = useAliyunCaptcha();
import Payment from "@/components/Payment.vue";
import BindPhoneDialog from "@/components/BindPhoneDialog.vue";
import LoginDialog from "@/components/LoginDialog.vue";
@@ -382,6 +385,11 @@ const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(formData.idCard));
const isLoggedIn = computed(() => userStore.isLoggedIn);
// 是否需要短信验证码marriage 产品使用拼图验证,不需要短信验证码)
const needVerificationCode = computed(() => {
return props.feature !== 'marriage';
});
const buttonText = computed(() => {
return isLoggedIn.value ? '立即查询' : '前往登录';
});
@@ -502,17 +510,25 @@ const isHasInput = (input) => {
function handleBindSuccess() {
if (pendingPayment.value) {
pendingPayment.value = false;
if (!needVerificationCode.value) {
submitRequestWithCaptcha();
} else {
submitRequest();
}
}
}
// 处理登录成功的回调
function handleLoginSuccess() {
if (pendingPayment.value) {
pendingPayment.value = false;
if (!needVerificationCode.value) {
submitRequestWithCaptcha();
} else {
submitRequest();
}
}
}
// 处理输入框点击事件
const handleInputClick = async () => {
@@ -552,6 +568,7 @@ function handleSubmit() {
return;
}
// 基本字段验证
if (
!validateField("name", formData.name, (v) => v, "请输入姓名") ||
!validateField(
@@ -565,25 +582,85 @@ function handleSubmit() {
formData.idCard,
(v) => isIdCardValid.value,
"请输入有效的身份证号码"
) ||
!validateField(
)
) {
return;
}
// 短信验证码验证(仅非 marriage 产品需要)
if (needVerificationCode.value) {
if (!validateField(
"verificationCode",
formData.verificationCode,
(v) => v,
"请输入验证码"
)
) {
)) {
return;
}
}
// 检查是否需要绑定手机号
if (!userStore.mobile) {
pendingPayment.value = true;
dialogStore.openBindPhone();
} else {
// marriage 产品使用拼图验证
if (!needVerificationCode.value) {
submitRequestWithCaptcha();
} else {
submitRequest();
}
}
}
function getQueryApiUrl() {
if (props.type === 'promotion') {
return `/query/service_agent/${props.feature}`;
}
return `/query/service/${props.feature}`;
}
function buildQueryRequestData(payload) {
const reqStr = JSON.stringify(payload);
const encodeData = aesEncrypt(reqStr, "ff83609b2b24fc73196aac3d3dfb874f");
const requestData = { data: encodeData };
if (props.type === 'promotion') {
requestData.agent_identifier = props.linkIdentifier;
}
return requestData;
}
function onQuerySuccess(res) {
if (res?.code === 200 && res?.data) {
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);
}
showPayment.value = true;
emit('submit-success', res.data);
}
}
// 不需要短信验证码的产品:点击查询时先弹出拼图验证,通过后携带 captcha_verify_param 请求
function submitRequestWithCaptcha() {
const apiUrl = getQueryApiUrl();
runWithCaptcha(
(captchaVerifyParam) => {
const payload = {
name: formData.name,
id_card: formData.idCard,
mobile: formData.mobile,
captcha_verify_param: captchaVerifyParam
};
return useApiFetch(apiUrl).post(buildQueryRequestData(payload)).json();
},
(res) => {
onQuerySuccess(res);
}
);
}
async function submitRequest() {
const req = {
@@ -592,37 +669,18 @@ async function submitRequest() {
mobile: formData.mobile,
code: formData.verificationCode
};
const reqStr = JSON.stringify(req);
const encodeData = aesEncrypt(reqStr, "ff83609b2b24fc73196aac3d3dfb874f");
let apiUrl = '';
let requestData = { data: encodeData };
if (props.type === 'promotion') {
apiUrl = `/query/service_agent/${props.feature}`;
requestData.agent_identifier = props.linkIdentifier;
} else {
apiUrl = `/query/service/${props.feature}`;
}
const requestData = buildQueryRequestData(req);
const apiUrl = getQueryApiUrl();
const { data, error } = await useApiFetch(apiUrl)
.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);
if (data.value?.code === 200) {
onQuerySuccess(data.value);
}
}
showPayment.value = true;
emit('submit-success', data.value.data);
}
}
async function sendVerificationCode() {
if (isCountingDown.value || !isPhoneNumberValid.value) return;
@@ -631,11 +689,13 @@ 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) {
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("/auth/sendSms")
.post({ mobile: formData.mobile, actionType: "query", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "验证码发送成功", type: "success" });
startCountdown();
nextTick(() => {
@@ -645,9 +705,11 @@ async function sendVerificationCode() {
}
});
} else {
showToast({ message: "验证码发送失败,请重试" });
showToast({ message: res.msg || "验证码发送失败,请重试" });
}
}
);
}
let timer = null;

View File

@@ -2,7 +2,7 @@
<script setup>
import { ref, computed, nextTick } from 'vue'
import { showToast } from 'vant'
import ClickCaptcha from '@/components/ClickCaptcha.vue'
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha"
import { useDialogStore } from '@/stores/dialogStore'
import { useUserStore } from '@/stores/userStore'
@@ -10,6 +10,8 @@ const emit = defineEmits(['login-success'])
const dialogStore = useDialogStore()
const userStore = useUserStore()
const { runWithCaptcha } = useAliyunCaptcha()
const phoneNumber = ref('')
const verificationCode = ref('')
const password = ref('')
@@ -19,10 +21,6 @@ const isCountingDown = ref(false)
const countdown = ref(60)
let timer = null
// 验证组件状态
const showCaptcha = ref(false)
const captchaVerified = ref(false)
// 聚焦状态变量
const phoneFocused = ref(false)
const codeFocused = ref(false)
@@ -47,12 +45,14 @@ async function sendVerificationCode() {
showToast({ message: "请输入有效的手机号" });
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) {
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch('auth/sendSms')
.post({ mobile: phoneNumber.value, actionType: 'login', captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown()
// 聚焦到验证码输入框
@@ -63,9 +63,10 @@ async function sendVerificationCode() {
}
});
} else {
showToast(data.value.msg)
showToast(res.msg || "获取失败,请重试")
}
}
);
}
function startCountdown() {
@@ -101,23 +102,10 @@ async function handleLogin() {
showToast({ message: "请先同意用户协议" });
return
}
// 显示验证组件
showCaptcha.value = true
}
// 验证成功回调
function handleCaptchaSuccess() {
captchaVerified.value = true
showCaptcha.value = false
// 执行实际的登录逻辑
// 直接执行登录逻辑,登录时不做图形校验
performLogin()
}
// 验证关闭回调
function handleCaptchaClose() {
showCaptcha.value = false
}
// 执行实际的登录逻辑
async function performLogin() {
const { data, error } = await useApiFetch('/user/mobileCodeLogin')
@@ -260,9 +248,6 @@ function toPrivacyPolicy() {
</div>
</div>
</van-popup>
<!-- 点击验证组件 -->
<ClickCaptcha :visible="showCaptcha" @success="handleCaptchaSuccess" @close="handleCaptchaClose" />
</template>
<style scoped>

View File

@@ -289,7 +289,7 @@ const shareToFriend = () => {
? "扫码查看幸福查推广信息"
: "扫码申请幸福查代理权限",
link: shareUrl,
imgUrl: "https://www.www.xingfucha.cn/logo.jpg"
imgUrl: "https://www.xingfucha.cn/logo.jpg"
};
configWeixinShare(shareConfig);

View File

@@ -1,10 +1,13 @@
<script setup>
import { ref, computed } from "vue";
import { useDialogStore } from "@/stores/dialogStore";
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
const router = useRouter();
const dialogStore = useDialogStore();
const agentStore = useAgentStore();
const userStore = useUserStore();
const { runWithCaptcha } = useAliyunCaptcha();
import { showToast } from "vant";
// 表单数据
const realName = ref("");
@@ -54,18 +57,21 @@ 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) {
runWithCaptcha(
(captchaVerifyParam) =>
useApiFetch("auth/sendSms")
.post({ mobile: phoneNumber.value, actionType: "realName", captchaVerifyParam })
.json(),
(res) => {
if (res.code === 200) {
showToast({ message: "获取成功" });
startCountdown();
} else {
showToast(data.value.msg);
showToast(res.msg || "获取失败,请重试");
}
}
);
}
function startCountdown() {

View File

@@ -0,0 +1,155 @@
import { showToast, showLoadingToast, closeToast } from "vant";
import useApiFetch from "@/composables/useApiFetch";
const ALIYUN_CAPTCHA_SCENE_ID = "wynt39to";
const ENABLE_ENCRYPTED = false;
let captchaInitialised = false;
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;
});
if (!ENABLE_ENCRYPTED) {
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;
}
const { data, error } = await useApiFetch("/captcha/encryptedSceneId")
.post()
.json();
const resp = data?.value;
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",
});
}
export function useAliyunCaptcha() {
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();
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

@@ -3,10 +3,61 @@ import { createFetch } from "@vueuse/core";
import router from "@/router"; // 假设你使用 Vue Router
import { useUserStore } from "@/stores/userStore";
import { useAgentStore } from "@/stores/agentStore";
// 将服务端返回的 "ErrCode:xxxErrMsg:xxx" 纯文本转为 JSON避免 JSON 解析报错
const safeJsonFetch = async (input, init) => {
const response = await fetch(input, init);
const text = await response.text();
try {
JSON.parse(text);
return new Response(text, { status: response.status, statusText: response.statusText, headers: response.headers });
} catch {
const match = text.match(/ErrCode:(\d+)[,]\s*ErrMsg:(.*)/s);
const jsonBody = match
? JSON.stringify({ code: parseInt(match[1], 10), msg: (match[2] || '').trim() || '请求失败' })
: JSON.stringify({ code: 500, msg: text || '请求失败,请稍后重试' });
return new Response(jsonBody, {
status: response.status,
statusText: response.statusText,
headers: new Headers({ ...Object.fromEntries(response.headers.entries()), 'Content-Type': 'application/json' }),
});
}
};
// 封禁用户:清理登录态并跳转登录页,保证用户能看到提示
const USER_DISABLED_CODE = 100011;
function handleUserDisabled(msg) {
const message = msg || "您已被封禁";
if (typeof showToast === "function") {
showToast({ message });
}
localStorage.removeItem("token");
localStorage.removeItem("refreshAfter");
localStorage.removeItem("accessExpire");
localStorage.removeItem("userInfo");
localStorage.removeItem("agentInfo");
try {
const userStore = useUserStore();
const agentStore = useAgentStore();
if (userStore?.resetUser) userStore.resetUser();
if (agentStore?.resetAgent) agentStore.resetAgent();
} catch (_) {}
// 先 replace 再 setTimeout 兜底,确保离开当前页并进入登录页
if (typeof router !== "undefined" && router?.replace) {
router.replace("/login");
}
setTimeout(() => {
if (typeof window !== "undefined" && !window.location.pathname.includes("login")) {
window.location.href = "/login";
}
}, 300);
}
// 创建全局的 fetch 实例
const useApiFetch = createFetch({
baseUrl: "/api/v1", // 你的 API 基础路径
options: {
fetch: safeJsonFetch,
async beforeFetch({ url, options }) {
showLoadingToast({
message: "加载中...",
@@ -39,53 +90,64 @@ const useApiFetch = createFetch({
},
async afterFetch({ data, response }) {
closeToast();
// 兼容 code/msg 与 errcode/errmsg 两种响应格式
const code = data?.code ?? data?.errcode;
const msg = data?.msg ?? data?.errmsg ?? '';
// 全局处理响应
if (response.status === 401) {
// 清除本地存储的 token
if (msg && typeof showToast === "function") showToast({ message: msg });
localStorage.removeItem("token");
localStorage.removeItem('refreshAfter')
localStorage.removeItem('accessExpire')
// 跳转到登录页
router.replace("/login");
localStorage.removeItem("refreshAfter");
localStorage.removeItem("accessExpire");
if (typeof router !== "undefined" && router?.replace) router.replace("/login");
}
if (data.code !== 200) {
if (data.code === 100009) {
// 改进的存储管理
localStorage.removeItem('token')
localStorage.removeItem('refreshAfter')
localStorage.removeItem('accessExpire')
localStorage.removeItem('userInfo')
localStorage.removeItem('agentInfo')
// 重置状态
if (code !== undefined && code !== 200) {
const codeNum = Number(code);
if (codeNum === 100009) {
if (msg && typeof showToast === "function") showToast({ message: msg });
localStorage.removeItem('token');
localStorage.removeItem('refreshAfter');
localStorage.removeItem('accessExpire');
localStorage.removeItem('userInfo');
localStorage.removeItem('agentInfo');
const userStore = useUserStore();
const agentStore = useAgentStore();
userStore.resetUser()
agentStore.resetAgent()
location.reload()
userStore.resetUser();
agentStore.resetAgent();
location.reload();
} else if (codeNum === USER_DISABLED_CODE) {
handleUserDisabled(msg);
return { data, response };
} else if (codeNum !== 200002 && codeNum !== 200003 && codeNum !== 200004) {
if (typeof showToast === "function") {
showToast({ message: msg || '请求失败,请稍后重试' });
}
if (data.code !== 200002 && data.code !== 200003 && data.code !== 200004 && data.code !== 100009) {
showToast({ message: data.msg });
}
}
return { data, response };
},
async onFetchError({ error, response }) {
async onFetchError({ data, error, response }) {
console.log("error", error);
closeToast();
if (response.status === 401) {
// 清除本地存储的 token
localStorage.removeItem("token");
localStorage.removeItem('refreshAfter')
localStorage.removeItem('accessExpire')
// 跳转到登录页
router.replace("/login");
} else {
if (typeof error === "string") {
showToast({ message: error });
// 尝试从响应 body 解析业务码(如封禁 100011与 afterFetch 一致处理
const code = data?.code ?? data?.errcode;
const msg = data?.msg ?? data?.errmsg ?? "";
const codeNum = code !== undefined ? Number(code) : null;
if (codeNum === USER_DISABLED_CODE) {
handleUserDisabled(msg);
return { error };
}
const errMsg = typeof error === "string" ? error : (error?.message || "网络异常,请稍后重试");
if (response && response.status === 401) {
if (typeof showToast === "function") showToast({ message: msg || errMsg });
localStorage.removeItem("token");
localStorage.removeItem("refreshAfter");
localStorage.removeItem("accessExpire");
if (typeof router !== "undefined" && router?.replace) router.replace("/login");
} else {
if (typeof showToast === "function") showToast({ message: errMsg });
}
return { error };
},

View File

@@ -6,10 +6,10 @@ export function useSEO() {
// 默认SEO信息
const defaultSEO = {
title: '幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用',
description: '幸福查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。',
keywords: '大数据风险报告查询、大数据风险评估、大数据分析报告个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询',
url: 'https://www.zhinengcha.cn'
title: '幸福查官网_家庭生活安全评估_个人履约与情感互信平台',
description: '幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。',
keywords: '幸福查,家庭风险评估,生活隐患排查,情感互信报告,个人履约评估,家庭财务分析',
url: 'https://www.xingfucha.cn'
}
// 页面SEO配置
@@ -131,7 +131,7 @@ export function useSEO() {
"mainEntity": {
"@type": "Organization",
"name": "幸福查",
"url": "https://www.zhinengcha.cn/",
"url": "https://www.xingfucha.cn/",
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
}
}
@@ -146,9 +146,9 @@ export function useSEO() {
const updateSEOByRoute = () => {
const routeConfigs = {
'/': {
title: '幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用',
description: '幸福查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。',
keywords: '大数据风险报告查询、大数据风险评估、大数据分析报告个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询'
title: '幸福查官网_家庭生活安全评估_个人履约与情感互信平台',
description: '幸福查是您的智慧家庭安全管家。专注家政用工筛查与家庭财务健康。全方位核验保姆、月嫂、护工的司法背景与失信记录,同时提供个人经济履约分析。把好家庭进门关,守护家人安宁。',
keywords: '幸福查,家庭风险评估,生活隐患排查,情感互信报告,个人履约评估,家庭财务分析'
},
'/agent': {
title: '幸福查代理 - 免费开通代理权限 | 大数据风险报告代理',
@@ -156,9 +156,9 @@ export function useSEO() {
keywords: '幸福查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益'
},
'/help': {
title: '帮助中心 - 幸福查使用指南 | 常见问题解答',
description: '幸福查帮助中心提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务',
keywords: '幸福查帮助, 使用指南, 常见问题, 操作教程, 客服支持'
title: '幸福查帮助中心_合作伙伴操作指南_业务规则说明',
description: '幸福查官方服务支持中心提供全方位的平台使用指引,涵盖合作伙伴注册流程、业务权益说明、成本核算规则及数据系统操作教程。助您快速掌握平台功能,高效开展服务',
keywords: '幸福查使用教程,业务操作指南,合作伙伴权益,新手入门手册'
},
'/help/guide': {
title: '使用指南 - 幸福查操作教程 | 功能说明',
@@ -174,7 +174,46 @@ export function useSEO() {
title: '客服中心 - 幸福查在线客服 | 技术支持',
description: '幸福查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。',
keywords: '客服中心, 在线客服, 技术支持, 问题反馈, 幸福查客服'
}
},
// 个人查询
'/inquire/personalData': {
title: '个人生活信用健康度_家庭经济履约画像_综合风险分析_幸福查',
description: '幸福查个人生活信用系统提供客观的健康指数分析。核心功能涵盖经济履约记录监测、生活消费稳定性预警及个人资质评分。通过多维数据排查潜在的信用盲点,辅助建立稳健的家庭财务档案。',
keywords: '个人履约评价检测,家庭经济画像,履约能力分析,生活履约评分,风险自查报告'
},
// 企业查询
'/inquire/companyinfo': {
title: '家庭经营性资产风险评估_企业工商信用透视_幸福查',
description: '幸福查深度透视家庭经营实体的工商信用状况。评估维度覆盖企业行政处罚、司法被执行信息及经营异常名录。客观评估商业合作伙伴实力,有效规避家庭资产的连带责任风险与合同陷阱。',
keywords: '企业风险评估,工商信用分析,商业合作评估,经营异常筛查,老板背景核实'
},
// 贷前风险
'/inquire/preloanbackgroundcheck': {
title: '家庭财务健康度分析_个人经济履约压力检测_资金管理参考_幸福查',
description: '幸福查基于大数据算法对个人近期经济行为进行多维分析。精准检测资金流转稳定性、履约历史详情及生活消费压力指数。辅助用户掌握自身财务状况,科学规划家庭资金收支平衡度,提升抗风险能力。',
keywords: '财务健康检测,经济压力分析,履约能力评估,财务稳健度分析,生活消费指数'
},
// 婚恋风险
'/inquire/marriage': {
title: '婚前背景综合了解_涉婚风险筛查_情感互信报告_幸福查',
description: '幸福查婚恋评估系统致力于维护家庭情感基石。深度评估对象的涉婚法律诉讼、失信被执行记录及社会不良标签。消除交往中的信息不对称,辅助构建透明、坦诚、安全的婚姻关系。',
keywords: '婚前背景核验,涉婚司法记录,情感互信分析,家庭安全报告,婚恋诚意度'
},
// 入职背调
'/inquire/backgroundcheck': {
title: '职业背景真实性核实_个人履约与职场信用分析_幸福查',
description: '幸福查针对求职与用工场景,提供客观的职业背景参考。核实学历背景、职业履历一致性及潜在的竞业限制风险。降低职场信任成本,助力构建诚实守信的职业发展环境。',
keywords: '入职背景核实,职业诚信档案,简历信息比对,职场风险评估,个人履历分析'
},
// 家政风险
'/inquire/homeservice': {
title: '家政人员背景核验_家庭用工司法安全评估_幸福查',
description: '幸福查专注家庭服务场景的安全用工工具。支持对保姆、月嫂及护工进行身份信息一致性核实与过往涉诉历史分析。科学识别服务人员的潜在风险标签,保障老人与儿童的居家生活安宁。',
keywords: '家政背景核实,家庭用工安全,保姆司法筛查,家政履约记录,居家安全评估'
},
}
const currentPath = route?.path || '/'
@@ -182,7 +221,7 @@ export function useSEO() {
updateSEO({
...config,
url: `https://www.zhinengcha.cn${currentPath}`
url: `https://www.xingfucha.cn${currentPath}`
})
}

View File

@@ -142,10 +142,10 @@ export function useWeixinShare() {
}
const defaultConfig = {
title: "幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
title: "幸福查官网_家庭生活安全评估_个人履约与情感互信平台",
desc: "提供个人信用评估、人事背调、信贷风控、企业风险监测等服务",
link: window.location.href.split("#")[0], // 获取当前页面URL不包括hash
imgUrl: "https://www.www.xingfucha.cn/logo.jpg",
imgUrl: "https://www.xingfucha.cn/logo.jpg",
};
const config = { ...defaultConfig, ...shareConfig };
@@ -197,28 +197,28 @@ export function useWeixinShare() {
title: "幸福查 - 大数据风险报告示例",
desc: "查看完整的大数据风险报告示例,了解个人信用评估等服务",
link: window.location.href.split("#")[0],
imgUrl: "https://www.www.xingfucha.cn/logo.jpg",
imgUrl: "https://www.xingfucha.cn/logo.jpg",
};
} else if (route.includes("/agent")) {
shareConfig = {
title: "幸福查 - 免费开通代理权限",
desc: "免费开通代理权限,享受大数据风险报告查询服务代理收益",
link: window.location.href.split("#")[0],
imgUrl: "https://www.www.xingfucha.cn/logo.jpg",
imgUrl: "https://www.xingfucha.cn/logo.jpg",
};
} else if (route.includes("/help")) {
shareConfig = {
title: "幸福查 - 帮助中心",
desc: "详细的使用指南、常见问题解答、操作教程",
link: window.location.href.split("#")[0],
imgUrl: "https://www.www.xingfucha.cn/logo.jpg",
imgUrl: "https://www.xingfucha.cn/logo.jpg",
};
} else {
shareConfig = {
title: "幸福查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
title: "幸福查官网_家庭生活安全评估_个人履约与情感互信平台",
desc: "提供个人信用评估、人事背调、信贷风控、企业风险监测等服务",
link: window.location.href.split("#")[0],
imgUrl: "https://www.www.xingfucha.cn/logo.jpg",
imgUrl: "https://www.xingfucha.cn/logo.jpg",
};
}

View File

@@ -149,12 +149,12 @@ const router = createRouter({
component: () => import('@/views/AgentServiceAgreement.vue'),
meta: { title: '信息技术服务合同' },
},
{
path: '/inquire/marriage',
name: 'inquire-marriage',
component: () => import('@/views/Maintenance.vue'),
meta: { title: '维护通知' },
},
// {
// path: '/inquire/marriage',
// name: 'inquire-marriage',
// component: () => import('@/views/Maintenance.vue'),
// meta: { title: '维护通知' },
// },
{
path: '/inquire/:feature',
name: 'inquire',

View File

@@ -63,16 +63,17 @@ const currentStatus = !actualData
:class="`status-label rounded-full px-6 py-3 text-center font-bold shadow-md ${currentStatus.bgClass} ${currentStatus.textClass}`">
{{ currentStatus.text }}
</div>
<div v-if="currentStatus.opDate" class="op-date-container mt-4 px-4 py-2 bg-blue-50 rounded-lg border border-blue-200">
<p class="op-date text-sm font-medium text-blue-700">
登记日期{{ currentStatus.opDate }}
</p>
</div>
<p v-html="currentStatus.description" class="status-description mt-3 text-sm text-gray-600"></p>
</div>
</div>
</template>
<!-- <div v-if="currentStatus.opDate" class="op-date-container mt-4 px-4 py-2 bg-blue-50 rounded-lg border border-blue-200">
<p class="op-date text-sm font-medium text-blue-700">
登记日期{{ currentStatus.opDate }}
</p>
</div> -->
<style lang="scss" scoped>
.status-info {

View File

@@ -1,7 +1,9 @@
<script setup>
import { ref, computed, onUnmounted, nextTick } from 'vue'
import { showToast } from 'vant'
import ClickCaptcha from '@/components/ClickCaptcha.vue'
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
const { runWithCaptcha } = useAliyunCaptcha()
const router = useRouter()
const phoneNumber = ref('')
@@ -13,15 +15,6 @@ const isCountingDown = ref(false)
const countdown = ref(60)
let timer = null
// 验证组件状态
const showCaptcha = ref(false)
const captchaVerified = ref(false)
// 聚焦状态变量
const phoneFocused = ref(false)
const codeFocused = ref(false)
const passwordFocused = ref(false)
const isPhoneNumberValid = computed(() => {
return /^1[3-9]\d{9}$/.test(phoneNumber.value)
})
@@ -41,15 +34,16 @@ async function sendVerificationCode() {
showToast({ message: "请输入有效的手机号" });
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) {
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) {
@@ -57,9 +51,10 @@ async function sendVerificationCode() {
}
});
} else {
showToast(data.value.msg)
showToast(res.msg)
}
}
)
}
function startCountdown() {
@@ -95,24 +90,9 @@ async function handleLogin() {
showToast({ message: "请先同意用户协议" });
return
}
// 显示验证组件
showCaptcha.value = true
}
// 验证成功回调
function handleCaptchaSuccess() {
captchaVerified.value = true
showCaptcha.value = false
// 执行实际的登录逻辑
performLogin()
}
// 验证关闭回调
function handleCaptchaClose() {
showCaptcha.value = false
}
// 执行实际的登录逻辑
async function performLogin() {
const { data, error } = await useApiFetch('/user/mobileCodeLogin')
.post({ mobile: phoneNumber.value, code: verificationCode.value })
@@ -200,9 +180,6 @@ const onClickLeft = () => {
</div>
</div>
<!-- 点击验证组件 -->
<ClickCaptcha :visible="showCaptcha" @success="handleCaptchaSuccess" @close="handleCaptchaClose" />
</div>
</template>

View File

@@ -19,7 +19,7 @@ var vite_config_default = defineConfig({
proxy: {
"/api/v1": {
// target: "http://127.0.0.1:8888", // 本地接口地址
target: "https://www.www.xingfucha.cn",
target: "https://www.xingfucha.cn",
// 本地接口地址
changeOrigin: true
}