Merge branch 'main' of http://1.117.67.95:3000/team/qnc-webview-v3
This commit is contained in:
10
.env
10
.env
@@ -1,4 +1,6 @@
|
|||||||
|
# VITE_API_URL=https://www.quannengcha.com/
|
||||||
VITE_API_URL=
|
VITE_API_URL=
|
||||||
|
|
||||||
VITE_API_PREFIX=/api/v1
|
VITE_API_PREFIX=/api/v1
|
||||||
|
|
||||||
VITE_COMPANY_NAME=海南海宇大数据有限公司
|
VITE_COMPANY_NAME=海南海宇大数据有限公司
|
||||||
@@ -18,4 +20,10 @@ VITE_CHAT_AES_IV=345GDFED433223DF
|
|||||||
VITE_SHARE_TITLE=全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用
|
VITE_SHARE_TITLE=全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用
|
||||||
VITE_SHARE_DESC=提供个人信用评估、入职背调、信贷风控、企业风险监测等服务
|
VITE_SHARE_DESC=提供个人信用评估、入职背调、信贷风控、企业风险监测等服务
|
||||||
VITE_SHARE_IMG=https://www.quannengcha.com/logo.png
|
VITE_SHARE_IMG=https://www.quannengcha.com/logo.png
|
||||||
VITE_TOKEN_VERSION=1.0
|
VITE_TOKEN_VERSION=1.0
|
||||||
|
|
||||||
|
# 阿里云滑块验证码配置
|
||||||
|
VITE_ALIYUN_CAPTCHA_SCENE_ID=wynt39to
|
||||||
|
# 是否启用加密模式(true/false),需要在阿里云控制台开启加密模式
|
||||||
|
# 注意:根据代码逻辑,设置为 true 表示禁用加密,设置为 false 表示启用加密
|
||||||
|
VITE_ALIYUN_CAPTCHA_ENCRYPTED=true
|
||||||
|
|||||||
39
index.html
39
index.html
@@ -28,15 +28,15 @@
|
|||||||
|
|
||||||
<!-- 基础SEO信息 -->
|
<!-- 基础SEO信息 -->
|
||||||
<title>
|
<title>
|
||||||
全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用
|
全能查官网_个人婚姻状态报告_综合风险排查工具箱
|
||||||
</title>
|
</title>
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="全能查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。"
|
content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。"
|
||||||
/>
|
/>
|
||||||
<meta
|
<meta
|
||||||
name="keywords"
|
name="keywords"
|
||||||
content="大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询"
|
content="全能查,婚姻状态核实,风险排查工具,个人风险预警,第三方背调,商业信用评估"
|
||||||
/>
|
/>
|
||||||
<meta name="author" content="全能查" />
|
<meta name="author" content="全能查" />
|
||||||
<meta name="robots" content="index, follow" />
|
<meta name="robots" content="index, follow" />
|
||||||
@@ -45,28 +45,28 @@
|
|||||||
|
|
||||||
<!-- Open Graph / Facebook -->
|
<!-- Open Graph / Facebook -->
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="https://www.zhinengcha.cn/" />
|
<meta property="og:url" content="https://www.quannengcha.com/" />
|
||||||
<meta
|
<meta
|
||||||
property="og:title"
|
property="og:title"
|
||||||
content="全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
content="全能查官网_个人婚姻状态报告_综合风险排查工具箱"
|
||||||
/>
|
/>
|
||||||
<meta
|
<meta
|
||||||
property="og:description"
|
property="og:description"
|
||||||
content="全能查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。"
|
content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。"
|
||||||
/>
|
/>
|
||||||
<meta property="og:site_name" content="全能查" />
|
<meta property="og:site_name" content="全能查" />
|
||||||
<meta property="og:locale" content="zh_CN" />
|
<meta property="og:locale" content="zh_CN" />
|
||||||
|
|
||||||
<!-- Twitter -->
|
<!-- Twitter -->
|
||||||
<meta property="twitter:card" content="summary" />
|
<meta property="twitter:card" content="summary" />
|
||||||
<meta property="twitter:url" content="https://www.zhinengcha.cn/" />
|
<meta property="twitter:url" content="https://www.quannengcha.com/" />
|
||||||
<meta
|
<meta
|
||||||
property="twitter:title"
|
property="twitter:title"
|
||||||
content="全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
content="全能查官网_个人婚姻状态报告_综合风险排查工具箱"
|
||||||
/>
|
/>
|
||||||
<meta
|
<meta
|
||||||
property="twitter:description"
|
property="twitter:description"
|
||||||
content="全能查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。"
|
content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- 其他重要meta标签 -->
|
<!-- 其他重要meta标签 -->
|
||||||
@@ -83,11 +83,11 @@
|
|||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "WebSite",
|
"@type": "WebSite",
|
||||||
"name": "全能查",
|
"name": "全能查",
|
||||||
"url": "https://www.zhinengcha.cn/",
|
"url": "https://www.quannengcha.com/",
|
||||||
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
||||||
"potentialAction": {
|
"potentialAction": {
|
||||||
"@type": "SearchAction",
|
"@type": "SearchAction",
|
||||||
"target": "https://www.zhinengcha.cn/search?q={search_term_string}",
|
"target": "https://www.quannengcha.com/search?q={search_term_string}",
|
||||||
"query-input": "required name=search_term_string"
|
"query-input": "required name=search_term_string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
"name": "全能查",
|
"name": "全能查",
|
||||||
"url": "https://www.zhinengcha.cn/",
|
"url": "https://www.quannengcha.com/",
|
||||||
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -109,10 +109,19 @@
|
|||||||
delete window.wx;
|
delete window.wx;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- 阿里云滑块验证码 -->
|
||||||
|
<script>
|
||||||
|
window.AliyunCaptchaConfig = { region: "cn", prefix: "12zxnj" };
|
||||||
|
</script>
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="https://o.alicdn.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js"
|
||||||
|
></script>
|
||||||
|
|
||||||
<!-- 预加载关键资源 -->
|
<!-- 预加载关键资源 -->
|
||||||
<link rel="preconnect" href="https://www.zhinengcha.cn" />
|
<link rel="preconnect" href="https://www.quannengcha.com" />
|
||||||
<link rel="preconnect" href="https://res.wx.qq.com" />
|
<link rel="preconnect" href="https://res.wx.qq.com" />
|
||||||
<link rel="dns-prefetch" href="https://www.zhinengcha.cn" />
|
<link rel="dns-prefetch" href="https://www.quannengcha.com" />
|
||||||
<link rel="dns-prefetch" href="https://res.wx.qq.com" />
|
<link rel="dns-prefetch" href="https://res.wx.qq.com" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@@ -207,6 +216,8 @@
|
|||||||
<div class="loading-text">加载中</div>
|
<div class="loading-text">加载中</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
<!-- 阿里云滑块验证码挂载容器 -->
|
||||||
|
<div id="captcha-element"></div>
|
||||||
|
|
||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ Disallow: /js/
|
|||||||
Disallow: /css/
|
Disallow: /css/
|
||||||
|
|
||||||
# 网站地图
|
# 网站地图
|
||||||
Sitemap: https://www.zhinengcha.cn/sitemap.xml
|
Sitemap: https://www.quannengcha.com/sitemap.xml
|
||||||
|
|
||||||
# 爬取延迟(毫秒)
|
# 爬取延迟(毫秒)
|
||||||
Crawl-delay: 1
|
Crawl-delay: 1
|
||||||
|
|||||||
80
public/seo-templates/agent-system-guide.html
Normal file
80
public/seo-templates/agent-system-guide.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。">
|
||||||
|
<meta name="keywords" content="合作伙伴政策,服务费结算,渠道等级说明,业务操作指南,代理系统后台">
|
||||||
|
|
||||||
|
<meta property="og:title" content="全能查合作政策指南_合作伙伴权益与结算说明_官方文档">
|
||||||
|
<meta property="og:description" content="全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/agent/system-guide">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="全能查合作政策指南_合作伙伴权益与结算说明_官方文档">
|
||||||
|
<meta name="twitter:description" content="全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/agent/system-guide">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/agent/system-guide">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "全能查合作政策指南_合作伙伴权益与结算说明_官方文档",
|
||||||
|
"description": "全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。",
|
||||||
|
"url": "https://www.quannengcha.com/agent/system-guide",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/agent/system-guide">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/agent.html
Normal file
80
public/seo-templates/agent.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta name="keywords" content="全能查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益">
|
||||||
|
|
||||||
|
<meta property="og:title" content="全能查代理 - 免费开通代理权限 | 大数据风险报告代理">
|
||||||
|
<meta property="og:description" content="全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/agent">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="全能查代理 - 免费开通代理权限 | 大数据风险报告代理">
|
||||||
|
<meta name="twitter:description" content="全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/agent">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/agent">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "全能查代理 - 免费开通代理权限 | 大数据风险报告代理",
|
||||||
|
"description": "全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。",
|
||||||
|
"url": "https://www.quannengcha.com/agent",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/agent">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/example.html
Normal file
80
public/seo-templates/example.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta name="keywords" content="示例报告, 报告展示, 报告样例, 大数据风险报告, 婚姻查询报告">
|
||||||
|
|
||||||
|
<meta property="og:title" content="示例报告 - 全能查报告展示 | 大数据风险报告样例">
|
||||||
|
<meta property="og:description" content="全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/example">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="示例报告 - 全能查报告展示 | 大数据风险报告样例">
|
||||||
|
<meta name="twitter:description" content="全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/example">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/example">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "示例报告 - 全能查报告展示 | 大数据风险报告样例",
|
||||||
|
"description": "全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。",
|
||||||
|
"url": "https://www.quannengcha.com/example",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/example">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/help-guide.html
Normal file
80
public/seo-templates/help-guide.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta name="keywords" content="使用指南, 操作教程, 功能说明, 快速上手, 全能查教程">
|
||||||
|
|
||||||
|
<meta property="og:title" content="使用指南 - 全能查操作教程 | 功能说明">
|
||||||
|
<meta property="og:description" content="全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/help/guide">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="使用指南 - 全能查操作教程 | 功能说明">
|
||||||
|
<meta name="twitter:description" content="全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/help/guide">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/help/guide">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "使用指南 - 全能查操作教程 | 功能说明",
|
||||||
|
"description": "全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。",
|
||||||
|
"url": "https://www.quannengcha.com/help/guide",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/help/guide">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/help.html
Normal file
80
public/seo-templates/help.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta name="keywords" content="全能查帮助, 使用指南, 常见问题, 操作教程, 客服支持">
|
||||||
|
|
||||||
|
<meta property="og:title" content="帮助中心 - 全能查使用指南 | 常见问题解答">
|
||||||
|
<meta property="og:description" content="全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/help">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="帮助中心 - 全能查使用指南 | 常见问题解答">
|
||||||
|
<meta name="twitter:description" content="全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/help">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/help">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "帮助中心 - 全能查使用指南 | 常见问题解答",
|
||||||
|
"description": "全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。",
|
||||||
|
"url": "https://www.quannengcha.com/help",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/help">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/index.html
Normal file
80
public/seo-templates/index.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。">
|
||||||
|
<meta name="keywords" content="全能查,婚姻状态核实,风险排查工具,个人风险预警,第三方背调,商业信用评估">
|
||||||
|
|
||||||
|
<meta property="og:title" content="全能查官网_个人婚姻状态报告_综合风险排查工具箱">
|
||||||
|
<meta property="og:description" content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="全能查官网_个人婚姻状态报告_综合风险排查工具箱">
|
||||||
|
<meta name="twitter:description" content="全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "全能查官网_个人婚姻状态报告_综合风险排查工具箱",
|
||||||
|
"description": "全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。",
|
||||||
|
"url": "https://www.quannengcha.com",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-backgroundcheck.html
Normal file
80
public/seo-templates/inquire-backgroundcheck.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。">
|
||||||
|
<meta name="keywords" content="员工入职背调,职业背景核实,竞业限制评估,职场信用报告,候选人风险筛查">
|
||||||
|
|
||||||
|
<meta property="og:title" content="职场背景核验报告_候选人职业风险与竞业核验_全能查">
|
||||||
|
<meta property="og:description" content="全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/backgroundcheck">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="职场背景核验报告_候选人职业风险与竞业核验_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/backgroundcheck">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/backgroundcheck">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "职场背景核验报告_候选人职业风险与竞业核验_全能查",
|
||||||
|
"description": "全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/backgroundcheck",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/backgroundcheck">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-companyinfo.html
Normal file
80
public/seo-templates/inquire-companyinfo.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。">
|
||||||
|
<meta name="keywords" content="企业信用评估,工商背景核验,商业风险评估,公司经营异常,合作方背景核实">
|
||||||
|
|
||||||
|
<meta property="og:title" content="企业工商信用画像_经营异常与商业风险透视_全能查">
|
||||||
|
<meta property="og:description" content="全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/companyinfo">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="企业工商信用画像_经营异常与商业风险透视_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/companyinfo">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/companyinfo">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "企业工商信用画像_经营异常与商业风险透视_全能查",
|
||||||
|
"description": "全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/companyinfo",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/companyinfo">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-consumerFinanceReport.html
Normal file
80
public/seo-templates/inquire-consumerFinanceReport.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。">
|
||||||
|
<meta name="keywords" content="履约能力评估,经济风险指数,综合评分波动,资金压力分析,财务健康度">
|
||||||
|
|
||||||
|
<meta property="og:title" content="个人履约能力评估_经济风险与收支压力参考_全能查">
|
||||||
|
<meta property="og:description" content="全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/consumerFinanceReport">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="个人履约能力评估_经济风险与收支压力参考_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/consumerFinanceReport">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/consumerFinanceReport">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "个人履约能力评估_经济风险与收支压力参考_全能查",
|
||||||
|
"description": "全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/consumerFinanceReport",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/consumerFinanceReport">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-homeservice.html
Normal file
80
public/seo-templates/inquire-homeservice.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。">
|
||||||
|
<meta name="keywords" content="保姆背景核验,家政风险筛查,月嫂司法记录,雇佣安全评估,家政人员核验">
|
||||||
|
|
||||||
|
<meta property="og:title" content="家政人员背景核实_保姆月嫂司法安全评估_全能查">
|
||||||
|
<meta property="og:description" content="全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/homeservice">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="家政人员背景核实_保姆月嫂司法安全评估_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/homeservice">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/homeservice">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "家政人员背景核实_保姆月嫂司法安全评估_全能查",
|
||||||
|
"description": "全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/homeservice",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/homeservice">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-marriage.html
Normal file
80
public/seo-templates/inquire-marriage.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。">
|
||||||
|
<meta name="keywords" content="婚前背景报告,恋爱对象风险,情感安全评估,司法记录核验,家庭风险防范">
|
||||||
|
|
||||||
|
<meta property="og:title" content="婚前综合背景了解_情感安全风险评估_家庭履约分析_全能查">
|
||||||
|
<meta property="og:description" content="全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/marriage">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="婚前综合背景了解_情感安全风险评估_家庭履约分析_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/marriage">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/marriage">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "婚前综合背景了解_情感安全风险评估_家庭履约分析_全能查",
|
||||||
|
"description": "全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/marriage",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/marriage">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-preloanbackgroundcheck.html
Normal file
80
public/seo-templates/inquire-preloanbackgroundcheck.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。">
|
||||||
|
<meta name="keywords" content="综合评分检测,多重履约压力分析,履约能力评估,综合评分优化,个人数据画像">
|
||||||
|
|
||||||
|
<meta property="og:title" content="综合履约评分检测_多平台履约记录分析_个人财务履约报告_全能查">
|
||||||
|
<meta property="og:description" content="全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/preloanbackgroundcheck">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="综合履约评分检测_多平台履约记录分析_个人财务履约报告_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/preloanbackgroundcheck">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/preloanbackgroundcheck">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "综合履约评分检测_多平台履约记录分析_个人财务履约报告_全能查",
|
||||||
|
"description": "全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/preloanbackgroundcheck",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/preloanbackgroundcheck">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/inquire-riskassessment.html
Normal file
80
public/seo-templates/inquire-riskassessment.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。">
|
||||||
|
<meta name="keywords" content="个人风险检测,履约能力分析,综合风险指数,信用健康度,个人数据画像">
|
||||||
|
|
||||||
|
<meta property="og:title" content="个人综合风险分析_履约能力画像_多维数据检测_全能查">
|
||||||
|
<meta property="og:description" content="全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/inquire/riskassessment">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="个人综合风险分析_履约能力画像_多维数据检测_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/inquire/riskassessment">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/inquire/riskassessment">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "个人综合风险分析_履约能力画像_多维数据检测_全能查",
|
||||||
|
"description": "全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。",
|
||||||
|
"url": "https://www.quannengcha.com/inquire/riskassessment",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/inquire/riskassessment">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/promote.html
Normal file
80
public/seo-templates/promote.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。">
|
||||||
|
<meta name="keywords" content="风控系统代理,风险评估平台招商,平台渠道合作,企业服务创业,全能查合伙人">
|
||||||
|
|
||||||
|
<meta property="og:title" content="全能查合伙人计划_风控平台系统招商_渠道合作平台_全能查">
|
||||||
|
<meta property="og:description" content="全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/promote">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="全能查合伙人计划_风控平台系统招商_渠道合作平台_全能查">
|
||||||
|
<meta name="twitter:description" content="全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/promote">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/promote">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "全能查合伙人计划_风控平台系统招商_渠道合作平台_全能查",
|
||||||
|
"description": "全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。",
|
||||||
|
"url": "https://www.quannengcha.com/promote",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/promote">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
80
public/seo-templates/service.html
Normal file
80
public/seo-templates/service.html
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<!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>
|
||||||
|
|
||||||
|
<meta name="description" content="全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta name="keywords" content="客服中心, 在线客服, 技术支持, 问题反馈, 全能查客服">
|
||||||
|
|
||||||
|
<meta property="og:title" content="客服中心 - 全能查在线客服 | 技术支持">
|
||||||
|
<meta property="og:description" content="全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta property="og:url" content="https://www.quannengcha.com/service">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="客服中心 - 全能查在线客服 | 技术支持">
|
||||||
|
<meta name="twitter:description" content="全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。">
|
||||||
|
<meta name="twitter:url" content="https://www.quannengcha.com/service">
|
||||||
|
|
||||||
|
<link rel="canonical" href="https://www.quannengcha.com/service">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "WebPage",
|
||||||
|
"name": "客服中心 - 全能查在线客服 | 技术支持",
|
||||||
|
"description": "全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。",
|
||||||
|
"url": "https://www.quannengcha.com/service",
|
||||||
|
"mainEntity": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "全能查",
|
||||||
|
"url": "https://www.quannengcha.com/",
|
||||||
|
"description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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.quannengcha.com/service">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
"name": "全能查官网_个人婚姻状态报告_综合风险排查工具箱",
|
||||||
"short_name": "全能查",
|
"short_name": "全能查",
|
||||||
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
"description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
|
||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
|
|||||||
@@ -1,67 +1,67 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/</loc>
|
<loc>https://www.quannengcha.com/</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>daily</changefreq>
|
<changefreq>daily</changefreq>
|
||||||
<priority>1.0</priority>
|
<priority>1.0</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agent</loc>
|
<loc>https://www.quannengcha.com/agent</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>weekly</changefreq>
|
<changefreq>weekly</changefreq>
|
||||||
<priority>0.8</priority>
|
<priority>0.8</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/help</loc>
|
<loc>https://www.quannengcha.com/help</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.7</priority>
|
<priority>0.7</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/help/guide</loc>
|
<loc>https://www.quannengcha.com/help/guide</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/example</loc>
|
<loc>https://www.quannengcha.com/example</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.6</priority>
|
<priority>0.6</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/service</loc>
|
<loc>https://www.quannengcha.com/service</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>monthly</changefreq>
|
<changefreq>monthly</changefreq>
|
||||||
<priority>0.5</priority>
|
<priority>0.5</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/privacyPolicy</loc>
|
<loc>https://www.quannengcha.com/privacyPolicy</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/userAgreement</loc>
|
<loc>https://www.quannengcha.com/userAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agentManageAgreement</loc>
|
<loc>https://www.quannengcha.com/agentManageAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/agentSerivceAgreement</loc>
|
<loc>https://www.quannengcha.com/agentSerivceAgreement</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
</url>
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://www.zhinengcha.cn/authorization</loc>
|
<loc>https://www.quannengcha.com/authorization</loc>
|
||||||
<lastmod>2025-08-01</lastmod>
|
<lastmod>2025-08-01</lastmod>
|
||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.3</priority>
|
<priority>0.3</priority>
|
||||||
|
|||||||
170
server/crawler-detector.js
Normal file
170
server/crawler-detector.js
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/**
|
||||||
|
* 爬虫检测模块
|
||||||
|
* 用于识别搜索引擎爬虫和社交媒体爬虫
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CrawlerDetector {
|
||||||
|
constructor() {
|
||||||
|
// 常见搜索引擎爬虫User-Agent列表
|
||||||
|
this.crawlerPatterns = [
|
||||||
|
// 百度爬虫
|
||||||
|
'baiduspider',
|
||||||
|
'baiduspider-mobile',
|
||||||
|
'baiduspider-image',
|
||||||
|
'baiduspider-video',
|
||||||
|
'baiduspider-news',
|
||||||
|
'baiduboxapp',
|
||||||
|
|
||||||
|
// Google爬虫
|
||||||
|
'googlebot',
|
||||||
|
'googlebot-image',
|
||||||
|
'googlebot-news',
|
||||||
|
'googlebot-mobile',
|
||||||
|
'googlebot-video',
|
||||||
|
'google-web-snippet',
|
||||||
|
|
||||||
|
// 360搜索
|
||||||
|
'360spider',
|
||||||
|
'soha-agent',
|
||||||
|
'haosouspider',
|
||||||
|
|
||||||
|
// 搜狗搜索
|
||||||
|
'sogou spider',
|
||||||
|
'sogou news spider',
|
||||||
|
'sogou orion spider',
|
||||||
|
'sogou-blog',
|
||||||
|
|
||||||
|
// 必应
|
||||||
|
'bingbot',
|
||||||
|
'msnbot',
|
||||||
|
|
||||||
|
// 雅虎
|
||||||
|
'slurp',
|
||||||
|
|
||||||
|
// 搜搜
|
||||||
|
'sosospider',
|
||||||
|
'sosoimagespider',
|
||||||
|
|
||||||
|
// 有道
|
||||||
|
'youdaobot',
|
||||||
|
'yodaobot',
|
||||||
|
|
||||||
|
// 头条搜索
|
||||||
|
'bytedance-spider',
|
||||||
|
'toutiaospider',
|
||||||
|
|
||||||
|
// 社交媒体爬虫
|
||||||
|
'facebookexternalhit',
|
||||||
|
'facebookcatalog',
|
||||||
|
'twitterbot',
|
||||||
|
'linkedinbot',
|
||||||
|
'whatsapp',
|
||||||
|
'telegrambot',
|
||||||
|
'viber',
|
||||||
|
'line',
|
||||||
|
|
||||||
|
// 其他常见爬虫
|
||||||
|
'applebot',
|
||||||
|
'semrushbot',
|
||||||
|
'ahrefsbot',
|
||||||
|
'mj12bot',
|
||||||
|
'dotbot',
|
||||||
|
'crawler',
|
||||||
|
'spider',
|
||||||
|
'bot'
|
||||||
|
]
|
||||||
|
|
||||||
|
// 需要检测的头部字段
|
||||||
|
this.crawlerHeaders = ['x-bot', 'x-crawler', 'x-forwarded-for']
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测请求是否来自爬虫
|
||||||
|
* @param {Object} req - HTTP请求对象
|
||||||
|
* @returns {Boolean} 是否为爬虫
|
||||||
|
*/
|
||||||
|
isCrawler(req) {
|
||||||
|
const userAgent = req.headers['user-agent']?.toLowerCase() || ''
|
||||||
|
const headers = req.headers
|
||||||
|
|
||||||
|
// 1. 通过User-Agent检测
|
||||||
|
if (this.checkUserAgent(userAgent)) {
|
||||||
|
console.log(`[CrawlerDetector] 检测到爬虫 UA: ${userAgent}`)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 通过特定头部检测
|
||||||
|
if (this.checkHeaders(headers)) {
|
||||||
|
console.log(`[CrawlerDetector] 检测到爬虫 Headers`)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 通过IP地址检测(可选)
|
||||||
|
// if (this.checkIP(req.connection.remoteAddress)) {
|
||||||
|
// return true
|
||||||
|
// }
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查User-Agent
|
||||||
|
* @param {String} userAgent
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkUserAgent(userAgent) {
|
||||||
|
if (!userAgent) return false
|
||||||
|
|
||||||
|
return this.crawlerPatterns.some(pattern => {
|
||||||
|
return userAgent.includes(pattern.toLowerCase())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查请求头
|
||||||
|
* @param {Object} headers
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkHeaders(headers) {
|
||||||
|
for (const header of this.crawlerHeaders) {
|
||||||
|
const headerValue = headers[header]?.toLowerCase()
|
||||||
|
if (headerValue && (headerValue.includes('bot') || headerValue.includes('crawler'))) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查IP地址是否为已知爬虫IP
|
||||||
|
* @param {String} ip
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
checkIP(ip) {
|
||||||
|
// 这里可以添加已知爬虫IP段的检测
|
||||||
|
// 需要定期更新爬虫IP列表
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取爬虫类型
|
||||||
|
* @param {String} userAgent
|
||||||
|
* @returns {String} 爬虫类型
|
||||||
|
*/
|
||||||
|
getCrawlerType(userAgent) {
|
||||||
|
const ua = userAgent.toLowerCase()
|
||||||
|
|
||||||
|
if (ua.includes('baiduspider')) return 'baidu'
|
||||||
|
if (ua.includes('googlebot')) return 'google'
|
||||||
|
if (ua.includes('bingbot') || ua.includes('msnbot')) return 'bing'
|
||||||
|
if (ua.includes('360spider')) return '360'
|
||||||
|
if (ua.includes('sogou spider')) return 'sogou'
|
||||||
|
if (ua.includes('facebookexternalhit')) return 'facebook'
|
||||||
|
if (ua.includes('twitterbot')) return 'twitter'
|
||||||
|
if (ua.includes('linkedinbot')) return 'linkedin'
|
||||||
|
|
||||||
|
return 'unknown'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = CrawlerDetector
|
||||||
245
server/generate-seo-templates.cjs
Normal file
245
server/generate-seo-templates.cjs
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
/**
|
||||||
|
* SEO模板生成器
|
||||||
|
* 根据 useSEO.js 的页面配置自动生成静态 HTML 模板,供爬虫访问时返回
|
||||||
|
* 配置与 src/composables/useSEO.js 保持一致
|
||||||
|
*
|
||||||
|
* 多站点:通过环境变量 SEO_BASE_URL 指定 canonical/og:url 域名后生成
|
||||||
|
* 例:SEO_BASE_URL=https://www.quannengcha.com node generate-seo-templates.cjs
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const BASE_URL = process.env.SEO_BASE_URL || 'https://www.quannengcha.com'
|
||||||
|
|
||||||
|
// 页面 SEO 配置(与 src/composables/useSEO.js 的 routeConfigs 保持一致)
|
||||||
|
const pageSEOConfigs = {
|
||||||
|
'index.html': {
|
||||||
|
title: '全能查官网_个人婚姻状态报告_综合风险排查工具箱',
|
||||||
|
description: '全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。',
|
||||||
|
keywords: '全能查,婚姻状态核实,风险排查工具,个人风险预警,第三方背调,商业信用评估',
|
||||||
|
url: BASE_URL
|
||||||
|
},
|
||||||
|
'agent-system-guide.html': {
|
||||||
|
title: '全能查合作政策指南_合作伙伴权益与结算说明_官方文档',
|
||||||
|
description: '全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。',
|
||||||
|
keywords: '合作伙伴政策,服务费结算,渠道等级说明,业务操作指南,代理系统后台',
|
||||||
|
url: `${BASE_URL}/agent/system-guide`
|
||||||
|
},
|
||||||
|
'inquire-riskassessment.html': {
|
||||||
|
title: '个人综合风险分析_履约能力画像_多维数据检测_全能查',
|
||||||
|
description: '全能查个人风险报告为您提供全方位的信用健康度参考。基于公开数据深度解析综合风险指数、司法关联风险、历史履约趋势及潜在的负面标签。数据客观中立,帮助用户建立良好的个人履约记录管理意识。',
|
||||||
|
keywords: '个人风险检测,履约能力分析,综合风险指数,信用健康度,个人数据画像',
|
||||||
|
url: `${BASE_URL}/inquire/riskassessment`
|
||||||
|
},
|
||||||
|
'inquire-companyinfo.html': {
|
||||||
|
title: '企业工商信用画像_经营异常与商业风险透视_全能查',
|
||||||
|
description: '全能查企业版深度透视商业真相。聚合工商、司法及税务公开数据,核验企业经营异常名录、行政处罚、法律诉讼及股权穿透信息。全方位评估合作伙伴的商业健康度,规避合同违约风险。',
|
||||||
|
keywords: '企业信用评估,工商背景核验,商业风险评估,公司经营异常,合作方背景核实',
|
||||||
|
url: `${BASE_URL}/inquire/companyinfo`
|
||||||
|
},
|
||||||
|
'inquire-preloanbackgroundcheck.html': {
|
||||||
|
title: '综合履约评分检测_多平台履约记录分析_个人财务履约报告_全能查',
|
||||||
|
description: '全能查提供专业的个人履约健康度体检服务。基于多维大数据分析,检测您的综合评分波动、历史履约记录及潜在的风险标签。本服务旨在帮助用户优化个人数据画像,提升信用管理意识,不提供任何信贷金融服务。',
|
||||||
|
keywords: '综合评分检测,多重履约压力分析,履约能力评估,综合评分优化,个人数据画像',
|
||||||
|
url: `${BASE_URL}/inquire/preloanbackgroundcheck`
|
||||||
|
},
|
||||||
|
'inquire-marriage.html': {
|
||||||
|
title: '婚前综合背景了解_情感安全风险评估_家庭履约分析_全能查',
|
||||||
|
description: '全能查婚恋风险报告基于合法公开数据,辅助评估对象的婚前背景。核心核验司法涉诉记录、失信被执行历史、多重履约能力及不良社会标签。拒绝情感盲区,用数据守护您的家庭与财产安全。',
|
||||||
|
keywords: '婚前背景报告,恋爱对象风险,情感安全评估,司法记录核验,家庭风险防范',
|
||||||
|
url: `${BASE_URL}/inquire/marriage`
|
||||||
|
},
|
||||||
|
'inquire-backgroundcheck.html': {
|
||||||
|
title: '职场背景核验报告_候选人职业风险与竞业核验_全能查',
|
||||||
|
description: '全能查为企业提供专业的入职背调服务。一键筛查候选人的学历背景、涉及的商业利益冲突、劳动仲裁记录及社会不良风险。数据实时合规,降低企业用工试错成本,提升招聘决策效率。',
|
||||||
|
keywords: '员工入职背调,职业背景核实,竞业限制评估,职场信用报告,候选人风险筛查',
|
||||||
|
url: `${BASE_URL}/inquire/backgroundcheck`
|
||||||
|
},
|
||||||
|
'inquire-homeservice.html': {
|
||||||
|
title: '家政人员背景核实_保姆月嫂司法安全评估_全能查',
|
||||||
|
description: '全能查针对家庭用工场景,提供客观的家政人员背景核验服务。重点核验身份信息、司法涉诉记录及失信历史。辅助雇主识别高危人员,让居家养老育儿更安心。',
|
||||||
|
keywords: '保姆背景核验,家政风险筛查,月嫂司法记录,雇佣安全评估,家政人员核验',
|
||||||
|
url: `${BASE_URL}/inquire/homeservice`
|
||||||
|
},
|
||||||
|
'inquire-consumerFinanceReport.html': {
|
||||||
|
title: '个人履约能力评估_经济风险与收支压力参考_全能查',
|
||||||
|
description: '全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。',
|
||||||
|
keywords: '履约能力评估,经济风险指数,综合评分波动,资金压力分析,财务健康度',
|
||||||
|
url: `${BASE_URL}/inquire/consumerFinanceReport`
|
||||||
|
},
|
||||||
|
'agent.html': {
|
||||||
|
title: '全能查代理 - 免费开通代理权限 | 大数据风险报告代理',
|
||||||
|
description: '全能查代理平台,免费开通代理权限,享受大数据风险报告查询服务代理收益。专业的大数据风险报告、婚姻查询、个人信用评估等服务的代理合作。',
|
||||||
|
keywords: '全能查代理, 免费代理, 大数据风险报告代理, 代理权限, 代理收益',
|
||||||
|
url: `${BASE_URL}/agent`
|
||||||
|
},
|
||||||
|
'help.html': {
|
||||||
|
title: '帮助中心 - 全能查使用指南 | 常见问题解答',
|
||||||
|
description: '全能查帮助中心,提供详细的使用指南、常见问题解答、操作教程等,帮助用户更好地使用大数据风险报告查询服务。',
|
||||||
|
keywords: '全能查帮助, 使用指南, 常见问题, 操作教程, 客服支持',
|
||||||
|
url: `${BASE_URL}/help`
|
||||||
|
},
|
||||||
|
'help-guide.html': {
|
||||||
|
title: '使用指南 - 全能查操作教程 | 功能说明',
|
||||||
|
description: '全能查详细使用指南,包含各功能模块的操作教程、功能说明、注意事项等,让用户快速上手使用。',
|
||||||
|
keywords: '使用指南, 操作教程, 功能说明, 快速上手, 全能查教程',
|
||||||
|
url: `${BASE_URL}/help/guide`
|
||||||
|
},
|
||||||
|
'example.html': {
|
||||||
|
title: '示例报告 - 全能查报告展示 | 大数据风险报告样例',
|
||||||
|
description: '全能查示例报告展示,包含大数据风险报告、婚姻状况查询、个人信用评估等服务的报告样例,让用户了解报告内容和格式。',
|
||||||
|
keywords: '示例报告, 报告展示, 报告样例, 大数据风险报告, 婚姻查询报告',
|
||||||
|
url: `${BASE_URL}/example`
|
||||||
|
},
|
||||||
|
'service.html': {
|
||||||
|
title: '客服中心 - 全能查在线客服 | 技术支持',
|
||||||
|
description: '全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。',
|
||||||
|
keywords: '客服中心, 在线客服, 技术支持, 问题反馈, 全能查客服',
|
||||||
|
url: `${BASE_URL}/service`
|
||||||
|
},
|
||||||
|
'promote.html': {
|
||||||
|
title: '全能查合伙人计划_风控平台系统招商_渠道合作平台_全能查',
|
||||||
|
description: '全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。',
|
||||||
|
keywords: '风控系统代理,风险评估平台招商,平台渠道合作,企业服务创业,全能查合伙人',
|
||||||
|
url: `${BASE_URL}/promote`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规范化文案:统一为中文标点,避免乱码
|
||||||
|
*/
|
||||||
|
function normalizeText(str) {
|
||||||
|
if (typeof str !== 'string') return str
|
||||||
|
return str
|
||||||
|
.replace(/\uFFFD/g, '')
|
||||||
|
.replace(/。/g, '。')
|
||||||
|
.replace(/、/g, '、')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转义 HTML 属性值
|
||||||
|
*/
|
||||||
|
function escapeAttr(str) {
|
||||||
|
if (typeof str !== 'string') return ''
|
||||||
|
return str
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.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.quannengcha.com/',
|
||||||
|
description: '专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return `<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
|
||||||
|
<title>${escapeAttr(title)}</title>
|
||||||
|
|
||||||
|
<meta name="description" content="${escapeAttr(description)}">
|
||||||
|
<meta name="keywords" content="${escapeAttr(keywords)}">
|
||||||
|
|
||||||
|
<meta property="og:title" content="${escapeAttr(title)}">
|
||||||
|
<meta property="og:description" content="${escapeAttr(description)}">
|
||||||
|
<meta property="og:url" content="${escapeAttr(config.url)}">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:site_name" content="全能查">
|
||||||
|
<meta property="og:locale" content="zh_CN">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="${escapeAttr(title)}">
|
||||||
|
<meta name="twitter:description" content="${escapeAttr(description)}">
|
||||||
|
<meta name="twitter:url" content="${escapeAttr(config.url)}">
|
||||||
|
|
||||||
|
<link rel="canonical" href="${escapeAttr(config.url)}">
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
${JSON.stringify(structuredData, null, 8)}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<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>${escapeAttr(title)}</h1>
|
||||||
|
<div class="redirect-notice">
|
||||||
|
<p>正在跳转到完整版网站...</p>
|
||||||
|
<p>如果浏览器没有自动跳转,请 <a href="${escapeAttr(config.url)}">点击这里</a></p>
|
||||||
|
</div>
|
||||||
|
<p>${escapeAttr(description)}</p>
|
||||||
|
<section>
|
||||||
|
<h2>关于全能查</h2>
|
||||||
|
<p>全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。</p>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>核心服务</h2>
|
||||||
|
<ul>
|
||||||
|
<li>个人综合风险分析与履约能力画像</li>
|
||||||
|
<li>企业工商信用画像与商业风险透视</li>
|
||||||
|
<li>婚前综合背景了解与情感安全风险评估</li>
|
||||||
|
<li>职场背景核验与入职背调</li>
|
||||||
|
<li>家政人员背景核实与安全评估</li>
|
||||||
|
<li>个人履约能力评估与经济风险分析</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</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}`)
|
||||||
|
console.log(`💡 配置与 useSEO.js 一致,当前域名: ${BASE_URL}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
179
server/middleware.js
Normal file
179
server/middleware.js
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
/**
|
||||||
|
* SEO中间件
|
||||||
|
* 用于在Node.js服务器中检测爬虫并返回静态HTML
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const CrawlerDetector = require('./crawler-detector')
|
||||||
|
|
||||||
|
class SEOMiddleware {
|
||||||
|
constructor(options = {}) {
|
||||||
|
this.detector = new CrawlerDetector()
|
||||||
|
this.templateDir = options.templateDir || path.join(__dirname, '../public/seo-templates')
|
||||||
|
this.defaultTemplate = options.defaultTemplate || 'index.html'
|
||||||
|
this.fallbackToSPA = options.fallbackToSPA !== false
|
||||||
|
this.debug = options.debug || false
|
||||||
|
|
||||||
|
// 路由到模板的映射(与 useSEO.js 及 generate-seo-templates.cjs 保持一致;子路径放前面以优先精确匹配)
|
||||||
|
this.routeTemplateMap = {
|
||||||
|
'/': 'index.html',
|
||||||
|
'/agent/system-guide': 'agent-system-guide.html',
|
||||||
|
'/inquire/riskassessment': 'inquire-riskassessment.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',
|
||||||
|
'/inquire/consumerFinanceReport': 'inquire-consumerFinanceReport.html',
|
||||||
|
'/agent': 'agent.html',
|
||||||
|
'/help/guide': 'help-guide.html',
|
||||||
|
'/help': 'help.html',
|
||||||
|
'/example': 'example.html',
|
||||||
|
'/service': 'service.html',
|
||||||
|
'/promote': 'promote.html'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化模板缓存
|
||||||
|
this.templateCache = new Map()
|
||||||
|
this.cacheTemplates()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存所有模板文件
|
||||||
|
*/
|
||||||
|
cacheTemplates() {
|
||||||
|
try {
|
||||||
|
if (!fs.existsSync(this.templateDir)) {
|
||||||
|
console.warn(`[SEOMiddleware] 模板目录不存在: ${this.templateDir}`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const files = fs.readdirSync(this.templateDir)
|
||||||
|
files.forEach(file => {
|
||||||
|
const filePath = path.join(this.templateDir, file)
|
||||||
|
if (fs.statSync(filePath).isFile()) {
|
||||||
|
this.templateCache.set(file, fs.readFileSync(filePath, 'utf-8'))
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 已缓存模板: ${file}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(`[SEOMiddleware] 已缓存 ${this.templateCache.size} 个模板文件`)
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[SEOMiddleware] 缓存模板失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取对应的模板文件名
|
||||||
|
* @param {String} path - 请求路径
|
||||||
|
* @returns {String} 模板文件名
|
||||||
|
*/
|
||||||
|
getTemplatePath(requestPath) {
|
||||||
|
// 完全匹配
|
||||||
|
if (this.routeTemplateMap[requestPath]) {
|
||||||
|
return this.routeTemplateMap[requestPath]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模糊匹配(处理动态路由)
|
||||||
|
const matchedKey = Object.keys(this.routeTemplateMap).find(route => {
|
||||||
|
return requestPath.startsWith(route)
|
||||||
|
})
|
||||||
|
|
||||||
|
return matchedKey ? this.routeTemplateMap[matchedKey] : this.defaultTemplate
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取模板内容
|
||||||
|
* @param {String} templateName - 模板文件名
|
||||||
|
* @returns {String|null} 模板内容
|
||||||
|
*/
|
||||||
|
getTemplate(templateName) {
|
||||||
|
// 首先尝试缓存
|
||||||
|
let content = this.templateCache.get(templateName)
|
||||||
|
|
||||||
|
// 如果缓存中没有,尝试从磁盘读取
|
||||||
|
if (!content) {
|
||||||
|
try {
|
||||||
|
const filePath = path.join(this.templateDir, templateName)
|
||||||
|
if (fs.existsSync(filePath)) {
|
||||||
|
content = fs.readFileSync(filePath, 'utf-8')
|
||||||
|
this.templateCache.set(templateName, content)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[SEOMiddleware] 读取模板失败: ${templateName}`, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content || null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Express中间件
|
||||||
|
*/
|
||||||
|
express() {
|
||||||
|
return (req, res, next) => {
|
||||||
|
// 检测是否为爬虫
|
||||||
|
if (this.detector.isCrawler(req)) {
|
||||||
|
const templateName = this.getTemplatePath(req.path)
|
||||||
|
const template = this.getTemplate(templateName)
|
||||||
|
|
||||||
|
if (template) {
|
||||||
|
// 设置响应头
|
||||||
|
res.setHeader('Content-Type', 'text/html; charset=utf-8')
|
||||||
|
res.setHeader('X-SEOMiddleware', 'prerendered')
|
||||||
|
|
||||||
|
// 返回静态HTML
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 返回SEO模板: ${templateName} for ${req.path}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.send(template)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不是爬虫或模板不存在,继续处理SPA
|
||||||
|
next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Koa中间件
|
||||||
|
*/
|
||||||
|
koa() {
|
||||||
|
return async (ctx, next) => {
|
||||||
|
// 检测是否为爬虫
|
||||||
|
if (this.detector.isCrawler(ctx.req)) {
|
||||||
|
const templateName = this.getTemplatePath(ctx.path)
|
||||||
|
const template = this.getTemplate(templateName)
|
||||||
|
|
||||||
|
if (template) {
|
||||||
|
ctx.type = 'text/html; charset=utf-8'
|
||||||
|
ctx.set('X-SEOMiddleware', 'prerendered')
|
||||||
|
|
||||||
|
if (this.debug) {
|
||||||
|
console.log(`[SEOMiddleware] 返回SEO模板: ${templateName} for ${ctx.path}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.body = template
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重新加载模板缓存
|
||||||
|
*/
|
||||||
|
reloadCache() {
|
||||||
|
this.templateCache.clear()
|
||||||
|
this.cacheTemplates()
|
||||||
|
console.log('[SEOMiddleware] 模板缓存已重新加载')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = SEOMiddleware
|
||||||
27
server/package.json
Normal file
27
server/package.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "tydata-seo-server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "SPA SEO 优化 - 爬虫检测与静态 HTML 回退,与 useSEO.js 同步",
|
||||||
|
"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"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"compression": "^1.7.4"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^3.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
36
server/server-example-express.js
Normal file
36
server/server-example-express.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/**
|
||||||
|
* Express服务器示例
|
||||||
|
* 展示如何集成SEO中间件
|
||||||
|
*/
|
||||||
|
|
||||||
|
const express = require('express')
|
||||||
|
const path = require('path')
|
||||||
|
const SEOMiddleware = require('./middleware')
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
const port = process.env.PORT || 3000
|
||||||
|
|
||||||
|
// 初始化SEO中间件
|
||||||
|
const seoMiddleware = new SEOMiddleware({
|
||||||
|
templateDir: path.join(__dirname, '../public/seo-templates'),
|
||||||
|
debug: process.env.NODE_ENV === 'development'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 应用SEO中间件(必须在静态文件服务之前)
|
||||||
|
app.use(seoMiddleware.express())
|
||||||
|
|
||||||
|
// 静态文件服务
|
||||||
|
app.use(express.static(path.join(__dirname, '../dist')))
|
||||||
|
|
||||||
|
// SPA路由处理
|
||||||
|
app.get('*', (req, res) => {
|
||||||
|
res.sendFile(path.join(__dirname, '../dist/index.html'))
|
||||||
|
})
|
||||||
|
|
||||||
|
// 启动服务器
|
||||||
|
app.listen(port, () => {
|
||||||
|
console.log(`🚀 服务器运行在 http://localhost:${port}`)
|
||||||
|
console.log(`🔍 SEO中间件已启用`)
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = app
|
||||||
112
server/test-crawler-detection.js
Normal file
112
server/test-crawler-detection.js
Normal 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)
|
||||||
178
server/test-seo.js
Normal file
178
server/test-seo.js
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/**
|
||||||
|
* 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 标题关键词(与 useSEO.js 一致,天远数据)
|
||||||
|
const ROUTES = [
|
||||||
|
{ path: '/', titleKeyword: '天远数据' },
|
||||||
|
{ path: '/agent', titleKeyword: '天远数据代理' },
|
||||||
|
{ path: '/help', titleKeyword: '天远数据帮助中心' },
|
||||||
|
{ path: '/inquire/personalData', titleKeyword: '个人综合风险报告' },
|
||||||
|
{ path: '/agent/promote', titleKeyword: '推广码' },
|
||||||
|
{ path: '/historyQuery', 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)
|
||||||
|
})
|
||||||
1
src/auto-imports.d.ts
vendored
1
src/auto-imports.d.ts
vendored
@@ -117,6 +117,7 @@ declare global {
|
|||||||
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
||||||
const useAgent: typeof import('./composables/useAgent.js')['useAgent']
|
const useAgent: typeof import('./composables/useAgent.js')['useAgent']
|
||||||
const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore']
|
const useAgentStore: typeof import('./stores/agentStore.js')['useAgentStore']
|
||||||
|
const useAliyunCaptcha: typeof import('./composables/useAliyunCaptcha.js')['default']
|
||||||
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
||||||
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
|
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
|
||||||
const useAppStore: typeof import('./stores/appStore.js')['useAppStore']
|
const useAppStore: typeof import('./stores/appStore.js')['useAppStore']
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ const router = useRouter();
|
|||||||
const show = defineModel("show");
|
const show = defineModel("show");
|
||||||
import { useCascaderAreaData } from "@vant/area-data";
|
import { useCascaderAreaData } from "@vant/area-data";
|
||||||
import { showToast } from "vant"; // 引入 showToast 方法
|
import { showToast } from "vant"; // 引入 showToast 方法
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
const emit = defineEmits(); // 确保 emit 可以正确使用
|
const emit = defineEmits(); // 确保 emit 可以正确使用
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isSelf: {
|
isSelf: {
|
||||||
@@ -139,6 +140,7 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
const { isSelf, userName } = toRefs(props);
|
const { isSelf, userName } = toRefs(props);
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const form = ref({
|
const form = ref({
|
||||||
referrer: "",
|
referrer: "",
|
||||||
region: "",
|
region: "",
|
||||||
@@ -173,20 +175,22 @@ const getSmsCode = async () => {
|
|||||||
|
|
||||||
loadingSms.value = true;
|
loadingSms.value = true;
|
||||||
|
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
// 使用滑块验证码保护发送短信接口
|
||||||
.post({ mobile: form.value.mobile, actionType: "agentApply" })
|
runWithCaptcha(
|
||||||
.json();
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("auth/sendSms")
|
||||||
loadingSms.value = false;
|
.post({ mobile: form.value.mobile, actionType: "agentApply", captchaVerifyParam })
|
||||||
|
.json(),
|
||||||
if (data.value && !error.value) {
|
(res) => {
|
||||||
if (data.value.code === 200) {
|
loadingSms.value = false;
|
||||||
showToast({ message: "获取成功" });
|
if (res.code === 200) {
|
||||||
startCountdown(); // 启动倒计时
|
showToast({ message: "获取成功" });
|
||||||
} else {
|
startCountdown(); // 启动倒计时
|
||||||
showToast(data.value.msg);
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
};
|
};
|
||||||
let timer = null;
|
let timer = null;
|
||||||
|
|
||||||
|
|||||||
@@ -269,6 +269,12 @@ const featureMap = {
|
|||||||
name: "违约失信",
|
name: "违约失信",
|
||||||
component: defineAsyncComponent(() => import("@/ui/CFLXG3D56.vue")),
|
component: defineAsyncComponent(() => import("@/ui/CFLXG3D56.vue")),
|
||||||
},
|
},
|
||||||
|
// IVYZ0S0D:{
|
||||||
|
// name: "劳动仲裁信息查询(个人版)",
|
||||||
|
// component: defineAsyncComponent(() => import("@/ui/CIVYZ0S0D.vue")),
|
||||||
|
// remark: '劳动仲裁信息查询(个人版)用于查询个人在劳动仲裁方面的信息,包括劳动仲裁案件数量、劳动仲裁案件类型、劳动仲裁案件结果等。',
|
||||||
|
// },
|
||||||
|
|
||||||
|
|
||||||
FLXG0V4B: {
|
FLXG0V4B: {
|
||||||
name: "司法涉诉",
|
name: "司法涉诉",
|
||||||
@@ -381,10 +387,10 @@ const featureMap = {
|
|||||||
name: "逾期风险综述",
|
name: "逾期风险综述",
|
||||||
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")),
|
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")),
|
||||||
},
|
},
|
||||||
// DWBG8B4D_CourtInfo: {
|
DWBG8B4D_CourtInfo: {
|
||||||
// name: "法院曝光台信息",
|
name: "法院曝光台信息",
|
||||||
// component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")),
|
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")),
|
||||||
// },
|
},
|
||||||
DWBG8B4D_LoanEvaluation: {
|
DWBG8B4D_LoanEvaluation: {
|
||||||
name: "借贷评估",
|
name: "借贷评估",
|
||||||
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")),
|
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")),
|
||||||
@@ -470,10 +476,10 @@ const featureMap = {
|
|||||||
name: "关联风险监督",
|
name: "关联风险监督",
|
||||||
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
|
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
|
||||||
},
|
},
|
||||||
// DWBG6A2C_CourtRiskInfo: {
|
DWBG6A2C_CourtRiskInfo: {
|
||||||
// name: "法院风险信息",
|
name: "法院风险信息",
|
||||||
// component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
|
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
|
||||||
// },
|
},
|
||||||
// 贷款风险报告
|
// 贷款风险报告
|
||||||
JRZQ5E9F: {
|
JRZQ5E9F: {
|
||||||
name: "贷款风险评估",
|
name: "贷款风险评估",
|
||||||
@@ -678,6 +684,8 @@ const featureRiskLevels = {
|
|||||||
'QCXG7A2B': 10, // 名下车辆
|
'QCXG7A2B': 10, // 名下车辆
|
||||||
'JRZQ09J8': 10, // 收入评估
|
'JRZQ09J8': 10, // 收入评估
|
||||||
'JRZQ3C9R': 10, // 支付行为指数
|
'JRZQ3C9R': 10, // 支付行为指数
|
||||||
|
// 'IVYZ0S0D': 10, // 个人仲裁信息
|
||||||
|
|
||||||
|
|
||||||
// 🔵 低风险类 - 权重 3-5
|
// 🔵 低风险类 - 权重 3-5
|
||||||
'IVYZ5733': 4, // 婚姻状态
|
'IVYZ5733': 4, // 婚姻状态
|
||||||
@@ -685,6 +693,7 @@ const featureRiskLevels = {
|
|||||||
'IVYZ3P9M': 4, // 学历信息查询(实时版)
|
'IVYZ3P9M': 4, // 学历信息查询(实时版)
|
||||||
'IVYZ0S0D': 20, // 劳动仲裁信息
|
'IVYZ0S0D': 20, // 劳动仲裁信息
|
||||||
|
|
||||||
|
|
||||||
// 📊 复合报告类 - 按子模块动态计算
|
// 📊 复合报告类 - 按子模块动态计算
|
||||||
'DWBG8B4D': 0, // 谛听多维报告(由子模块计算)
|
'DWBG8B4D': 0, // 谛听多维报告(由子模块计算)
|
||||||
'DWBG6A2C': 0, // 司南报告(由子模块计算)
|
'DWBG6A2C': 0, // 司南报告(由子模块计算)
|
||||||
@@ -699,6 +708,7 @@ const featureRiskLevels = {
|
|||||||
'DWBG8B4D_LeasingRisk': 18,
|
'DWBG8B4D_LeasingRisk': 18,
|
||||||
'DWBG8B4D_RiskSupervision': 25,
|
'DWBG8B4D_RiskSupervision': 25,
|
||||||
'DWBG8B4D_RiskWarningTab': 30,
|
'DWBG8B4D_RiskWarningTab': 30,
|
||||||
|
'DWBG8B4D_CourtInfo': 31,
|
||||||
|
|
||||||
// 司南报告子模块
|
// 司南报告子模块
|
||||||
'DWBG6A2C_StandLiveInfo': 10,
|
'DWBG6A2C_StandLiveInfo': 10,
|
||||||
@@ -713,6 +723,7 @@ const featureRiskLevels = {
|
|||||||
'DWBG6A2C_CreditDetail': 15,
|
'DWBG6A2C_CreditDetail': 15,
|
||||||
'DWBG6A2C_RentalBehavior': 15,
|
'DWBG6A2C_RentalBehavior': 15,
|
||||||
'DWBG6A2C_RiskSupervision': 25,
|
'DWBG6A2C_RiskSupervision': 25,
|
||||||
|
'DWBG6A2C_CourtRiskInfo': 29,
|
||||||
|
|
||||||
// 贷款风险评估子模块
|
// 贷款风险评估子模块
|
||||||
'CJRZQ5E9F_RiskOverview': 25,
|
'CJRZQ5E9F_RiskOverview': 25,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useUserStore } from "@/stores/userStore";
|
|||||||
import { showToast } from "vant";
|
import { showToast } from "vant";
|
||||||
import useApiFetch from "@/composables/useApiFetch";
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
import { registerByInviteCode } from "@/api/agent";
|
import { registerByInviteCode } from "@/api/agent";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const emit = defineEmits(['register-success'])
|
const emit = defineEmits(['register-success'])
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -14,6 +15,7 @@ const route = useRoute();
|
|||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
||||||
const phoneNumber = ref("");
|
const phoneNumber = ref("");
|
||||||
const verificationCode = ref("");
|
const verificationCode = ref("");
|
||||||
@@ -80,26 +82,31 @@ async function sendVerificationCode() {
|
|||||||
showToast({ message: "请先输入邀请码" });
|
showToast({ message: "请先输入邀请码" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const actionType = hasAccount.value ? "bindMobile" : "agentApply";
|
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
const actionType = hasAccount.value ? "bindMobile" : "agentApply";
|
||||||
if (data.value.code === 200) {
|
|
||||||
showToast({ message: "获取成功" });
|
// 使用滑块验证码保护发送短信接口
|
||||||
startCountdown();
|
runWithCaptcha(
|
||||||
// 聚焦到验证码输入框
|
(captchaVerifyParam) =>
|
||||||
nextTick(() => {
|
useApiFetch("auth/sendSms")
|
||||||
const verificationCodeInput = document.getElementById('registerVerificationCode');
|
.post({ mobile: phoneNumber.value, actionType, captchaVerifyParam })
|
||||||
if (verificationCodeInput) {
|
.json(),
|
||||||
verificationCodeInput.focus();
|
(res) => {
|
||||||
}
|
if (res.code === 200) {
|
||||||
});
|
showToast({ message: "获取成功" });
|
||||||
} else {
|
startCountdown();
|
||||||
showToast(data.value.msg);
|
// 聚焦到验证码输入框
|
||||||
|
nextTick(() => {
|
||||||
|
const verificationCodeInput = document.getElementById('registerVerificationCode');
|
||||||
|
if (verificationCodeInput) {
|
||||||
|
verificationCodeInput.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, nextTick } from "vue";
|
import { ref, computed, nextTick } from "vue";
|
||||||
import { useDialogStore } from "@/stores/dialogStore";
|
import { useDialogStore } from "@/stores/dialogStore";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const emit = defineEmits(['bind-success'])
|
const emit = defineEmits(['bind-success'])
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
||||||
const phoneNumber = ref("");
|
const phoneNumber = ref("");
|
||||||
const verificationCode = ref("");
|
const verificationCode = ref("");
|
||||||
@@ -37,25 +39,29 @@ async function sendVerificationCode() {
|
|||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: "请输入有效的手机号" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType: "bindMobile" })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 使用滑块验证码保护发送短信接口
|
||||||
if (data.value.code === 200) {
|
runWithCaptcha(
|
||||||
showToast({ message: "获取成功" });
|
(captchaVerifyParam) =>
|
||||||
startCountdown();
|
useApiFetch("auth/sendSms")
|
||||||
// 聚焦到验证码输入框
|
.post({ mobile: phoneNumber.value, actionType: "bindMobile", captchaVerifyParam })
|
||||||
nextTick(() => {
|
.json(),
|
||||||
const verificationCodeInput = document.getElementById('bindPhoneVerificationCode');
|
(res) => {
|
||||||
if (verificationCodeInput) {
|
if (res.code === 200) {
|
||||||
verificationCodeInput.focus();
|
showToast({ message: "获取成功" });
|
||||||
}
|
startCountdown();
|
||||||
});
|
// 聚焦到验证码输入框
|
||||||
} else {
|
nextTick(() => {
|
||||||
showToast(data.value.msg);
|
const verificationCodeInput = document.getElementById('bindPhoneVerificationCode');
|
||||||
|
if (verificationCodeInput) {
|
||||||
|
verificationCodeInput.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ import { useRoute, useRouter } from "vue-router";
|
|||||||
import { useUserStore } from "@/stores/userStore";
|
import { useUserStore } from "@/stores/userStore";
|
||||||
import { useDialogStore } from "@/stores/dialogStore";
|
import { useDialogStore } from "@/stores/dialogStore";
|
||||||
import { useEnv } from "@/composables/useEnv";
|
import { useEnv } from "@/composables/useEnv";
|
||||||
import { showConfirmDialog } from "vant";
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
import Payment from "@/components/Payment.vue";
|
import Payment from "@/components/Payment.vue";
|
||||||
import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue";
|
import BindPhoneOnlyDialog from "@/components/BindPhoneOnlyDialog.vue";
|
||||||
@@ -200,6 +200,7 @@ const dialogStore = useDialogStore();
|
|||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const { isWeChat } = useEnv();
|
const { isWeChat } = useEnv();
|
||||||
const appStore = useAppStore();
|
const appStore = useAppStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
|
|
||||||
// 响应式数据
|
// 响应式数据
|
||||||
const showPayment = ref(false);
|
const showPayment = ref(false);
|
||||||
@@ -320,26 +321,11 @@ function handleBindSuccess() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理输入框点击事件
|
// 处理输入框点击事件(浏览/填写表单无需登录,仅付款时需要登录)
|
||||||
const handleInputClick = async () => {
|
const handleInputClick = async () => {
|
||||||
if (!isLoggedIn.value) {
|
// 已登录且在微信环境下未绑定手机号时,提示绑定
|
||||||
if (!isWeChat.value && props.type !== 'promotion') {
|
if (isLoggedIn.value && isWeChat.value && !userStore.mobile && props.type !== 'promotion') {
|
||||||
try {
|
dialogStore.openBindPhone();
|
||||||
await showConfirmDialog({
|
|
||||||
title: '提示',
|
|
||||||
message: '您需要登录后才能进行查询,是否前往登录?',
|
|
||||||
confirmButtonText: '前往登录',
|
|
||||||
cancelButtonText: '取消',
|
|
||||||
});
|
|
||||||
router.push('/login');
|
|
||||||
} catch {
|
|
||||||
// 用户点击取消,什么都不做
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isWeChat.value && !userStore.mobile && props.type !== 'promotion') {
|
|
||||||
dialogStore.openBindPhone();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -440,22 +426,27 @@ async function sendVerificationCode() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch("/auth/sendSms")
|
// 使用滑块验证码保护发送短信接口
|
||||||
.post({ mobile: formData.mobile, actionType: "query" })
|
runWithCaptcha(
|
||||||
.json();
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch("/auth/sendSms")
|
||||||
if (!error.value && data.value.code === 200) {
|
.post({ mobile: formData.mobile, actionType: "query", captchaVerifyParam })
|
||||||
showToast({ message: "验证码发送成功", type: "success" });
|
.json(),
|
||||||
startCountdown();
|
(res) => {
|
||||||
nextTick(() => {
|
if (res.code === 200) {
|
||||||
const verificationCodeInput = document.getElementById('verificationCode');
|
showToast({ message: "验证码发送成功", type: "success" });
|
||||||
if (verificationCodeInput) {
|
startCountdown();
|
||||||
verificationCodeInput.focus();
|
nextTick(() => {
|
||||||
|
const verificationCodeInput = document.getElementById('verificationCode');
|
||||||
|
if (verificationCodeInput) {
|
||||||
|
verificationCodeInput.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
showToast({ message: res.msg || "验证码发送失败,请重试" });
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
} else {
|
);
|
||||||
showToast({ message: "验证码发送失败,请重试" });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let timer = null;
|
let timer = null;
|
||||||
|
|||||||
@@ -6,11 +6,14 @@ import { useAgentStore } from "@/stores/agentStore";
|
|||||||
import { useUserStore } from "@/stores/userStore";
|
import { useUserStore } from "@/stores/userStore";
|
||||||
import { showToast } from "vant";
|
import { showToast } from "vant";
|
||||||
import { realNameAuth } from "@/api/agent";
|
import { realNameAuth } from "@/api/agent";
|
||||||
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
|
import { useAliyunCaptcha } from "@/composables/useAliyunCaptcha";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dialogStore = useDialogStore();
|
const dialogStore = useDialogStore();
|
||||||
const agentStore = useAgentStore();
|
const agentStore = useAgentStore();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha();
|
||||||
// 表单数据
|
// 表单数据
|
||||||
const realName = ref("");
|
const realName = ref("");
|
||||||
const idCard = ref("");
|
const idCard = ref("");
|
||||||
@@ -59,18 +62,22 @@ async function sendVerificationCode() {
|
|||||||
showToast({ message: "请输入有效的手机号" });
|
showToast({ message: "请输入有效的手机号" });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { data, error } = await useApiFetch("auth/sendSms")
|
|
||||||
.post({ mobile: phoneNumber.value, actionType: "realName" })
|
|
||||||
.json();
|
|
||||||
|
|
||||||
if (data.value && !error.value) {
|
// 使用滑块验证码保护发送短信接口
|
||||||
if (data.value.code === 200) {
|
runWithCaptcha(
|
||||||
showToast({ message: "获取成功" });
|
(captchaVerifyParam) =>
|
||||||
startCountdown();
|
useApiFetch("auth/sendSms")
|
||||||
} else {
|
.post({ mobile: phoneNumber.value, actionType: "realName", captchaVerifyParam })
|
||||||
showToast(data.value.msg);
|
.json(),
|
||||||
|
(res) => {
|
||||||
|
if (res.code === 200) {
|
||||||
|
showToast({ message: "获取成功" });
|
||||||
|
startCountdown();
|
||||||
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
172
src/composables/useAliyunCaptcha.js
Normal file
172
src/composables/useAliyunCaptcha.js
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
import { showToast, showLoadingToast, closeToast } from "vant";
|
||||||
|
import useApiFetch from "@/composables/useApiFetch";
|
||||||
|
|
||||||
|
// 阿里云验证码场景 ID
|
||||||
|
const ALIYUN_CAPTCHA_SCENE_ID = "wynt39to";
|
||||||
|
// 是否启用加密模式(通过环境变量控制,非加密模式时前端不调用后端获取 EncryptedSceneId)
|
||||||
|
const ENABLE_ENCRYPTED =
|
||||||
|
import.meta.env.VITE_ALIYUN_CAPTCHA_ENCRYPTED === "false";
|
||||||
|
|
||||||
|
let captchaInitialised = false;
|
||||||
|
/** 首次初始化后,SDK 会异步调用 getInstance,用此 Promise 在实例就绪后再 show */
|
||||||
|
let captchaReadyPromise = null;
|
||||||
|
let captchaReadyResolve = null;
|
||||||
|
|
||||||
|
async function ensureCaptchaInit() {
|
||||||
|
if (captchaInitialised || typeof window === "undefined") return;
|
||||||
|
if (typeof window.initAliyunCaptcha !== "function") return;
|
||||||
|
|
||||||
|
captchaInitialised = true;
|
||||||
|
window.captcha = null;
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
captchaReadyPromise = new Promise((resolve) => {
|
||||||
|
captchaReadyResolve = resolve;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 非加密模式:仅传 SceneId,不调用后端接口
|
||||||
|
if (!ENABLE_ENCRYPTED) {
|
||||||
|
window.initAliyunCaptcha({
|
||||||
|
SceneId: ALIYUN_CAPTCHA_SCENE_ID,
|
||||||
|
mode: "popup",
|
||||||
|
element: "#captcha-element",
|
||||||
|
getInstance(instance) {
|
||||||
|
window.captcha = instance;
|
||||||
|
if (typeof captchaReadyResolve === "function") {
|
||||||
|
captchaReadyResolve();
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
captchaVerifyCallback(param) {
|
||||||
|
return typeof window.__captchaVerifyCallback === "function"
|
||||||
|
? window.__captchaVerifyCallback(param)
|
||||||
|
: Promise.resolve({
|
||||||
|
captchaResult: false,
|
||||||
|
bizResult: false,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onBizResultCallback(bizResult) {
|
||||||
|
if (typeof window.__onBizResultCallback === "function") {
|
||||||
|
window.__onBizResultCallback(bizResult);
|
||||||
|
}
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
},
|
||||||
|
slideStyle: { width: 360, height: 40 },
|
||||||
|
language: "cn",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密模式:先从后端获取 EncryptedSceneId,再初始化
|
||||||
|
const { data, error } = await useApiFetch("/captcha/encryptedSceneId")
|
||||||
|
.post()
|
||||||
|
.json();
|
||||||
|
const resp = data?.value;
|
||||||
|
const encryptedSceneId = resp?.data?.encryptedSceneId;
|
||||||
|
if (error?.value || !encryptedSceneId) {
|
||||||
|
showToast({ message: "获取验证码参数失败,请稍后重试" });
|
||||||
|
captchaInitialised = false;
|
||||||
|
captchaReadyPromise = null;
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.initAliyunCaptcha({
|
||||||
|
SceneId: ALIYUN_CAPTCHA_SCENE_ID,
|
||||||
|
EncryptedSceneId: encryptedSceneId,
|
||||||
|
mode: "popup",
|
||||||
|
element: "#captcha-element",
|
||||||
|
getInstance(instance) {
|
||||||
|
window.captcha = instance;
|
||||||
|
if (typeof captchaReadyResolve === "function") {
|
||||||
|
captchaReadyResolve();
|
||||||
|
captchaReadyResolve = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
captchaVerifyCallback(param) {
|
||||||
|
return typeof window.__captchaVerifyCallback === "function"
|
||||||
|
? window.__captchaVerifyCallback(param)
|
||||||
|
: Promise.resolve({ captchaResult: false, bizResult: false });
|
||||||
|
},
|
||||||
|
onBizResultCallback(bizResult) {
|
||||||
|
if (typeof window.__onBizResultCallback === "function") {
|
||||||
|
window.__onBizResultCallback(bizResult);
|
||||||
|
}
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
window.__onCaptchaBizSuccess = null;
|
||||||
|
},
|
||||||
|
slideStyle: { width: 360, height: 40 },
|
||||||
|
language: "cn",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阿里云滑块验证码通用封装。
|
||||||
|
* 依赖 index.html 中已加载的 AliyunCaptcha.js;初始化在首次调起时执行。
|
||||||
|
*
|
||||||
|
* @param { (captchaVerifyParam: string) => Promise<{ data: Ref, error: Ref }> } bizVerify - 业务请求函数,接收滑块参数,返回 useApiFetch 的 { data, error }
|
||||||
|
* @param { (res: any) => void } [onSuccess] - 业务成功回调(code===200 时调用,传入接口返回的 data.value)
|
||||||
|
*/
|
||||||
|
export function useAliyunCaptcha() {
|
||||||
|
/**
|
||||||
|
* 先弹出滑块,通过后执行 bizVerify(captchaVerifyParam),再根据结果调用 onSuccess。
|
||||||
|
*/
|
||||||
|
async function runWithCaptcha(bizVerify, onSuccess) {
|
||||||
|
if (typeof window === "undefined") {
|
||||||
|
showToast({ message: "验证码仅支持浏览器环境" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const loading = showLoadingToast({
|
||||||
|
message: "安全验证加载中...",
|
||||||
|
forbidClick: true,
|
||||||
|
duration: 0,
|
||||||
|
loadingType: "spinner",
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
window.__captchaVerifyCallback = async (captchaVerifyParam) => {
|
||||||
|
window.__lastBizResponse = null;
|
||||||
|
const { data, error } = await bizVerify(captchaVerifyParam);
|
||||||
|
const result = data?.value ?? data;
|
||||||
|
if (error?.value || !result) {
|
||||||
|
return { captchaResult: false, bizResult: false };
|
||||||
|
}
|
||||||
|
window.__lastBizResponse = result;
|
||||||
|
const captchaOk = result.captchaVerifyResult !== false;
|
||||||
|
const bizOk = result.code === 200;
|
||||||
|
return { captchaResult: captchaOk, bizResult: bizOk };
|
||||||
|
};
|
||||||
|
|
||||||
|
window.__onBizResultCallback = (bizResult) => {
|
||||||
|
if (
|
||||||
|
bizResult === true &&
|
||||||
|
window.__lastBizResponse &&
|
||||||
|
typeof window.__onCaptchaBizSuccess === "function"
|
||||||
|
) {
|
||||||
|
window.__onCaptchaBizSuccess(window.__lastBizResponse);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
await ensureCaptchaInit();
|
||||||
|
|
||||||
|
// 首次初始化时 SDK 会异步调用 getInstance,需等待实例就绪后再 show
|
||||||
|
if (captchaReadyPromise) {
|
||||||
|
await captchaReadyPromise;
|
||||||
|
captchaReadyPromise = null;
|
||||||
|
}
|
||||||
|
if (!window.captcha) {
|
||||||
|
showToast({ message: "验证码未加载,请刷新页面重试" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.__onCaptchaBizSuccess = onSuccess;
|
||||||
|
window.captcha.show();
|
||||||
|
} finally {
|
||||||
|
closeToast();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { runWithCaptcha };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useAliyunCaptcha;
|
||||||
@@ -6,12 +6,12 @@ export function useSEO() {
|
|||||||
|
|
||||||
// 默认SEO信息
|
// 默认SEO信息
|
||||||
const defaultSEO = {
|
const defaultSEO = {
|
||||||
title: "全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
title: "全能查官网_个人婚姻状态报告_综合风险排查工具箱",
|
||||||
description:
|
description:
|
||||||
"全能查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。",
|
"全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。",
|
||||||
keywords:
|
keywords:
|
||||||
"大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询",
|
"全能查,婚姻状态核实,风险排查工具,个人风险预警,第三方背调,商业信用评估",
|
||||||
url: "https://www.zhinengcha.cn",
|
url: "https://www.quannengcha.com",
|
||||||
};
|
};
|
||||||
|
|
||||||
// 页面SEO配置
|
// 页面SEO配置
|
||||||
@@ -137,7 +137,7 @@ export function useSEO() {
|
|||||||
mainEntity: {
|
mainEntity: {
|
||||||
"@type": "Organization",
|
"@type": "Organization",
|
||||||
name: "全能查",
|
name: "全能查",
|
||||||
url: "https://www.zhinengcha.cn/",
|
url: "https://www.quannengcha.com/",
|
||||||
description:
|
description:
|
||||||
"专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
"专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
||||||
},
|
},
|
||||||
@@ -153,11 +153,59 @@ export function useSEO() {
|
|||||||
const updateSEOByRoute = () => {
|
const updateSEOByRoute = () => {
|
||||||
const routeConfigs = {
|
const routeConfigs = {
|
||||||
"/": {
|
"/": {
|
||||||
title: "全能查|大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
|
title: "全能查官网_个人婚姻状态报告_综合风险排查工具箱",
|
||||||
description:
|
description:
|
||||||
"全能查,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。",
|
"全能查是您的掌上风控工具箱。平台基于合规数据,提供个人婚姻状态分析、职场背调及黑名单筛查服务。无需繁琐流程,客观中立,一键生成包含婚姻涉诉历史与家庭风险的综合报告,助您快速识别潜在隐患。",
|
||||||
keywords:
|
keywords:
|
||||||
"大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询",
|
"全能查,婚姻状态核实,风险排查工具,个人风险预警,第三方背调,商业信用评估",
|
||||||
|
},
|
||||||
|
"/agent/system-guide": {
|
||||||
|
title: "全能查合作政策指南_合作伙伴权益与结算说明_官方文档",
|
||||||
|
description:
|
||||||
|
"全能查官方合作体系说明文档。详细解读合作伙伴的等级权益、服务费结算标准及晋升机制。致力于构建公平、透明的商业合作生态,助力合作伙伴快速上手业务。",
|
||||||
|
keywords: "合作伙伴政策,服务费结算,渠道等级说明,业务操作指南,代理系统后台",
|
||||||
|
},
|
||||||
|
|
||||||
|
// 个人查询
|
||||||
|
'/inquire/riskassessment': {
|
||||||
|
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: '保姆背景核验,家政风险筛查,月嫂司法记录,雇佣安全评估,家政人员核验'
|
||||||
|
},
|
||||||
|
'/inquire/consumerFinanceReport': {
|
||||||
|
title: '个人履约能力评估_经济风险与收支压力参考_全能查',
|
||||||
|
description: '全能查履约报告基于大数据算法,提供个人经济稳定性的客观分析。多维度检测综合履约分、经济关联风险及潜在的资金压力指数。本服务仅提供大数据层面的风险参考,助您优化财务管理。',
|
||||||
|
keywords: '履约能力评估,经济风险指数,综合评分波动,资金压力分析,财务健康度'
|
||||||
},
|
},
|
||||||
"/agent": {
|
"/agent": {
|
||||||
title: "全能查代理 - 免费开通代理权限 | 大数据风险报告代理",
|
title: "全能查代理 - 免费开通代理权限 | 大数据风险报告代理",
|
||||||
@@ -191,6 +239,11 @@ export function useSEO() {
|
|||||||
"全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。",
|
"全能查客服中心,提供在线客服支持、技术咨询、问题反馈等服务,确保用户获得及时有效的帮助。",
|
||||||
keywords: "客服中心, 在线客服, 技术支持, 问题反馈, 全能查客服",
|
keywords: "客服中心, 在线客服, 技术支持, 问题反馈, 全能查客服",
|
||||||
},
|
},
|
||||||
|
"/promote": {
|
||||||
|
title: "全能查合伙人计划_风控平台系统招商_渠道合作平台_全能查",
|
||||||
|
description:"全能查开放全国渠道合作,提供零门槛的风险评估系统接入服务。一键开通独立后台,支持婚恋、职场、家政及商业风控等多场景报告推广。正规项目,结算透明,赋能流量方实现合规商业价值。",
|
||||||
|
keywords:"风控系统代理,风险评估平台招商,平台渠道合作,企业服务创业,全能查合伙人",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentPath = route?.path || "/";
|
const currentPath = route?.path || "/";
|
||||||
@@ -198,7 +251,7 @@ export function useSEO() {
|
|||||||
|
|
||||||
updateSEO({
|
updateSEO({
|
||||||
...config,
|
...config,
|
||||||
url: `https://www.zhinengcha.cn${currentPath}`,
|
url: `https://www.quannengcha.com${currentPath}`,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -509,7 +509,7 @@ router.afterEach((to) => {
|
|||||||
const seoConfig = {
|
const seoConfig = {
|
||||||
title: `${to.meta.title} - 全能查`,
|
title: `${to.meta.title} - 全能查`,
|
||||||
description: `全能查${to.meta.title}页面,提供专业的大数据风险管控服务。`,
|
description: `全能查${to.meta.title}页面,提供专业的大数据风险管控服务。`,
|
||||||
url: `https://www.zhinengcha.cn${to.path}`,
|
url: `https://www.quannengcha.com${to.path}`,
|
||||||
};
|
};
|
||||||
updateSEO(seoConfig);
|
updateSEO(seoConfig);
|
||||||
}
|
}
|
||||||
|
|||||||
481
src/ui/CIVYZ0S0D.vue
Normal file
481
src/ui/CIVYZ0S0D.vue
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from 'vue';
|
||||||
|
|
||||||
|
// 接收父组件传入的 props
|
||||||
|
const props = defineProps({
|
||||||
|
data: Object,
|
||||||
|
params: Object,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 定义组件名称,用于在控制台输出调试信息
|
||||||
|
const componentName = 'IVYZ0S0D';
|
||||||
|
|
||||||
|
// 将 props.data 赋值给 reportData 变量
|
||||||
|
let reportData: any = props.data || {};
|
||||||
|
|
||||||
|
// 如果 reportData 不为空,则将其赋值给变量
|
||||||
|
if (reportData) {
|
||||||
|
console.log(`${componentName} 组件接收到的数据:`, reportData);
|
||||||
|
} else {
|
||||||
|
console.log(`${componentName} 组件未接收到数据`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取状态描述文本
|
||||||
|
const getStatusText = (value: number) => {
|
||||||
|
if (value === 1) return '未命中';
|
||||||
|
if (value === 2) return '命中';
|
||||||
|
return '未知';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取通知函状态描述文本
|
||||||
|
const getNoticeLetterStatusText = (value: number) => {
|
||||||
|
if (value === 1) return '未命中';
|
||||||
|
if (value === 2) return '命中';
|
||||||
|
return '未知';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取通知函期间描述文本
|
||||||
|
const getNoticeLetterPeriodText = (period: number) => {
|
||||||
|
const periodMap: Record<number, string> = {
|
||||||
|
0: '没有被发送通知函',
|
||||||
|
1: '近2年内',
|
||||||
|
2: '2-4年',
|
||||||
|
3: '5年以上'
|
||||||
|
};
|
||||||
|
|
||||||
|
return periodMap[period] || '未知期间';
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取背景颜色
|
||||||
|
const getBackgroundColor = (value: number) => {
|
||||||
|
if (value === 1) return '#e8f5e8'; // 浅绿色
|
||||||
|
if (value === 2) return '#ffe8e8'; // 浅红色
|
||||||
|
return '#f5f5f5'; // 默认灰色
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取边框颜色
|
||||||
|
const getBorderColor = (value: number) => {
|
||||||
|
if (value === 1) return '#4caf50'; // 绿色边框
|
||||||
|
if (value === 2) return '#f44336'; // 红色边框
|
||||||
|
return '#ccc'; // 默认灰色边框
|
||||||
|
};
|
||||||
|
|
||||||
|
// 判断是否应该隐藏该条目(如果是带时间范围的"未命中")
|
||||||
|
const shouldHideItem = (itemText: string) => {
|
||||||
|
// 检查是否包含时间范围关键词并且结果是"未命中"
|
||||||
|
const timeRangeKeywords = ['近2年', '近3年', '近4年', '近5年', '2-4年', '5年以上'];
|
||||||
|
const isTimeRangeItem = timeRangeKeywords.some(keyword => itemText.includes(keyword));
|
||||||
|
const isNoRisk = itemText.includes('未命中');
|
||||||
|
|
||||||
|
// 如果是时间范围项目且结果是"未命中",则隐藏
|
||||||
|
return isTimeRangeItem && isNoRisk;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取风险类型数组 - 所有模块都显示
|
||||||
|
const riskTypes = computed(() => {
|
||||||
|
const risks: {title: string, value: number, details: string | string[], bgColor: string, borderColor: string}[] = [];
|
||||||
|
|
||||||
|
// 总体风险
|
||||||
|
if (reportData.risk_flag !== undefined) {
|
||||||
|
risks.push({
|
||||||
|
title: '总体风险',
|
||||||
|
value: reportData.risk_flag,
|
||||||
|
details: getStatusText(reportData.risk_flag),
|
||||||
|
bgColor: getBackgroundColor(reportData.risk_flag),
|
||||||
|
borderColor: getBorderColor(reportData.risk_flag)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 失信风险
|
||||||
|
if (reportData.dishonesty && reportData.dishonesty.dishonesty !== undefined) {
|
||||||
|
risks.push({
|
||||||
|
title: '失信风险',
|
||||||
|
value: reportData.dishonesty.dishonesty,
|
||||||
|
details: getStatusText(reportData.dishonesty.dishonesty),
|
||||||
|
bgColor: getBackgroundColor(reportData.dishonesty.dishonesty),
|
||||||
|
borderColor: getBorderColor(reportData.dishonesty.dishonesty)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 高消费限制风险
|
||||||
|
if (reportData.high_consumption && reportData.high_consumption.high_consumption !== undefined) {
|
||||||
|
risks.push({
|
||||||
|
title: '高消费限制风险',
|
||||||
|
value: reportData.high_consumption.high_consumption,
|
||||||
|
details: getStatusText(reportData.high_consumption.high_consumption),
|
||||||
|
bgColor: getBackgroundColor(reportData.high_consumption.high_consumption),
|
||||||
|
borderColor: getBorderColor(reportData.high_consumption.high_consumption)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 劳动争议风险
|
||||||
|
if (reportData.labor_disputes) {
|
||||||
|
let details: string[] = [];
|
||||||
|
if (reportData.labor_disputes.labor_disputes !== undefined) {
|
||||||
|
details.push(`当前: ${getStatusText(reportData.labor_disputes.labor_disputes)}`);
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_disputes_3y !== undefined) {
|
||||||
|
const detail = `近3年: ${getStatusText(reportData.labor_disputes.labor_disputes_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_disputes_5y !== undefined) {
|
||||||
|
const detail = `近5年: ${getStatusText(reportData.labor_disputes.labor_disputes_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_contract !== undefined) {
|
||||||
|
details.push(`劳动合同: ${getStatusText(reportData.labor_disputes.labor_contract)}`);
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_relation !== undefined) {
|
||||||
|
details.push(`劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation)}`);
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_relation_3y !== undefined) {
|
||||||
|
const detail = `近3年劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.labor_disputes.labor_relation_5y !== undefined) {
|
||||||
|
const detail = `近5年劳动关系: ${getStatusText(reportData.labor_disputes.labor_relation_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (details.length > 0) {
|
||||||
|
risks.push({
|
||||||
|
title: '劳动争议风险',
|
||||||
|
value: Math.max(...Object.values(reportData.labor_disputes).filter(v => typeof v === 'number')),
|
||||||
|
details: details,
|
||||||
|
bgColor: getBackgroundColor(Math.max(...Object.values(reportData.labor_disputes).filter(v => typeof v === 'number'))),
|
||||||
|
borderColor: getBorderColor(Math.max(...Object.values(reportData.labor_disputes).filter(v => typeof v === 'number')))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 社会保险纠纷风险
|
||||||
|
if (reportData.social_insurance) {
|
||||||
|
let details: string[] = [];
|
||||||
|
if (reportData.social_insurance.social_insurance !== undefined) {
|
||||||
|
details.push(`社保纠纷: ${getStatusText(reportData.social_insurance.social_insurance)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.pension !== undefined) {
|
||||||
|
details.push(`养老纠纷: ${getStatusText(reportData.social_insurance.pension)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.pension_3y !== undefined) {
|
||||||
|
const detail = `近3年养老: ${getStatusText(reportData.social_insurance.pension_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.pension_5y !== undefined) {
|
||||||
|
const detail = `近5年养老: ${getStatusText(reportData.social_insurance.pension_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.injury_insurance !== undefined) {
|
||||||
|
details.push(`工伤纠纷: ${getStatusText(reportData.social_insurance.injury_insurance)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.injury_insurance_3y !== undefined) {
|
||||||
|
const detail = `近3年工伤: ${getStatusText(reportData.social_insurance.injury_insurance_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.injury_insurance_5y !== undefined) {
|
||||||
|
const detail = `近5年工伤: ${getStatusText(reportData.social_insurance.injury_insurance_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.unemployment_insurance !== undefined) {
|
||||||
|
details.push(`失业纠纷: ${getStatusText(reportData.social_insurance.unemployment_insurance)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.unemployment_insurance_3y !== undefined) {
|
||||||
|
const detail = `近3年失业: ${getStatusText(reportData.social_insurance.unemployment_insurance_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.unemployment_insurance_5y !== undefined) {
|
||||||
|
const detail = `近5年失业: ${getStatusText(reportData.social_insurance.unemployment_insurance_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.medical_insurance !== undefined) {
|
||||||
|
details.push(`医疗纠纷: ${getStatusText(reportData.social_insurance.medical_insurance)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.medical_insurance_3y !== undefined) {
|
||||||
|
const detail = `近3年医疗: ${getStatusText(reportData.social_insurance.medical_insurance_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.medical_insurance_5y !== undefined) {
|
||||||
|
const detail = `近5年医疗: ${getStatusText(reportData.social_insurance.medical_insurance_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.maternity_insurance !== undefined) {
|
||||||
|
details.push(`生育纠纷: ${getStatusText(reportData.social_insurance.maternity_insurance)}`);
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.maternity_insurance_3y !== undefined) {
|
||||||
|
const detail = `近3年生育: ${getStatusText(reportData.social_insurance.maternity_insurance_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.social_insurance.maternity_insurance_5y !== undefined) {
|
||||||
|
const detail = `近5年生育: ${getStatusText(reportData.social_insurance.maternity_insurance_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (details.length > 0) {
|
||||||
|
risks.push({
|
||||||
|
title: '社会保险纠纷风险',
|
||||||
|
value: Math.max(...Object.values(reportData.social_insurance).filter(v => typeof v === 'number')),
|
||||||
|
details: details,
|
||||||
|
bgColor: getBackgroundColor(Math.max(...Object.values(reportData.social_insurance).filter(v => typeof v === 'number'))),
|
||||||
|
borderColor: getBorderColor(Math.max(...Object.values(reportData.social_insurance).filter(v => typeof v === 'number')))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 福利待遇纠纷
|
||||||
|
if (reportData.welfare_disputes && reportData.welfare_disputes.welfare !== undefined) {
|
||||||
|
risks.push({
|
||||||
|
title: '福利待遇纠纷',
|
||||||
|
value: reportData.welfare_disputes.welfare,
|
||||||
|
details: getStatusText(reportData.welfare_disputes.welfare),
|
||||||
|
bgColor: getBackgroundColor(reportData.welfare_disputes.welfare),
|
||||||
|
borderColor: getBorderColor(reportData.welfare_disputes.welfare)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 人事争议类纠纷
|
||||||
|
if (reportData.personnel_disputes) {
|
||||||
|
let details: string[] = [];
|
||||||
|
if (reportData.personnel_disputes.personnel_dispute !== undefined) {
|
||||||
|
details.push(`人事争议: ${getStatusText(reportData.personnel_disputes.personnel_dispute)}`);
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.resignation_dispute !== undefined) {
|
||||||
|
details.push(`辞职争议: ${getStatusText(reportData.personnel_disputes.resignation_dispute)}`);
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.resignation_dispute_3y !== undefined) {
|
||||||
|
const detail = `近3年辞职: ${getStatusText(reportData.personnel_disputes.resignation_dispute_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.resignation_dispute_5y !== undefined) {
|
||||||
|
const detail = `近5年辞职: ${getStatusText(reportData.personnel_disputes.resignation_dispute_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.dismissal_dispute !== undefined) {
|
||||||
|
details.push(`辞退争议: ${getStatusText(reportData.personnel_disputes.dismissal_dispute)}`);
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.dismissal_dispute_3y !== undefined) {
|
||||||
|
const detail = `近3年辞退: ${getStatusText(reportData.personnel_disputes.dismissal_dispute_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.personnel_disputes.dismissal_dispute_5y !== undefined) {
|
||||||
|
const detail = `近5年辞退: ${getStatusText(reportData.personnel_disputes.dismissal_dispute_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (details.length > 0) {
|
||||||
|
risks.push({
|
||||||
|
title: '人事争议类纠纷',
|
||||||
|
value: Math.max(...Object.values(reportData.personnel_disputes).filter(v => typeof v === 'number')),
|
||||||
|
details: details,
|
||||||
|
bgColor: getBackgroundColor(Math.max(...Object.values(reportData.personnel_disputes).filter(v => typeof v === 'number'))),
|
||||||
|
borderColor: getBorderColor(Math.max(...Object.values(reportData.personnel_disputes).filter(v => typeof v === 'number')))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 仲裁相关案件
|
||||||
|
if (reportData.arbitration) {
|
||||||
|
let details: string[] = [];
|
||||||
|
if (reportData.arbitration.arbitration_confirmation !== undefined) {
|
||||||
|
details.push(`仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation)}`);
|
||||||
|
}
|
||||||
|
if (reportData.arbitration.arbitration_confirmation_3y !== undefined) {
|
||||||
|
const detail = `近3年仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.arbitration.arbitration_confirmation_5y !== undefined) {
|
||||||
|
const detail = `近5年仲裁确认: ${getStatusText(reportData.arbitration.arbitration_confirmation_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.arbitration.arbitration_revocation !== undefined) {
|
||||||
|
details.push(`仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation)}`);
|
||||||
|
}
|
||||||
|
if (reportData.arbitration.arbitration_revocation_3y !== undefined) {
|
||||||
|
const detail = `近3年仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation_3y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (reportData.arbitration.arbitration_revocation_5y !== undefined) {
|
||||||
|
const detail = `近5年仲裁撤销: ${getStatusText(reportData.arbitration.arbitration_revocation_5y)}`;
|
||||||
|
if (!shouldHideItem(detail)) {
|
||||||
|
details.push(detail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (details.length > 0) {
|
||||||
|
risks.push({
|
||||||
|
title: '仲裁相关案件',
|
||||||
|
value: Math.max(...Object.values(reportData.arbitration).filter(v => typeof v === 'number')),
|
||||||
|
details: details,
|
||||||
|
bgColor: getBackgroundColor(Math.max(...Object.values(reportData.arbitration).filter(v => typeof v === 'number'))),
|
||||||
|
borderColor: getBorderColor(Math.max(...Object.values(reportData.arbitration).filter(v => typeof v === 'number')))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通知函触达
|
||||||
|
if (reportData.notice_letter && reportData.notice_letter.notice_letter !== undefined) {
|
||||||
|
let statusText = getNoticeLetterStatusText(reportData.notice_letter.notice_letter);
|
||||||
|
let periodText = '';
|
||||||
|
|
||||||
|
if (reportData.notice_letter.notice_letter_period !== undefined) {
|
||||||
|
periodText = `期间: ${getNoticeLetterPeriodText(reportData.notice_letter.notice_letter_period)}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const detailParts = [`状态: ${statusText}`];
|
||||||
|
if (periodText) {
|
||||||
|
detailParts.push(periodText);
|
||||||
|
}
|
||||||
|
|
||||||
|
risks.push({
|
||||||
|
title: '通知函触达',
|
||||||
|
value: reportData.notice_letter.notice_letter,
|
||||||
|
details: detailParts,
|
||||||
|
bgColor: getBackgroundColor(reportData.notice_letter.notice_letter),
|
||||||
|
borderColor: getBorderColor(reportData.notice_letter.notice_letter)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return risks;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 检查是否至少有一个数据类别有内容
|
||||||
|
const hasAnyData = computed(() => {
|
||||||
|
return riskTypes.value.length > 0;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="ivyz0s0d-container">
|
||||||
|
<!-- 风险卡片网格 -->
|
||||||
|
<div v-if="hasAnyData" class="risk-cards-grid">
|
||||||
|
<div
|
||||||
|
v-for="(risk, index) in riskTypes"
|
||||||
|
:key="index"
|
||||||
|
class="risk-card"
|
||||||
|
:style="{ backgroundColor: risk.bgColor, borderLeft: `4px solid ${risk.borderColor}` }"
|
||||||
|
>
|
||||||
|
<div class="risk-card__content">
|
||||||
|
<h4 class="risk-card__title">{{ risk.title }}</h4>
|
||||||
|
<div class="risk-card__status">
|
||||||
|
<!-- 当 details 是字符串时显示单行 -->
|
||||||
|
<p v-if="typeof risk.details === 'string'" class="risk-detail-item">{{ risk.details }}</p>
|
||||||
|
<!-- 当 details 是数组时,每项占一行 -->
|
||||||
|
<p
|
||||||
|
v-else
|
||||||
|
v-for="(detail, idx) in risk.details"
|
||||||
|
:key="idx"
|
||||||
|
class="risk-detail-item"
|
||||||
|
>{{ detail }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 无数据提示 -->
|
||||||
|
<div v-if="!hasAnyData" class="no-data">
|
||||||
|
<p>暂无相关风险数据</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.ivyz0s0d-container {
|
||||||
|
padding: 20px;
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-cards-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
||||||
|
gap: 15px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-card {
|
||||||
|
border: 1px solid #e0e0e0;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 15px;
|
||||||
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
||||||
|
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-card:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-card__content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-card__title {
|
||||||
|
margin: 0 0 8px 0;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-card__status {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-detail-item {
|
||||||
|
margin: 0 0 4px 0;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.risk-detail-item:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-data {
|
||||||
|
text-align: center;
|
||||||
|
color: #999;
|
||||||
|
font-style: italic;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -18,45 +18,127 @@ const feature = ref(route.params.feature);
|
|||||||
// 获取产品信息
|
// 获取产品信息
|
||||||
const featureData = ref({});
|
const featureData = ref({});
|
||||||
|
|
||||||
// 检查是否可以查询:已登录且已绑定手机号
|
// 检查是否可以查询:不需要登录,直接允许查询
|
||||||
const canQuery = computed(() => {
|
const canQuery = computed(() => {
|
||||||
return isLoggedIn.value && mobile.value && mobile.value.trim() !== '';
|
return true; // 允许未登录用户查询
|
||||||
});
|
});
|
||||||
|
|
||||||
// 检查登录状态和手机号绑定
|
// 初始化:检查支付回调并加载产品信息
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// 检查支付回调
|
// 检查支付回调
|
||||||
isFinishPayment();
|
isFinishPayment();
|
||||||
|
|
||||||
// 检查是否已登录
|
// 如果有 token,尝试加载用户信息(但不强制)
|
||||||
const token = localStorage.getItem("token");
|
const token = localStorage.getItem("token");
|
||||||
if (!token) {
|
if (token) {
|
||||||
showToast({ message: "请先登录才能使用查询功能" });
|
try {
|
||||||
router.replace("/login");
|
await userStore.fetchUserInfo();
|
||||||
return;
|
} catch (error) {
|
||||||
|
console.warn("获取用户信息失败(可选):", error);
|
||||||
|
// 不影响查询功能,继续执行
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户信息(包括手机号)
|
// 添加婚姻查询的特殊处理
|
||||||
try {
|
if (feature.value === 'marriage') {
|
||||||
await userStore.fetchUserInfo();
|
showMarriageUpgradeNotice();
|
||||||
} catch (error) {
|
|
||||||
console.error("获取用户信息失败:", error);
|
|
||||||
showToast({ message: "获取用户信息失败,请重新登录" });
|
|
||||||
router.replace("/login");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否已绑定手机号
|
// 直接加载产品信息,不需要登录
|
||||||
if (!mobile.value || mobile.value.trim() === '') {
|
|
||||||
showToast({ message: "请先绑定手机号才能使用查询功能" });
|
|
||||||
router.replace("/me");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 已登录且已绑定手机号,可以查询
|
|
||||||
await getProduct();
|
await getProduct();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function showMarriageUpgradeNotice() {
|
||||||
|
// 创建自定义弹窗
|
||||||
|
const modal = document.createElement('div');
|
||||||
|
modal.style.position = 'fixed';
|
||||||
|
modal.style.top = '0';
|
||||||
|
modal.style.left = '0';
|
||||||
|
modal.style.width = '100%';
|
||||||
|
modal.style.height = '100%';
|
||||||
|
modal.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
|
||||||
|
modal.style.display = 'flex';
|
||||||
|
modal.style.justifyContent = 'center';
|
||||||
|
modal.style.alignItems = 'center';
|
||||||
|
modal.style.zIndex = '9999';
|
||||||
|
|
||||||
|
modal.innerHTML = `
|
||||||
|
<div style="
|
||||||
|
background: white;
|
||||||
|
border-radius: 12px;
|
||||||
|
padding: 24px;
|
||||||
|
margin: 20px;
|
||||||
|
max-width: 400px;
|
||||||
|
width: 90%;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
|
||||||
|
position: relative;
|
||||||
|
overflow-y: auto;
|
||||||
|
max-height: 90vh;
|
||||||
|
">
|
||||||
|
<h3 style="
|
||||||
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
font-size: 18px;
|
||||||
|
">亲爱的用户,您好!</h3>
|
||||||
|
|
||||||
|
<p style="
|
||||||
|
color: #666;
|
||||||
|
line-height: 1.6;
|
||||||
|
margin: 8px 0;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 14px;
|
||||||
|
">婚恋报告正在优化升级中,需要查询请前往天远查。</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div style="display: flex; gap: 12px; margin-bottom: 16px;">
|
||||||
|
<button id="jumpNowBtn" style="
|
||||||
|
flex: 1;
|
||||||
|
background: linear-gradient(135deg, #ff6b6b, #ee5a24);
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
padding: 12px 0;
|
||||||
|
border-radius: 25px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
">是</button>
|
||||||
|
|
||||||
|
<button id="remindLaterBtn" style="
|
||||||
|
flex: 1;
|
||||||
|
background: #f8f9fa;
|
||||||
|
color: #666;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
padding: 12px 0;
|
||||||
|
border-radius: 25px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
">否</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.body.appendChild(modal);
|
||||||
|
|
||||||
|
// 绑定按钮事件
|
||||||
|
const jumpNowBtn = modal.querySelector('#jumpNowBtn');
|
||||||
|
const remindLaterBtn = modal.querySelector('#remindLaterBtn');
|
||||||
|
|
||||||
|
jumpNowBtn.addEventListener('click', () => {
|
||||||
|
// 跳转到新版首页
|
||||||
|
window.open('https://www.tianyuancha.cn/', '_blank');
|
||||||
|
document.body.removeChild(modal);
|
||||||
|
});
|
||||||
|
|
||||||
|
remindLaterBtn.addEventListener('click', () => {
|
||||||
|
// 跳转到指定网站
|
||||||
|
window.location.href = 'https://www.quannengcha.com/';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function isFinishPayment() {
|
function isFinishPayment() {
|
||||||
const query = new URLSearchParams(window.location.search);
|
const query = new URLSearchParams(window.location.search);
|
||||||
let orderNo = query.get("out_trade_no");
|
let orderNo = query.get("out_trade_no");
|
||||||
@@ -88,20 +170,6 @@ async function getProduct() {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<!-- 未登录或未绑定手机号,提示 -->
|
<!-- 直接显示查询表单,不需要登录 -->
|
||||||
<div v-if="!canQuery" class="min-h-screen flex items-center justify-center p-6">
|
<InquireForm :type="'normal'" :feature="feature" :feature-data="featureData" />
|
||||||
<div class="text-center">
|
|
||||||
<div class="text-lg font-bold mb-4">无法使用查询功能</div>
|
|
||||||
<div class="text-gray-600 mb-6">
|
|
||||||
<span v-if="!isLoggedIn">请先登录</span>
|
|
||||||
<span v-else>请先绑定手机号</span>
|
|
||||||
</div>
|
|
||||||
<button @click="router.push(isLoggedIn ? '/me' : '/login')"
|
|
||||||
class="px-6 py-3 bg-primary text-white rounded-lg">
|
|
||||||
{{ isLoggedIn ? '去绑定手机号' : '去登录' }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- 已登录且已绑定手机号,可以使用查询功能 -->
|
|
||||||
<InquireForm v-else :type="'normal'" :feature="feature" :feature-data="featureData" />
|
|
||||||
</template>
|
</template>
|
||||||
@@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { aesDecrypt } from "@/utils/crypto";
|
import { aesDecrypt } from "@/utils/crypto";
|
||||||
|
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha()
|
||||||
const showApplyPopup = ref(false);
|
const showApplyPopup = ref(false);
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -48,6 +50,7 @@ const agentApply = () => {
|
|||||||
showApplyPopup.value = true;
|
showApplyPopup.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 跳转到首页
|
// 跳转到首页
|
||||||
const goToHome = () => {
|
const goToHome = () => {
|
||||||
router.replace("/promote");
|
router.replace("/promote");
|
||||||
@@ -77,50 +80,41 @@ onBeforeMount(async () => {
|
|||||||
await store.fetchAgentStatus();
|
await store.fetchAgentStatus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
import { applyForAgent, registerByInviteCode } from "@/api/agent";
|
import useApiFetch from '@/composables/useApiFetch'
|
||||||
|
|
||||||
const submitApplication = async (formData) => {
|
const submitApplication = async (formData) => {
|
||||||
const { region, mobile, wechat_id, code, referrer } = formData;
|
const { region, mobile, wechat_id, code, referrer } = formData;
|
||||||
|
|
||||||
// 根据是否已登录选择不同的API
|
// 根据是否已登录选择不同的API
|
||||||
const isLoggedIn = !!localStorage.getItem("token");
|
const isLoggedIn = !!localStorage.getItem("token");
|
||||||
const apiCall = isLoggedIn ? applyForAgent : registerByInviteCode;
|
const apiUrl = isLoggedIn ? 'agent/apply' : 'agent/register/invite';
|
||||||
|
|
||||||
let postData = {
|
|
||||||
region,
|
|
||||||
mobile,
|
|
||||||
wechat_id,
|
|
||||||
code,
|
|
||||||
referrer,
|
|
||||||
};
|
|
||||||
|
|
||||||
const { data, error } = await apiCall(postData);
|
// 使用滑块验证码保护申请接口
|
||||||
|
runWithCaptcha(
|
||||||
if (data.value && !error.value) {
|
(captchaVerifyParam) =>
|
||||||
if (data.value.code === 200) {
|
useApiFetch(apiUrl)
|
||||||
showApplyPopup.value = false;
|
.post({ region, mobile, wechat_id, code, referrer, captchaVerifyParam })
|
||||||
showToast({ message: "注册成功,您已成为代理!" });
|
.json(),
|
||||||
// 更新token和状态
|
(res) => {
|
||||||
if (data.value.data.accessToken) {
|
if (res.code === 200) {
|
||||||
localStorage.setItem("token", data.value.data.accessToken);
|
showApplyPopup.value = false;
|
||||||
localStorage.setItem(
|
showToast({ message: "注册成功,您已成为代理!" });
|
||||||
"refreshAfter",
|
// 更新token和状态
|
||||||
data.value.data.refreshAfter
|
if (res.data.accessToken) {
|
||||||
);
|
localStorage.setItem("token", res.data.accessToken);
|
||||||
localStorage.setItem(
|
localStorage.setItem("refreshAfter", res.data.refreshAfter);
|
||||||
"accessExpire",
|
localStorage.setItem("accessExpire", res.data.accessExpire);
|
||||||
data.value.data.accessExpire
|
// 重新获取代理状态
|
||||||
);
|
store.fetchAgentStatus();
|
||||||
// 重新获取代理状态
|
userStore.fetchUserInfo();
|
||||||
await store.fetchAgentStatus();
|
// 跳转到代理主页
|
||||||
await userStore.fetchUserInfo();
|
router.replace("/agent");
|
||||||
// 跳转到代理主页
|
}
|
||||||
router.replace("/agent");
|
} else {
|
||||||
|
showToast({ message: res.msg || "申请失败" });
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
console.log("申请失败", data.value);
|
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import { useUserStore } from '@/stores/userStore'
|
|||||||
import { useRouter, useRoute } from 'vue-router'
|
import { useRouter, useRoute } from 'vue-router'
|
||||||
import { mobileCodeLogin } from '@/api/user'
|
import { mobileCodeLogin } from '@/api/user'
|
||||||
import useApiFetch from '@/composables/useApiFetch'
|
import useApiFetch from '@/composables/useApiFetch'
|
||||||
|
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const agentStore = useAgentStore()
|
const agentStore = useAgentStore()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha()
|
||||||
|
|
||||||
const phoneNumber = ref('')
|
const phoneNumber = ref('')
|
||||||
const verificationCode = ref('')
|
const verificationCode = ref('')
|
||||||
@@ -35,25 +37,29 @@ async function sendVerificationCode() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch('auth/sendSms')
|
// 使用滑块验证码保护发送短信接口
|
||||||
.post({ mobile: phoneNumber.value, actionType: 'login' })
|
runWithCaptcha(
|
||||||
.json()
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch('auth/sendSms')
|
||||||
if (data.value && !error.value) {
|
.post({ mobile: phoneNumber.value, actionType: 'login', captchaVerifyParam })
|
||||||
if (data.value.code === 200) {
|
.json(),
|
||||||
showToast({ message: "获取成功" });
|
(res) => {
|
||||||
startCountdown()
|
if (res.code === 200) {
|
||||||
// 聚焦到验证码输入框
|
showToast({ message: "获取成功" });
|
||||||
nextTick(() => {
|
startCountdown()
|
||||||
const verificationCodeInput = document.getElementById('verificationCode');
|
// 聚焦到验证码输入框
|
||||||
if (verificationCodeInput) {
|
nextTick(() => {
|
||||||
verificationCodeInput.focus();
|
const verificationCodeInput = document.getElementById('verificationCode');
|
||||||
}
|
if (verificationCodeInput) {
|
||||||
});
|
verificationCodeInput.focus();
|
||||||
} else {
|
}
|
||||||
showToast(data.value.msg)
|
});
|
||||||
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ onMounted(() => {
|
|||||||
title: '404 - 页面未找到 | 全能查',
|
title: '404 - 页面未找到 | 全能查',
|
||||||
description: '抱歉,您访问的页面不存在。全能查专业大数据风险管控平台,提供大数据风险报告查询、婚姻状况查询、个人信用评估等服务。',
|
description: '抱歉,您访问的页面不存在。全能查专业大数据风险管控平台,提供大数据风险报告查询、婚姻状况查询、个人信用评估等服务。',
|
||||||
keywords: '404, 页面未找到, 全能查, 大数据风险管控',
|
keywords: '404, 页面未找到, 全能查, 大数据风险管控',
|
||||||
url: 'https://www.zhinengcha.cn/404'
|
url: 'https://www.quannengcha.com/404'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -6,11 +6,13 @@ import { useAgentStore } from '@/stores/agentStore'
|
|||||||
import { useUserStore } from '@/stores/userStore'
|
import { useUserStore } from '@/stores/userStore'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import useApiFetch from '@/composables/useApiFetch'
|
import useApiFetch from '@/composables/useApiFetch'
|
||||||
|
import { useAliyunCaptcha } from '@/composables/useAliyunCaptcha'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const agentStore = useAgentStore()
|
const agentStore = useAgentStore()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
const { runWithCaptcha } = useAliyunCaptcha()
|
||||||
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
const appName = import.meta.env.VITE_APP_NAME || '全能查';
|
||||||
|
|
||||||
const phoneNumber = ref('')
|
const phoneNumber = ref('')
|
||||||
@@ -84,25 +86,28 @@ async function sendVerificationCode() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data, error } = await useApiFetch('auth/sendSms')
|
// 使用滑块验证码保护发送短信接口
|
||||||
.post({ mobile: phoneNumber.value, actionType: 'agentApply' })
|
runWithCaptcha(
|
||||||
.json()
|
(captchaVerifyParam) =>
|
||||||
|
useApiFetch('auth/sendSms')
|
||||||
if (data.value && !error.value) {
|
.post({ mobile: phoneNumber.value, actionType: 'agentApply', captchaVerifyParam })
|
||||||
if (data.value.code === 200) {
|
.json(),
|
||||||
showToast({ message: "获取成功" });
|
(res) => {
|
||||||
startCountdown()
|
if (res.code === 200) {
|
||||||
// 聚焦到验证码输入框
|
showToast({ message: "获取成功" });
|
||||||
nextTick(() => {
|
startCountdown()
|
||||||
const verificationCodeInput = document.getElementById('verificationCode');
|
// 聚焦到验证码输入框
|
||||||
if (verificationCodeInput) {
|
nextTick(() => {
|
||||||
verificationCodeInput.focus();
|
const verificationCodeInput = document.getElementById('verificationCode');
|
||||||
}
|
if (verificationCodeInput) {
|
||||||
});
|
verificationCodeInput.focus();
|
||||||
} else {
|
}
|
||||||
showToast(data.value.msg)
|
});
|
||||||
|
} else {
|
||||||
|
showToast(res.msg || "获取验证码失败")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startCountdown() {
|
function startCountdown() {
|
||||||
|
|||||||
@@ -22,41 +22,96 @@
|
|||||||
<div>
|
<div>
|
||||||
<!-- 提现卡片 -->
|
<!-- 提现卡片 -->
|
||||||
<div class="rounded-xl shadow-lg p-6 mb-4" style="background: linear-gradient(135deg, var(--van-theme-primary-light), rgba(255,255,255,0.8));">
|
<div class="rounded-xl shadow-lg p-6 mb-4" style="background: linear-gradient(135deg, var(--van-theme-primary-light), rgba(255,255,255,0.8));">
|
||||||
<div class="flex items-center mb-6">
|
<!-- 提现方式切换 -->
|
||||||
<van-icon name="alipay" class="text-xl mr-2" style="color: #1677FF;" />
|
<van-tabs v-model:active="withdrawalType" shrink class="mb-4" title-active-color="var(--van-theme-primary)" @change="onWithdrawalTypeChange">
|
||||||
<h1 class="text-xl font-bold" style="color: var(--van-text-color);">支付宝提现</h1>
|
<van-tab title="支付宝" :name="1">
|
||||||
</div>
|
<div class="pt-2">
|
||||||
|
<div class="flex items-center mb-4">
|
||||||
<!-- 支付宝账号 -->
|
<van-icon name="alipay" class="text-xl mr-2" style="color: #1677FF;" />
|
||||||
<div class="mb-6">
|
<span class="text-base font-medium" style="color: var(--van-text-color);">支付宝提现</span>
|
||||||
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">支付宝账号</label>
|
</div>
|
||||||
<van-field v-model="alipayAccount" placeholder="请输入支付宝账号"
|
<!-- 支付宝账号 -->
|
||||||
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm"
|
<div class="mb-6">
|
||||||
:rules="[{ required: true, message: ' ' }]">
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">支付宝账号</label>
|
||||||
<template #left-icon>
|
<van-field v-model="alipayAccount" placeholder="请输入支付宝账号"
|
||||||
<van-icon name="phone-o" style="color: var(--van-text-color-2);" />
|
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm"
|
||||||
</template>
|
:rules="[{ required: true, message: ' ' }]">
|
||||||
</van-field>
|
<template #left-icon>
|
||||||
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">可填写支付宝账户绑定的手机号</small>
|
<van-icon name="phone-o" style="color: var(--van-text-color-2);" />
|
||||||
</div>
|
</template>
|
||||||
<!-- 支付宝实名姓名 -->
|
</van-field>
|
||||||
<div class="mb-6">
|
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">可填写支付宝账户绑定的手机号</small>
|
||||||
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">实名姓名</label>
|
</div>
|
||||||
<van-field v-model="realName" placeholder="请输入支付宝认证姓名"
|
<!-- 支付宝实名姓名 -->
|
||||||
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm" :rules="[
|
<div class="mb-6">
|
||||||
{
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">实名姓名</label>
|
||||||
required: true,
|
<van-field v-model="realName" placeholder="请输入支付宝认证姓名"
|
||||||
message: ' ',
|
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm" :rules="[
|
||||||
validator: (val) =>
|
{
|
||||||
/^[\u4e00-\u9fa5]{2,4}$/.test(val),
|
required: true,
|
||||||
},
|
message: ' ',
|
||||||
]">
|
validator: (val) =>
|
||||||
<template #left-icon>
|
/^[\u4e00-\u9fa5]{2,4}$/.test(val),
|
||||||
<van-icon name="contact-o" style="color: var(--van-text-color-2);" />
|
},
|
||||||
</template>
|
]">
|
||||||
</van-field>
|
<template #left-icon>
|
||||||
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">请填写支付宝账户认证的真实姓名</small>
|
<van-icon name="contact-o" style="color: var(--van-text-color-2);" />
|
||||||
</div>
|
</template>
|
||||||
|
</van-field>
|
||||||
|
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">请填写支付宝账户认证的真实姓名</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</van-tab>
|
||||||
|
<van-tab title="银行卡" :name="2">
|
||||||
|
<div class="pt-2">
|
||||||
|
<div class="flex items-center mb-4">
|
||||||
|
<van-icon name="balance-list-o" class="text-xl mr-2" style="color: var(--van-theme-primary);" />
|
||||||
|
<span class="text-base font-medium" style="color: var(--van-text-color);">银行卡提现</span>
|
||||||
|
</div>
|
||||||
|
<!-- 银行卡号 -->
|
||||||
|
<div class="mb-6">
|
||||||
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">银行卡号</label>
|
||||||
|
<van-field v-model="bankCardNo" placeholder="请输入银行卡号" type="number"
|
||||||
|
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm"
|
||||||
|
:rules="[{ required: true, message: ' ' }]">
|
||||||
|
<template #left-icon>
|
||||||
|
<van-icon name="balance-list-o" style="color: var(--van-text-color-2);" />
|
||||||
|
</template>
|
||||||
|
</van-field>
|
||||||
|
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">请填写与实名一致的开户银行卡号</small>
|
||||||
|
</div>
|
||||||
|
<!-- 开户行名称 -->
|
||||||
|
<div class="mb-6">
|
||||||
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">开户行名称</label>
|
||||||
|
<van-field v-model="bankName" placeholder="请输入开户行名称,如:中国工商银行XX支行"
|
||||||
|
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm"
|
||||||
|
:rules="[{ required: true, message: ' ' }]">
|
||||||
|
<template #left-icon>
|
||||||
|
<van-icon name="shop-o" style="color: var(--van-text-color-2);" />
|
||||||
|
</template>
|
||||||
|
</van-field>
|
||||||
|
</div>
|
||||||
|
<!-- 收款人姓名 -->
|
||||||
|
<div class="mb-6">
|
||||||
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">收款人姓名</label>
|
||||||
|
<van-field v-model="bankPayeeName" placeholder="请输入银行卡户主姓名"
|
||||||
|
class="flex items-center rounded-lg bg-white/90 backdrop-blur-sm shadow-sm" :rules="[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: ' ',
|
||||||
|
validator: (val) =>
|
||||||
|
/^[\u4e00-\u9fa5]{2,4}$/.test(val),
|
||||||
|
},
|
||||||
|
]">
|
||||||
|
<template #left-icon>
|
||||||
|
<van-icon name="contact-o" style="color: var(--van-text-color-2);" />
|
||||||
|
</template>
|
||||||
|
</van-field>
|
||||||
|
<small class="text-xs mt-1 block" style="color: var(--van-text-color-2);">需与银行卡开户姓名一致</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</van-tab>
|
||||||
|
</van-tabs>
|
||||||
<!-- 提现金额 -->
|
<!-- 提现金额 -->
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">提现金额</label>
|
<label class="text-sm mb-2 block" style="color: var(--van-text-color);">提现金额</label>
|
||||||
@@ -91,11 +146,19 @@
|
|||||||
<div class="flex items-center text-sm mb-2" style="color: var(--van-theme-primary);">
|
<div class="flex items-center text-sm mb-2" style="color: var(--van-theme-primary);">
|
||||||
<van-icon name="warning" class="mr-1" />提现须知
|
<van-icon name="warning" class="mr-1" />提现须知
|
||||||
</div>
|
</div>
|
||||||
<ul class="text-xs space-y-1" style="color: var(--van-text-color);">
|
<!-- 支付宝提现说明 -->
|
||||||
|
<ul v-if="withdrawalType === 1" class="text-xs space-y-1" style="color: var(--van-text-color);">
|
||||||
<li>· 每日限提现1次,最低50元</li>
|
<li>· 每日限提现1次,最低50元</li>
|
||||||
<li>· 提现收取6%税收</li>
|
<li>· 提现收取6%税收</li>
|
||||||
<li>· 到账时间:24小时内</li>
|
<li>· 到账时间:24小时内</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<!-- 银行卡提现说明 -->
|
||||||
|
<ul v-else class="text-xs space-y-1" style="color: var(--van-text-color);">
|
||||||
|
<li>· 每日限提现1次,最低50元</li>
|
||||||
|
<li>· 提现收取6%税收</li>
|
||||||
|
<li>· 到账时间:1-3个工作日(需人工审核)</li>
|
||||||
|
<li>· 银行卡提现:请确保开户行、户名与实名一致,到账前会有审核</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 税收说明 -->
|
<!-- 税收说明 -->
|
||||||
@@ -201,11 +264,16 @@
|
|||||||
</h2>
|
</h2>
|
||||||
<template v-if="status === 2">
|
<template v-if="status === 2">
|
||||||
<p class="text-sm" style="color: var(--van-text-color-2);">
|
<p class="text-sm" style="color: var(--van-text-color-2);">
|
||||||
已向
|
<template v-if="withdrawalType === 1">
|
||||||
<span style="color: var(--van-theme-primary);">{{
|
已向
|
||||||
alipayAccount
|
<span style="color: var(--van-theme-primary);">{{ alipayAccount }}</span>
|
||||||
}}</span>
|
转账
|
||||||
转账
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
已向
|
||||||
|
<span style="color: var(--van-theme-primary);">尾号{{ displayBankCardTail }}</span>
|
||||||
|
银行卡转账
|
||||||
|
</template>
|
||||||
</p>
|
</p>
|
||||||
<p class="text-2xl font-bold mt-2" style="color: #10b981;">
|
<p class="text-2xl font-bold mt-2" style="color: #10b981;">
|
||||||
¥{{ amount }}
|
¥{{ amount }}
|
||||||
@@ -227,8 +295,9 @@
|
|||||||
<!-- 辅助文案 -->
|
<!-- 辅助文案 -->
|
||||||
<div class="text-xs space-y-1.5" style="color: var(--van-text-color-2);">
|
<div class="text-xs space-y-1.5" style="color: var(--van-text-color-2);">
|
||||||
<template v-if="status === 2">
|
<template v-if="status === 2">
|
||||||
<p>预计24小时内到账</p>
|
<p>预计1-3个工作日到账(需人工审核)</p>
|
||||||
<p>可在支付宝账单中查看详情</p>
|
<p v-if="withdrawalType === 1">可在支付宝账单中查看详情</p>
|
||||||
|
<p v-else>请留意银行卡到账通知</p>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="status === 1">
|
<template v-if="status === 1">
|
||||||
<p>您的申请已进入处理队列</p>
|
<p>您的申请已进入处理队列</p>
|
||||||
@@ -289,6 +358,12 @@ const estimatedActualAmount = computed(() => {
|
|||||||
return Number(amount.value) - estimatedTaxAmount.value;
|
return Number(amount.value) - estimatedTaxAmount.value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 银行卡号尾号(成功弹窗展示用)
|
||||||
|
const displayBankCardTail = computed(() => {
|
||||||
|
const no = (bankCardNo.value || "").replace(/\s/g, "");
|
||||||
|
return no.length >= 4 ? no.slice(-4) : no || "****";
|
||||||
|
});
|
||||||
|
|
||||||
// 样式配置
|
// 样式配置
|
||||||
const statusIcon = {
|
const statusIcon = {
|
||||||
1: "clock",
|
1: "clock",
|
||||||
@@ -325,11 +400,29 @@ const statusMessages = {
|
|||||||
3: "提现失败",
|
3: "提现失败",
|
||||||
};
|
};
|
||||||
|
|
||||||
// 表单数据
|
// 提现方式:1=支付宝,2=银行卡
|
||||||
|
const withdrawalType = ref(1);
|
||||||
|
// 表单数据 - 支付宝
|
||||||
const alipayAccount = ref("");
|
const alipayAccount = ref("");
|
||||||
const amount = ref(0);
|
const amount = ref(0);
|
||||||
const availableAmount = ref(null);
|
const availableAmount = ref(null);
|
||||||
const realName = ref("");
|
const realName = ref("");
|
||||||
|
// 表单数据 - 银行卡
|
||||||
|
const bankCardNo = ref("");
|
||||||
|
const bankName = ref("");
|
||||||
|
const bankPayeeName = ref("");
|
||||||
|
|
||||||
|
// 切换提现方式时清空另一侧部分字段(金额保留)
|
||||||
|
const onWithdrawalTypeChange = () => {
|
||||||
|
if (withdrawalType.value === 1) {
|
||||||
|
bankCardNo.value = "";
|
||||||
|
bankName.value = "";
|
||||||
|
bankPayeeName.value = "";
|
||||||
|
} else {
|
||||||
|
alipayAccount.value = "";
|
||||||
|
realName.value = "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
const { data, error } = await getRevenueInfo();
|
const { data, error } = await getRevenueInfo();
|
||||||
@@ -350,35 +443,58 @@ const validateAmount = (val) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const validateForm = () => {
|
const validateForm = () => {
|
||||||
if (!realName.value.trim()) {
|
|
||||||
showToast("请输入账户实名姓名");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!/^[\u4e00-\u9fa5]{2,4}$/.test(realName.value)) {
|
|
||||||
showToast("请输入2-4位中文姓名");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!alipayAccount.value.trim()) {
|
|
||||||
showToast("请输入支付宝账号");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const amountNum = Number(amount.value);
|
const amountNum = Number(amount.value);
|
||||||
if (!amount.value || isNaN(amountNum)) {
|
if (!amount.value || isNaN(amountNum)) {
|
||||||
showToast("请输入有效金额");
|
showToast("请输入有效金额");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amountNum < 50) {
|
if (amountNum < 50) {
|
||||||
showToast("提现金额不能低于50元");
|
showToast("提现金额不能低于50元");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amountNum > availableAmount.value) {
|
if (amountNum > availableAmount.value) {
|
||||||
showToast("超过可提现金额");
|
showToast("超过可提现金额");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (withdrawalType.value === 1) {
|
||||||
|
// 支付宝
|
||||||
|
if (!realName.value.trim()) {
|
||||||
|
showToast("请输入账户实名姓名");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^[\u4e00-\u9fa5]{2,4}$/.test(realName.value)) {
|
||||||
|
showToast("请输入2-4位中文姓名");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!alipayAccount.value.trim()) {
|
||||||
|
showToast("请输入支付宝账号");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 银行卡
|
||||||
|
if (!bankCardNo.value.trim()) {
|
||||||
|
showToast("请输入银行卡号");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^\d{16,19}$/.test(bankCardNo.value.replace(/\s/g, ""))) {
|
||||||
|
showToast("请输入正确的银行卡号");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!bankName.value.trim()) {
|
||||||
|
showToast("请输入开户行名称");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!bankPayeeName.value.trim()) {
|
||||||
|
showToast("请输入收款人姓名");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^[\u4e00-\u9fa5]{2,4}$/.test(bankPayeeName.value)) {
|
||||||
|
showToast("请输入2-4位中文姓名");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -409,11 +525,19 @@ const confirmWithdraw = async () => {
|
|||||||
isSubmitting.value = true;
|
isSubmitting.value = true;
|
||||||
try {
|
try {
|
||||||
const { applyWithdrawal } = await import('@/api/agent');
|
const { applyWithdrawal } = await import('@/api/agent');
|
||||||
const { data, error } = await applyWithdrawal({
|
const payload = {
|
||||||
payee_account: alipayAccount.value,
|
withdrawal_type: withdrawalType.value,
|
||||||
amount: Number(amount.value),
|
amount: Number(amount.value),
|
||||||
payee_name: realName.value,
|
payee_name: withdrawalType.value === 1 ? realName.value : bankPayeeName.value,
|
||||||
});
|
};
|
||||||
|
if (withdrawalType.value === 1) {
|
||||||
|
payload.payee_account = alipayAccount.value;
|
||||||
|
} else {
|
||||||
|
payload.payee_account = bankCardNo.value.replace(/\s/g, "");
|
||||||
|
payload.bank_card_no = bankCardNo.value.replace(/\s/g, "");
|
||||||
|
payload.bank_name = bankName.value.trim();
|
||||||
|
}
|
||||||
|
const { data, error } = await applyWithdrawal(payload);
|
||||||
if (data.value?.code === 200 && !error.value) {
|
if (data.value?.code === 200 && !error.value) {
|
||||||
status.value = 1; // 新系统:申请后状态为1(待审核)
|
status.value = 1; // 新系统:申请后状态为1(待审核)
|
||||||
showTaxConfirmPopup.value = false;
|
showTaxConfirmPopup.value = false;
|
||||||
@@ -450,6 +574,9 @@ const resetForm = () => {
|
|||||||
alipayAccount.value = "";
|
alipayAccount.value = "";
|
||||||
amount.value = "";
|
amount.value = "";
|
||||||
realName.value = "";
|
realName.value = "";
|
||||||
|
bankCardNo.value = "";
|
||||||
|
bankName.value = "";
|
||||||
|
bankPayeeName.value = "";
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default defineConfig({
|
|||||||
proxy: {
|
proxy: {
|
||||||
"/api/v1": {
|
"/api/v1": {
|
||||||
// target: "http://127.0.0.1:8888", // 本地接口地址
|
// target: "http://127.0.0.1:8888", // 本地接口地址
|
||||||
target: "https://www.quannengcha.com", // 本地接口地址
|
target: "https://www.quannengcha.com", // 线上接口地址
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (path) => path, // 可选:确保路径不被修改
|
rewrite: (path) => path, // 可选:确保路径不被修改
|
||||||
},
|
},
|
||||||
|
|||||||
256
微信授权流程设计文档.md
256
微信授权流程设计文档.md
@@ -1,256 +0,0 @@
|
|||||||
# 微信 H5 授权流程重构 - 设计文档
|
|
||||||
|
|
||||||
## 📋 核心业务需求
|
|
||||||
|
|
||||||
在微信 H5 环境中,**整个应用在没有有效 token 时,都需要进行微信授权登录**。授权完成后,用户应该被重定向回他们尝试访问的原始页面。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 流程设计
|
|
||||||
|
|
||||||
### **完整的授权流程图**
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 用户在微信中访问任意页面(无 token) │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 路由守卫检测:微信 + 无 token │
|
|
||||||
│ → 保存目标路由到 authStore.pendingRoute │
|
|
||||||
│ → 生成微信授权 URL │
|
|
||||||
│ → window.location.href = 授权 URL (不调用 next()) │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 跳转到微信授权页面 │
|
|
||||||
│ https://open.weixin.qq.com/connect/oauth2/authorize?... │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
┌─────────┴─────────┐
|
|
||||||
│ 用户点击"同意" │
|
|
||||||
└────────┬──────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 微信回调:redirectUri?code=xxx&state=yyy │
|
|
||||||
│ 浏览器重新加载应用,URL 中包含 code/state 参数 │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ App.vue onMounted 检测到 code + state 参数 │
|
|
||||||
│ → 调用 handleWeixinAuthCallback(code) │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 1. 调用后端接口 /user/wxh5Auth 交换 token │
|
|
||||||
│ 2. 保存 token 到 localStorage │
|
|
||||||
│ 3. 清理 URL 中的 code/state 参数 │
|
|
||||||
│ 4. 获取用户信息 │
|
|
||||||
│ 5. 标记授权完成 authStore.completeWeixinAuth() │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 获取 pendingRoute,重定向回原始页面 │
|
|
||||||
│ router.replace(pendingRoute) │
|
|
||||||
│ 如果没有 pendingRoute,重定向到首页 "/" │
|
|
||||||
└──────────────────┬──────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ ✅ 授权完成,用户看到原始页面 │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📁 关键文件修改
|
|
||||||
|
|
||||||
### **1. `src/router/index.js` - 路由守卫**
|
|
||||||
|
|
||||||
**关键变化:**
|
|
||||||
- 检测到 **微信 + 无 token** 的情况
|
|
||||||
- **直接发起授权**(调用 `window.location.href`)
|
|
||||||
- **不调用 `next()`**,完全停止导航
|
|
||||||
- 授权 URL 中的 redirectUri 指向当前页面(清理旧的 code/state 参数)
|
|
||||||
|
|
||||||
**代码片段:**
|
|
||||||
```javascript
|
|
||||||
if (isWeChat.value && !isAuthenticated && !isTokenExpired) {
|
|
||||||
// 保存目标路由
|
|
||||||
authStore.startWeixinAuth(to);
|
|
||||||
|
|
||||||
// 生成授权 URL
|
|
||||||
const appId = import.meta.env.VITE_WECHAT_APP_ID;
|
|
||||||
const url = new URL(window.location.href);
|
|
||||||
const params = new URLSearchParams(url.search);
|
|
||||||
params.delete("code");
|
|
||||||
params.delete("state");
|
|
||||||
const cleanUrl = `${url.origin}${url.pathname}${params.toString() ? "?" + params.toString() : ""}`;
|
|
||||||
const redirectUri = encodeURIComponent(cleanUrl);
|
|
||||||
const weixinAuthUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_base&state=snsapi_base#wechat_redirect`;
|
|
||||||
|
|
||||||
// 直接跳转,不调用 next()
|
|
||||||
window.location.href = weixinAuthUrl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### **2. `src/App.vue` - 授权回调处理**
|
|
||||||
|
|
||||||
**关键职责:**
|
|
||||||
1. **检测回调**:读取 URL 中的 code/state 参数
|
|
||||||
2. **处理回调**:调用 `/user/wxh5Auth` 交换 token
|
|
||||||
3. **恢复导航**:使用保存的 pendingRoute 重定向用户
|
|
||||||
|
|
||||||
**核心函数:`handleWeixinAuthCallback(code)`**
|
|
||||||
```javascript
|
|
||||||
const handleWeixinAuthCallback = async (code) => {
|
|
||||||
// 1. 交换 token
|
|
||||||
const { data, error } = await useApiFetch("/user/wxh5Auth").post({ code }).json();
|
|
||||||
|
|
||||||
// 2. 保存 token
|
|
||||||
localStorage.setItem("token", data.value.data.accessToken);
|
|
||||||
localStorage.setItem("refreshAfter", data.value.data.refreshAfter);
|
|
||||||
localStorage.setItem("accessExpire", data.value.data.accessExpire);
|
|
||||||
|
|
||||||
// 3. 清理 URL
|
|
||||||
const url = new URL(window.location.href);
|
|
||||||
const params = new URLSearchParams(url.search);
|
|
||||||
params.delete("code");
|
|
||||||
params.delete("state");
|
|
||||||
window.history.replaceState({}, "", newUrl);
|
|
||||||
|
|
||||||
// 4. 获取用户信息
|
|
||||||
await userStore.fetchUserInfo();
|
|
||||||
|
|
||||||
// 5. 标记授权完成
|
|
||||||
authStore.completeWeixinAuth();
|
|
||||||
|
|
||||||
// 6. 重定向回 pendingRoute
|
|
||||||
const pendingRoute = authStore.pendingRoute;
|
|
||||||
await router.replace(pendingRoute || "/");
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### **3. `src/stores/authStore.js` - 授权状态管理**
|
|
||||||
|
|
||||||
**关键方法:**
|
|
||||||
|
|
||||||
| 方法 | 作用 |
|
|
||||||
|------|------|
|
|
||||||
| `startWeixinAuth(targetRoute)` | 开始授权,保存目标路由 |
|
|
||||||
| `completeWeixinAuth()` | 标记授权完成 |
|
|
||||||
| `clearPendingRoute()` | 清除待处理路由 |
|
|
||||||
| `resetAuthState()` | 重置所有授权状态 |
|
|
||||||
| `restoreFromStorage()` | 页面刷新后恢复状态 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 核心特性
|
|
||||||
|
|
||||||
### **1. 同步流程控制**
|
|
||||||
- ❌ **不使用** `watch` 监听 state 的变化
|
|
||||||
- ❌ **不使用** 异步的 route guard + next() 来触发授权
|
|
||||||
- ✅ **直接** 在 route guard 中调用 `window.location.href` 发起授权
|
|
||||||
|
|
||||||
**为什么?**
|
|
||||||
- Watch 是异步的,可能被路由完成打断
|
|
||||||
- next() 后可能路由已经切换,导致授权流程混乱
|
|
||||||
- 直接跳转 URL 更加可靠和同步
|
|
||||||
|
|
||||||
### **2. 状态持久化**
|
|
||||||
- 授权开始时保存到 localStorage
|
|
||||||
- 页面刷新时自动恢复状态
|
|
||||||
- 防止超时(30秒)导致的无限授权循环
|
|
||||||
|
|
||||||
### **3. URL 参数清理**
|
|
||||||
- 每次发起授权前,都清理 URL 中旧的 code/state 参数
|
|
||||||
- 防止参数被重复编码进 redirectUri
|
|
||||||
- 微信回调时才注入新的 code/state
|
|
||||||
|
|
||||||
### **4. 目标页面恢复**
|
|
||||||
- 路由守卫保存用户尝试访问的页面
|
|
||||||
- 授权完成后自动重定向到该页面
|
|
||||||
- 用户无感知的完整授权体验
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 场景处理
|
|
||||||
|
|
||||||
### **场景 1:无 token + 访问开放页面**
|
|
||||||
```
|
|
||||||
用户访问 "/" → 微信检测无 token → 发起授权 → 授权完成后回到首页
|
|
||||||
```
|
|
||||||
|
|
||||||
### **场景 2:无 token + 访问推广链接**
|
|
||||||
```
|
|
||||||
用户访问 "/agent/promotionInquire/abc123"
|
|
||||||
→ 微信检测无 token
|
|
||||||
→ 保存 pendingRoute = "/agent/promotionInquire/abc123"
|
|
||||||
→ 发起授权
|
|
||||||
→ 授权完成后回到 "/agent/promotionInquire/abc123"
|
|
||||||
```
|
|
||||||
|
|
||||||
### **场景 3:有效 token + 访问任意页面**
|
|
||||||
```
|
|
||||||
用户有 token 且未过期 → 路由守卫放行 → 直接加载页面,无授权
|
|
||||||
```
|
|
||||||
|
|
||||||
### **场景 4:Token 过期 + 访问需登录页面**
|
|
||||||
```
|
|
||||||
用户在非微信环境 → 检测到 token 过期 → 跳转登录页面
|
|
||||||
```
|
|
||||||
|
|
||||||
### **场景 5:授权超时**
|
|
||||||
```
|
|
||||||
用户授权流程中,30 秒内未完成 → 自动重置状态 → 页面刷新时重新授权
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 常见问题排查
|
|
||||||
|
|
||||||
### **Q1:为什么授权后没有跳到原页面?**
|
|
||||||
**A:** 检查 authStore 中是否有 pendingRoute
|
|
||||||
```javascript
|
|
||||||
console.log('pendingRoute:', authStore.pendingRoute);
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Q2:为什么一直在授权页面循环?**
|
|
||||||
**A:** 可能是授权回调处理失败。检查:
|
|
||||||
1. 后端 `/user/wxh5Auth` 接口是否正确返回 token
|
|
||||||
2. Token 是否正确保存到 localStorage
|
|
||||||
3. URL 中的 code/state 是否正确清理
|
|
||||||
|
|
||||||
### **Q3:为什么刷新页面后授权状态丢失?**
|
|
||||||
**A:** authStore.restoreFromStorage() 应该在 onMounted 中被调用。检查:
|
|
||||||
```javascript
|
|
||||||
authStore.restoreFromStorage(); // 这行很重要!
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Q4:在 PC 上测试,为什么无法触发授权?**
|
|
||||||
**A:** 授权只在微信环境中触发(isWeChat.value === true)。在 PC 上:
|
|
||||||
- 访问需登录的页面 → 跳转登录页
|
|
||||||
- 访问开放页面 → 正常加载
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 总结
|
|
||||||
|
|
||||||
这个重构的核心思想是:
|
|
||||||
1. **路由守卫 = 决策者**:检测到需要授权就立即发起
|
|
||||||
2. **App.vue = 处理器**:处理授权回调和状态恢复
|
|
||||||
3. **AuthStore = 状态管理**:保存和恢复授权相关的状态
|
|
||||||
4. **同步流程 = 高可靠性**:避免异步竞态条件
|
|
||||||
|
|
||||||
通过这个设计,微信授权流程变得:
|
|
||||||
- ✅ 清晰易懂
|
|
||||||
- ✅ 可靠稳定
|
|
||||||
- ✅ 易于测试和调试
|
|
||||||
- ✅ 完整的用户体验
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
# 微信授权重定向问题分析与修复
|
|
||||||
|
|
||||||
## 问题描述
|
|
||||||
微信授权回调成功后,虽然 `pendingRoute` 有正确的值,回调成功也能跳转到应该到达的页面(如 `promotionInquire`),但在加载该页面后,又会自动跳转到首页。
|
|
||||||
|
|
||||||
## 根本原因分析
|
|
||||||
|
|
||||||
### 问题 1: pendingRoute 清除时序错误 ❌
|
|
||||||
**位置**: `src/App.vue` 第 69-72 行
|
|
||||||
|
|
||||||
**原始代码**:
|
|
||||||
```javascript
|
|
||||||
if (pendingRoute) {
|
|
||||||
authStore.clearPendingRoute(); // ❌ 先清除
|
|
||||||
await router.replace(pendingRoute); // 用已清空的 null 值跳转
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
- `clearPendingRoute()` 将 `authStore.pendingRoute` 设为 `null`
|
|
||||||
- 之后 `router.replace(pendingRoute)` 使用的是已清空的 `null` 值
|
|
||||||
- 导致实际跳转到 `undefined` 而非目标路由
|
|
||||||
|
|
||||||
**修复**: 先跳转再清除 ✅
|
|
||||||
|
|
||||||
### 问题 2: 路由守卫重复授权防护缺失 ❌
|
|
||||||
**位置**: `src/router/index.js` 第 428-444 行
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
- 当用户在授权完成后,路由守卫再次执行时
|
|
||||||
- 如果 `isWeChat.value && !isAuthenticated` 条件满足
|
|
||||||
- 会重新触发授权流程,导致页面跳转
|
|
||||||
|
|
||||||
**原因**:
|
|
||||||
- `authStore.isWeixinAuthing` 和 `authStore.weixinAuthComplete` 状态未被路由守卫检查
|
|
||||||
- 虽然 token 已保存,但守卫仍可能因某些时序问题再次触发授权
|
|
||||||
|
|
||||||
**修复**: 在路由守卫中增加授权状态检查 ✅
|
|
||||||
|
|
||||||
### 问题 3: localStorage 同步问题
|
|
||||||
**位置**: `src/stores/authStore.js`
|
|
||||||
|
|
||||||
**问题**:
|
|
||||||
- 清除 `pendingRoute` 时,可能只清除内存状态,localStorage 可能残留数据
|
|
||||||
- 页面刷新时恢复的数据可能不完整
|
|
||||||
|
|
||||||
**修复**: 确保内存和 localStorage 同步清除 ✅
|
|
||||||
|
|
||||||
## 修复清单
|
|
||||||
|
|
||||||
### ✅ 修复 1: App.vue 中的时序问题
|
|
||||||
```javascript
|
|
||||||
if (pendingRoute) {
|
|
||||||
// ✅ 先跳转
|
|
||||||
await router.replace(pendingRoute);
|
|
||||||
// ✅ 再清除
|
|
||||||
authStore.clearPendingRoute();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ 修复 2: 路由守卫的防护检查
|
|
||||||
在路由守卫中增加:
|
|
||||||
```javascript
|
|
||||||
if (isWeChat.value && !isAuthenticated && !isTokenExpired) {
|
|
||||||
// ✨ 新增:检查是否正在授权或已完成授权
|
|
||||||
if (authStore.isWeixinAuthing || authStore.weixinAuthComplete) {
|
|
||||||
console.warn("⚠️ WeChat auth already in progress or completed");
|
|
||||||
NProgress.done();
|
|
||||||
next();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// ... 继续原有逻辑
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ 修复 3: authStore 中的日志和同步
|
|
||||||
增强 `clearPendingRoute()` 和 `restoreFromStorage()` 方法的日志记录和错误处理。
|
|
||||||
|
|
||||||
### ✅ 修复 4: PromotionInquire.vue 中的延迟处理
|
|
||||||
添加延迟以确保页面完全加载后再进行任何路由跳转:
|
|
||||||
```javascript
|
|
||||||
function isFinishPayment() {
|
|
||||||
const query = new URLSearchParams(window.location.search);
|
|
||||||
let orderNo = query.get("out_trade_no");
|
|
||||||
if (orderNo) {
|
|
||||||
// ✨ 延迟 100ms 确保页面加载完成
|
|
||||||
setTimeout(() => {
|
|
||||||
router.push({ path: "/report", query: { orderNo } });
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 调试建议
|
|
||||||
|
|
||||||
### 观察日志的关键点:
|
|
||||||
1. **微信授权开始**: 看是否出现 "Triggering WeChat auth from route guard"
|
|
||||||
2. **Token 保存**: 看是否出现 "✅ Token saved successfully"
|
|
||||||
3. **用户信息加载**: 看 "✅ User info fetched" 是否成功
|
|
||||||
4. **pendingRoute 获取**: 看 "🎯 pendingRoute:" 后面的值
|
|
||||||
5. **导航执行**: 看 "🚀 Navigating to pendingRoute:" 和 "✅ Navigated to pendingRoute"
|
|
||||||
6. **是否重复授权**: 看是否出现 "⚠️ WeChat auth already in progress"
|
|
||||||
|
|
||||||
### 测试步骤:
|
|
||||||
1. 在微信中打开推广链接: `https://xxx.com/agent/promotionInquire/abc123`
|
|
||||||
2. 观察控制台日志,确保看到上述所有成功日志
|
|
||||||
3. 验证最终页面是 `promotionInquire` 而非首页
|
|
||||||
|
|
||||||
## 修复文件列表
|
|
||||||
- ✅ `src/App.vue` - 修复 pendingRoute 时序问题
|
|
||||||
- ✅ `src/router/index.js` - 增强路由守卫防护
|
|
||||||
- ✅ `src/stores/authStore.js` - 改进日志和同步
|
|
||||||
- ✅ `src/views/PromotionInquire.vue` - 添加延迟处理
|
|
||||||
|
|
||||||
## 总结
|
|
||||||
这个问题是由多个时序和状态管理问题联合造成的:
|
|
||||||
1. pendingRoute 被过早清除导致跳转失败
|
|
||||||
2. 路由守卫缺少防护措施可能重复授权
|
|
||||||
3. 状态同步不完整可能导致恢复失败
|
|
||||||
|
|
||||||
通过修复这些问题,应该能够确保微信授权后正确重定向到目标页面。
|
|
||||||
Reference in New Issue
Block a user