Compare commits
2 Commits
11fe48809e
...
c404e797f3
| Author | SHA1 | Date | |
|---|---|---|---|
| c404e797f3 | |||
| ce9052f85b |
Binary file not shown.
@@ -67,6 +67,8 @@ westdex:
|
|||||||
key: "121a1e41fc1690dd6b90afbcacd80cf4"
|
key: "121a1e41fc1690dd6b90afbcacd80cf4"
|
||||||
secret_id: "449159"
|
secret_id: "449159"
|
||||||
secret_second_id: "296804"
|
secret_second_id: "296804"
|
||||||
|
yushan:
|
||||||
|
url: https://api2.yushanshuju.com/credit-gw/service
|
||||||
# ===========================================
|
# ===========================================
|
||||||
# 💰 支付宝支付配置
|
# 💰 支付宝支付配置
|
||||||
# ===========================================
|
# ===========================================
|
||||||
|
|||||||
@@ -965,7 +965,7 @@ func (s *ProductApplicationServiceImpl) getDTOMap() map[string]interface{} {
|
|||||||
"JRZQ0A03": &dto.JRZQ0A03Req{},
|
"JRZQ0A03": &dto.JRZQ0A03Req{},
|
||||||
"JRZQ4AA8": &dto.JRZQ4AA8Req{},
|
"JRZQ4AA8": &dto.JRZQ4AA8Req{},
|
||||||
"JRZQ8203": &dto.JRZQ8203Req{},
|
"JRZQ8203": &dto.JRZQ8203Req{},
|
||||||
"JRZQDBCE": &dto.JRZQDCBEReq{},
|
"JRZQDCBE": &dto.JRZQDCBEReq{},
|
||||||
"QYGL2ACD": &dto.QYGL2ACDReq{},
|
"QYGL2ACD": &dto.QYGL2ACDReq{},
|
||||||
"QYGL6F2D": &dto.QYGL6F2DReq{},
|
"QYGL6F2D": &dto.QYGL6F2DReq{},
|
||||||
"QYGL45BD": &dto.QYGL45BDReq{},
|
"QYGL45BD": &dto.QYGL45BDReq{},
|
||||||
|
|||||||
@@ -362,11 +362,11 @@ type YYSY4F2EReq struct {
|
|||||||
|
|
||||||
type YYSY9F1BReq struct {
|
type YYSY9F1BReq struct {
|
||||||
Name string `json:"name" validate:"required,min=1,validName"`
|
Name string `json:"name" validate:"required,min=1,validName"`
|
||||||
Phone string `json:"phone" validate:"required,min=11,max=11,validMobileNo"`
|
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
||||||
Authorized string `json:"authorized" validate:"required,oneof=0 1"`
|
Authorized string `json:"authorized" validate:"required,oneof=0 1"`
|
||||||
}
|
}
|
||||||
type YYSY6F2BReq struct {
|
type YYSY6F2BReq struct {
|
||||||
Phone string `json:"phone" validate:"required,min=11,max=11,validMobileNo"`
|
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type YYSY8B1CReq struct {
|
type YYSY8B1CReq struct {
|
||||||
@@ -436,15 +436,15 @@ type JRZQ0B6YReq struct {
|
|||||||
Name string `json:"name" validate:"required,min=1,validName"`
|
Name string `json:"name" validate:"required,min=1,validName"`
|
||||||
IDCard string `json:"id_card" validate:"required,validIDCard"`
|
IDCard string `json:"id_card" validate:"required,validIDCard"`
|
||||||
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
||||||
BankCard string `json:"bank_card" validate:"omitempty,validBankCard"`
|
BankCard string `json:"bank_card" validate:"required,validBankCard"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 银行卡鉴权
|
// 银行卡鉴权
|
||||||
type JRZQ9A1WReq struct {
|
type JRZQ9A1WReq struct {
|
||||||
Name string `json:"name" validate:"required,min=1,validName"`
|
Name string `json:"name" validate:"required,min=1,validName"`
|
||||||
IDCard string `json:"id_card" validate:"required,validIDCard"`
|
IDCard string `json:"id_card" validate:"required,validIDCard"`
|
||||||
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
MobileNo string `json:"mobile_no" validate:"omitempty,min=11,max=11,validMobileNo"`
|
||||||
BankCard string `json:"bank_card" validate:"omitempty,validBankCard"`
|
BankCard string `json:"bank_card" validate:"required,validBankCard"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 企业管理董监高司法综合信息核验
|
// 企业管理董监高司法综合信息核验
|
||||||
|
|||||||
@@ -20,34 +20,11 @@ func ProcessJRZQ0B6YRequest(ctx context.Context, params []byte, deps *processors
|
|||||||
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
||||||
return nil, errors.Join(processors.ErrInvalidParam, err)
|
return nil, errors.Join(processors.ErrInvalidParam, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptedName, err := deps.WestDexService.Encrypt(paramsDto.Name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedIDCard, err := deps.WestDexService.Encrypt(paramsDto.IDCard)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedMobileNo, err := deps.WestDexService.Encrypt(paramsDto.MobileNo)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedBankCard, err := deps.WestDexService.Encrypt(paramsDto.BankCard)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
reqData := map[string]interface{}{
|
reqData := map[string]interface{}{
|
||||||
"data": map[string]interface{}{
|
"name": paramsDto.Name,
|
||||||
"name": encryptedName,
|
"cardld": paramsDto.BankCard,
|
||||||
"cardId": encryptedBankCard,
|
"cardNo": paramsDto.IDCard,
|
||||||
"cardNo": encryptedIDCard,
|
"mobile": paramsDto.MobileNo,
|
||||||
"phone": encryptedMobileNo,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
respBytes, err := deps.YushanService.CallAPI(ctx, "FIN019", reqData)
|
respBytes, err := deps.YushanService.CallAPI(ctx, "FIN019", reqData)
|
||||||
|
|||||||
@@ -20,34 +20,12 @@ func ProcessJRZQ9A1WRequest(ctx context.Context, params []byte, deps *processors
|
|||||||
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
||||||
return nil, errors.Join(processors.ErrInvalidParam, err)
|
return nil, errors.Join(processors.ErrInvalidParam, err)
|
||||||
}
|
}
|
||||||
encryptedName, err := deps.WestDexService.Encrypt(paramsDto.Name)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedIDCard, err := deps.WestDexService.Encrypt(paramsDto.IDCard)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedMobileNo, err := deps.WestDexService.Encrypt(paramsDto.MobileNo)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
encryptedBankCard, err := deps.WestDexService.Encrypt(paramsDto.BankCard)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
reqData := map[string]interface{}{
|
reqData := map[string]interface{}{
|
||||||
"data": map[string]interface{}{
|
"name": paramsDto.Name,
|
||||||
"name": encryptedName,
|
"cardId": paramsDto.BankCard,
|
||||||
"cardId": encryptedBankCard,
|
"cardNo": paramsDto.IDCard,
|
||||||
"cardNo": encryptedIDCard,
|
"phone": paramsDto.MobileNo,
|
||||||
"phone": encryptedMobileNo,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
respBytes, err := deps.YushanService.CallAPI(ctx, "PCB145", reqData)
|
respBytes, err := deps.YushanService.CallAPI(ctx, "PCB145", reqData)
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ func ProcessYYSY6F2BRequest(ctx context.Context, params []byte, deps *processors
|
|||||||
return nil, errors.Join(processors.ErrInvalidParam, err)
|
return nil, errors.Join(processors.ErrInvalidParam, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptedPhone, err := deps.ZhichaService.Encrypt(paramsDto.Phone)
|
encryptedMobileNo, err := deps.ZhichaService.Encrypt(paramsDto.MobileNo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
return nil, errors.Join(processors.ErrSystem, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
reqData := map[string]interface{}{
|
reqData := map[string]interface{}{
|
||||||
"phone": encryptedPhone,
|
"phone": encryptedMobileNo,
|
||||||
}
|
}
|
||||||
|
|
||||||
respData, err := deps.ZhichaService.CallAPI(ctx, "ZCI041", reqData)
|
respData, err := deps.ZhichaService.CallAPI(ctx, "ZCI041", reqData)
|
||||||
|
|||||||
@@ -27,14 +27,14 @@ func ProcessYYSY9F1BYequest(ctx context.Context, params []byte, deps *processors
|
|||||||
return nil, errors.Join(processors.ErrSystem, err)
|
return nil, errors.Join(processors.ErrSystem, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
encryptedPhone, err := deps.ZhichaService.Encrypt(paramsDto.Phone)
|
encryptedMobileNo, err := deps.ZhichaService.Encrypt(paramsDto.MobileNo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Join(processors.ErrSystem, err)
|
return nil, errors.Join(processors.ErrSystem, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
reqData := map[string]interface{}{
|
reqData := map[string]interface{}{
|
||||||
"name": encryptedName,
|
"name": encryptedName,
|
||||||
"phone": encryptedPhone,
|
"phone": encryptedMobileNo,
|
||||||
"authorized": paramsDto.Authorized,
|
"authorized": paramsDto.Authorized,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
255
scripts/deploy.ps1
Normal file
255
scripts/deploy.ps1
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
# TYAPI 生产环境部署脚本 (PowerShell版本)
|
||||||
|
# 使用方法: .\scripts\deploy.ps1 [版本号]
|
||||||
|
|
||||||
|
param(
|
||||||
|
[string]$Version = "latest"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
$REGISTRY_URL = "docker-registry.tianyuanapi.com"
|
||||||
|
$IMAGE_NAME = "tyapi-server"
|
||||||
|
$APP_VERSION = $Version
|
||||||
|
$BUILD_TIME = (Get-Date -Format "yyyy-MM-ddTHH:mm:ssZ")
|
||||||
|
|
||||||
|
try {
|
||||||
|
$GIT_COMMIT = git rev-parse --short HEAD 2>$null
|
||||||
|
if (-not $GIT_COMMIT) { $GIT_COMMIT = "dev" }
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
$GIT_COMMIT = "dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 颜色输出函数
|
||||||
|
function Write-Info($message) {
|
||||||
|
Write-Host "[INFO] $message" -ForegroundColor Blue
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Success($message) {
|
||||||
|
Write-Host "[SUCCESS] $message" -ForegroundColor Green
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Warning($message) {
|
||||||
|
Write-Host "[WARNING] $message" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
|
||||||
|
function Write-Error($message) {
|
||||||
|
Write-Host "[ERROR] $message" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查必要工具
|
||||||
|
function Test-Requirements {
|
||||||
|
Write-Info "检查部署环境..."
|
||||||
|
|
||||||
|
if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
|
||||||
|
Write-Error "Docker 未安装或不在 PATH 中"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Get-Command docker-compose -ErrorAction SilentlyContinue)) {
|
||||||
|
Write-Error "docker-compose 未安装或不在 PATH 中"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
||||||
|
Write-Warning "Git 未安装,将使用默认提交哈希"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "环境检查通过"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建 Docker 镜像
|
||||||
|
function Build-Image {
|
||||||
|
Write-Info "开始构建 Docker 镜像..."
|
||||||
|
|
||||||
|
docker build `
|
||||||
|
--build-arg VERSION="$APP_VERSION" `
|
||||||
|
--build-arg COMMIT="$GIT_COMMIT" `
|
||||||
|
--build-arg BUILD_TIME="$BUILD_TIME" `
|
||||||
|
-t "$REGISTRY_URL/$IMAGE_NAME`:$APP_VERSION" `
|
||||||
|
-t "$REGISTRY_URL/$IMAGE_NAME`:latest" `
|
||||||
|
.
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "Docker 镜像构建失败"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "Docker 镜像构建完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 推送镜像到私有仓库
|
||||||
|
function Push-Image {
|
||||||
|
Write-Info "推送镜像到私有仓库..."
|
||||||
|
|
||||||
|
# 推送版本标签
|
||||||
|
docker push "$REGISTRY_URL/$IMAGE_NAME`:$APP_VERSION"
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Success "已推送版本标签: $APP_VERSION"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "推送版本标签失败"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 推送latest标签
|
||||||
|
docker push "$REGISTRY_URL/$IMAGE_NAME`:latest"
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Success "已推送latest标签"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "推送latest标签失败"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 准备生产环境配置
|
||||||
|
function Test-Config {
|
||||||
|
Write-Info "准备生产环境配置..."
|
||||||
|
|
||||||
|
# 检查.env文件是否存在
|
||||||
|
if (-not (Test-Path ".env")) {
|
||||||
|
if (Test-Path ".env.production") {
|
||||||
|
Write-Warning ".env文件不存在,正在复制模板..."
|
||||||
|
Copy-Item ".env.production" ".env"
|
||||||
|
Write-Warning "请编辑 .env 文件并设置正确的配置值"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Error "配置文件 .env 和 .env.production 都不存在"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# 验证关键配置
|
||||||
|
$envContent = Get-Content ".env" -Raw
|
||||||
|
if (-not ($envContent -match "^DB_PASSWORD=" -and -not ($envContent -match "your_secure_database_password_here"))) {
|
||||||
|
Write-Error "请在 .env 文件中设置安全的数据库密码"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not ($envContent -match "^JWT_SECRET=" -and -not ($envContent -match "your_super_secure_jwt_secret"))) {
|
||||||
|
Write-Error "请在 .env 文件中设置安全的JWT密钥"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "配置检查通过"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 部署到生产环境
|
||||||
|
function Start-Deploy {
|
||||||
|
Write-Info "开始部署到生产环境..."
|
||||||
|
|
||||||
|
# 设置版本环境变量
|
||||||
|
$env:APP_VERSION = $APP_VERSION
|
||||||
|
|
||||||
|
# 停止现有服务
|
||||||
|
Write-Info "停止现有服务..."
|
||||||
|
docker-compose -f docker-compose.prod.yml down --remove-orphans
|
||||||
|
|
||||||
|
# 清理未使用的镜像
|
||||||
|
Write-Info "清理未使用的Docker资源..."
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
|
# 拉取最新镜像
|
||||||
|
Write-Info "拉取最新镜像..."
|
||||||
|
docker-compose -f docker-compose.prod.yml pull
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
Write-Info "启动生产环境服务..."
|
||||||
|
docker-compose -f docker-compose.prod.yml up -d
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "服务启动失败"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 等待服务启动
|
||||||
|
Write-Info "等待服务启动..."
|
||||||
|
Start-Sleep -Seconds 30
|
||||||
|
|
||||||
|
# 检查服务状态
|
||||||
|
Write-Info "检查服务状态..."
|
||||||
|
docker-compose -f docker-compose.prod.yml ps
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
Write-Info "执行健康检查..."
|
||||||
|
$maxAttempts = 10
|
||||||
|
$attempt = 0
|
||||||
|
|
||||||
|
while ($attempt -lt $maxAttempts) {
|
||||||
|
try {
|
||||||
|
$response = Invoke-WebRequest -Uri "http://localhost:8080/health" -TimeoutSec 5 -ErrorAction Stop
|
||||||
|
if ($response.StatusCode -eq 200) {
|
||||||
|
Write-Success "应用健康检查通过"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
$attempt++
|
||||||
|
Write-Info "健康检查失败,重试 $attempt/$maxAttempts..."
|
||||||
|
Start-Sleep -Seconds 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($attempt -eq $maxAttempts) {
|
||||||
|
Write-Error "应用健康检查失败,请检查日志"
|
||||||
|
docker-compose -f docker-compose.prod.yml logs tyapi-app
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Success "部署完成!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示部署信息
|
||||||
|
function Show-Info {
|
||||||
|
Write-Info "部署信息:"
|
||||||
|
Write-Host " 版本: $APP_VERSION"
|
||||||
|
Write-Host " 提交: $GIT_COMMIT"
|
||||||
|
Write-Host " 构建时间: $BUILD_TIME"
|
||||||
|
Write-Host " 镜像: $REGISTRY_URL/$IMAGE_NAME`:$APP_VERSION"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "🌐 服务访问地址:"
|
||||||
|
Write-Host " 📱 API服务: http://localhost:8080"
|
||||||
|
Write-Host " 📚 API文档: http://localhost:8080/swagger/index.html"
|
||||||
|
Write-Host " 💚 健康检查: http://localhost:8080/health"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "📊 监控和追踪:"
|
||||||
|
Write-Host " 📈 Grafana仪表盘: http://localhost:3000"
|
||||||
|
Write-Host " 🔍 Prometheus监控: http://localhost:9090"
|
||||||
|
Write-Host " 🔗 Jaeger链路追踪: http://localhost:16686"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "🛠 管理工具:"
|
||||||
|
Write-Host " 🗄️ pgAdmin数据库: http://localhost:5050"
|
||||||
|
Write-Host " 📦 MinIO对象存储: http://localhost:9000"
|
||||||
|
Write-Host " 🎛️ MinIO控制台: http://localhost:9001"
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "🔧 管理命令:"
|
||||||
|
Write-Host " 查看日志: docker-compose -f docker-compose.prod.yml logs -f"
|
||||||
|
Write-Host " 停止服务: docker-compose -f docker-compose.prod.yml down"
|
||||||
|
Write-Host " 查看状态: docker-compose -f docker-compose.prod.yml ps"
|
||||||
|
Write-Host " 重启应用: docker-compose -f docker-compose.prod.yml restart tyapi-app"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
function Main {
|
||||||
|
Write-Info "开始 TYAPI 生产环境部署..."
|
||||||
|
Write-Info "版本: $APP_VERSION"
|
||||||
|
|
||||||
|
Test-Requirements
|
||||||
|
Test-Config
|
||||||
|
Build-Image
|
||||||
|
Push-Image
|
||||||
|
Start-Deploy
|
||||||
|
Show-Info
|
||||||
|
|
||||||
|
Write-Success "🎉 部署成功!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 运行主函数
|
||||||
|
try {
|
||||||
|
Main
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Error "部署过程中发生错误: $($_.Exception.Message)"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
221
scripts/deploy.sh
Normal file
221
scripts/deploy.sh
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# TYAPI 生产环境部署脚本
|
||||||
|
# 使用方法: ./scripts/deploy.sh [version]
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 配置
|
||||||
|
REGISTRY_URL="docker-registry.tianyuanapi.com"
|
||||||
|
IMAGE_NAME="tyapi-server"
|
||||||
|
APP_VERSION=${1:-latest}
|
||||||
|
BUILD_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
||||||
|
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo 'dev')
|
||||||
|
|
||||||
|
# 颜色输出
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 日志函数
|
||||||
|
log_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查必要工具
|
||||||
|
check_requirements() {
|
||||||
|
log_info "检查部署环境..."
|
||||||
|
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
log_error "Docker 未安装或不在 PATH 中"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v docker-compose &> /dev/null; then
|
||||||
|
log_error "docker-compose 未安装或不在 PATH 中"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v git &> /dev/null; then
|
||||||
|
log_warning "Git 未安装,将使用默认提交哈希"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "环境检查通过"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建 Docker 镜像
|
||||||
|
build_image() {
|
||||||
|
log_info "开始构建 Docker 镜像..."
|
||||||
|
|
||||||
|
docker build \
|
||||||
|
--build-arg VERSION="$APP_VERSION" \
|
||||||
|
--build-arg COMMIT="$GIT_COMMIT" \
|
||||||
|
--build-arg BUILD_TIME="$BUILD_TIME" \
|
||||||
|
-t "$REGISTRY_URL/$IMAGE_NAME:$APP_VERSION" \
|
||||||
|
-t "$REGISTRY_URL/$IMAGE_NAME:latest" \
|
||||||
|
.
|
||||||
|
|
||||||
|
log_success "Docker 镜像构建完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 推送镜像到私有仓库
|
||||||
|
push_image() {
|
||||||
|
log_info "推送镜像到私有仓库..."
|
||||||
|
|
||||||
|
# 推送版本标签
|
||||||
|
docker push "$REGISTRY_URL/$IMAGE_NAME:$APP_VERSION"
|
||||||
|
log_success "已推送版本标签: $APP_VERSION"
|
||||||
|
|
||||||
|
# 推送latest标签
|
||||||
|
docker push "$REGISTRY_URL/$IMAGE_NAME:latest"
|
||||||
|
log_success "已推送latest标签"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 准备生产环境配置
|
||||||
|
prepare_config() {
|
||||||
|
log_info "准备生产环境配置..."
|
||||||
|
|
||||||
|
# 检查.env文件是否存在
|
||||||
|
if [ ! -f ".env" ]; then
|
||||||
|
if [ -f ".env.production" ]; then
|
||||||
|
log_warning ".env文件不存在,正在复制模板..."
|
||||||
|
cp .env.production .env
|
||||||
|
log_warning "请编辑 .env 文件并设置正确的配置值"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
log_error "配置文件 .env 和 .env.production 都不存在"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 验证关键配置
|
||||||
|
if ! grep -q "^DB_PASSWORD=" .env || grep -q "your_secure_database_password_here" .env; then
|
||||||
|
log_error "请在 .env 文件中设置安全的数据库密码"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! grep -q "^JWT_SECRET=" .env || grep -q "your_super_secure_jwt_secret" .env; then
|
||||||
|
log_error "请在 .env 文件中设置安全的JWT密钥"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "配置检查通过"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 部署到生产环境
|
||||||
|
deploy() {
|
||||||
|
log_info "开始部署到生产环境..."
|
||||||
|
|
||||||
|
# 设置版本环境变量
|
||||||
|
export APP_VERSION="$APP_VERSION"
|
||||||
|
|
||||||
|
# 停止现有服务
|
||||||
|
log_info "停止现有服务..."
|
||||||
|
docker-compose -f docker-compose.prod.yml down --remove-orphans
|
||||||
|
|
||||||
|
# 清理未使用的镜像
|
||||||
|
log_info "清理未使用的Docker资源..."
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
|
# 拉取最新镜像
|
||||||
|
log_info "拉取最新镜像..."
|
||||||
|
docker-compose -f docker-compose.prod.yml pull
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
log_info "启动生产环境服务..."
|
||||||
|
docker-compose -f docker-compose.prod.yml up -d
|
||||||
|
|
||||||
|
# 等待服务启动
|
||||||
|
log_info "等待服务启动..."
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# 检查服务状态
|
||||||
|
log_info "检查服务状态..."
|
||||||
|
docker-compose -f docker-compose.prod.yml ps
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
log_info "执行健康检查..."
|
||||||
|
max_attempts=10
|
||||||
|
attempt=0
|
||||||
|
|
||||||
|
while [ $attempt -lt $max_attempts ]; do
|
||||||
|
if curl -f http://localhost:8080/health > /dev/null 2>&1; then
|
||||||
|
log_success "应用健康检查通过"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
log_info "健康检查失败,重试 $attempt/$max_attempts..."
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $attempt -eq $max_attempts ]; then
|
||||||
|
log_error "应用健康检查失败,请检查日志"
|
||||||
|
docker-compose -f docker-compose.prod.yml logs tyapi-app
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "部署完成!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示部署信息
|
||||||
|
show_info() {
|
||||||
|
log_info "部署信息:"
|
||||||
|
echo " 版本: $APP_VERSION"
|
||||||
|
echo " 提交: $GIT_COMMIT"
|
||||||
|
echo " 构建时间: $BUILD_TIME"
|
||||||
|
echo " 镜像: $REGISTRY_URL/$IMAGE_NAME:$APP_VERSION"
|
||||||
|
echo ""
|
||||||
|
echo "🌐 服务访问地址:"
|
||||||
|
echo " 📱 API服务: http://localhost:8080"
|
||||||
|
echo " 📚 API文档: http://localhost:8080/swagger/index.html"
|
||||||
|
echo " 💚 健康检查: http://localhost:8080/health"
|
||||||
|
echo ""
|
||||||
|
echo "📊 监控和追踪:"
|
||||||
|
echo " 📈 Grafana仪表盘: http://localhost:3000"
|
||||||
|
echo " 🔍 Prometheus监控: http://localhost:9090"
|
||||||
|
echo " 🔗 Jaeger链路追踪: http://localhost:16686"
|
||||||
|
echo ""
|
||||||
|
echo "🛠 管理工具:"
|
||||||
|
echo " 🗄️ pgAdmin数据库: http://localhost:5050"
|
||||||
|
echo " 📦 MinIO对象存储: http://localhost:9000"
|
||||||
|
echo " 🎛️ MinIO控制台: http://localhost:9001"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 管理命令:"
|
||||||
|
echo " 查看日志: docker-compose -f docker-compose.prod.yml logs -f"
|
||||||
|
echo " 停止服务: docker-compose -f docker-compose.prod.yml down"
|
||||||
|
echo " 查看状态: docker-compose -f docker-compose.prod.yml ps"
|
||||||
|
echo " 重启应用: docker-compose -f docker-compose.prod.yml restart tyapi-app"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
main() {
|
||||||
|
log_info "开始 TYAPI 生产环境部署..."
|
||||||
|
log_info "版本: $APP_VERSION"
|
||||||
|
|
||||||
|
check_requirements
|
||||||
|
prepare_config
|
||||||
|
build_image
|
||||||
|
push_image
|
||||||
|
deploy
|
||||||
|
show_info
|
||||||
|
|
||||||
|
log_success "🎉 部署成功!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 运行主函数
|
||||||
|
main "$@"
|
||||||
65
scripts/init.sql
Normal file
65
scripts/init.sql
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
-- TYAPI Server Database Initialization Script
|
||||||
|
-- This script runs when PostgreSQL container starts for the first time
|
||||||
|
|
||||||
|
-- Create development database if it doesn't exist
|
||||||
|
-- Note: tyapi_dev is already created by POSTGRES_DB environment variable
|
||||||
|
|
||||||
|
-- Create test database for running tests
|
||||||
|
-- Note: Skip database creation in init script, handle in application if needed
|
||||||
|
|
||||||
|
-- Create production database (for reference)
|
||||||
|
-- CREATE DATABASE tyapi_prod;
|
||||||
|
|
||||||
|
-- Connect to development database
|
||||||
|
\c tyapi_dev;
|
||||||
|
|
||||||
|
-- Enable necessary extensions
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "btree_gin";
|
||||||
|
|
||||||
|
-- Create schemas for better organization
|
||||||
|
CREATE SCHEMA IF NOT EXISTS public;
|
||||||
|
|
||||||
|
CREATE SCHEMA IF NOT EXISTS logs;
|
||||||
|
|
||||||
|
CREATE SCHEMA IF NOT EXISTS metrics;
|
||||||
|
|
||||||
|
-- Set search path
|
||||||
|
SET search_path TO public, logs, metrics;
|
||||||
|
|
||||||
|
-- Test database setup will be handled by application migrations
|
||||||
|
-- when needed, since we don't create it in this init script
|
||||||
|
|
||||||
|
-- Continue with development database setup
|
||||||
|
-- (already connected to tyapi_dev)
|
||||||
|
|
||||||
|
-- Create application-specific roles (optional)
|
||||||
|
-- CREATE ROLE tyapi_app WITH LOGIN PASSWORD 'app_password';
|
||||||
|
-- CREATE ROLE tyapi_readonly WITH LOGIN PASSWORD 'readonly_password';
|
||||||
|
|
||||||
|
-- Grant permissions
|
||||||
|
-- GRANT CONNECT ON DATABASE tyapi_dev TO tyapi_app;
|
||||||
|
-- GRANT USAGE ON SCHEMA public TO tyapi_app;
|
||||||
|
-- GRANT CREATE ON SCHEMA public TO tyapi_app;
|
||||||
|
|
||||||
|
-- Initial seed data can be added here
|
||||||
|
-- This will be replaced by proper migrations in the application
|
||||||
|
|
||||||
|
-- Log the initialization
|
||||||
|
-- Note: pg_stat_statements extension may not be available, skip this insert
|
||||||
|
|
||||||
|
-- Create a simple health check function
|
||||||
|
CREATE OR REPLACE FUNCTION health_check()
|
||||||
|
RETURNS json AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN json_build_object(
|
||||||
|
'status', 'healthy',
|
||||||
|
'database', current_database(),
|
||||||
|
'timestamp', now(),
|
||||||
|
'version', version()
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
154
scripts/log-manager.sh
Normal file
154
scripts/log-manager.sh
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 日志管理脚本
|
||||||
|
# 用于清理旧日志文件和查看日志统计信息
|
||||||
|
|
||||||
|
LOG_DIR="./logs"
|
||||||
|
RETENTION_DAYS=30
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# 打印带颜色的消息
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示帮助信息
|
||||||
|
show_help() {
|
||||||
|
echo "日志管理脚本"
|
||||||
|
echo ""
|
||||||
|
echo "用法: $0 [命令]"
|
||||||
|
echo ""
|
||||||
|
echo "命令:"
|
||||||
|
echo " clean - 清理超过 $RETENTION_DAYS 天的旧日志文件"
|
||||||
|
echo " stats - 显示日志统计信息"
|
||||||
|
echo " size - 显示日志目录大小"
|
||||||
|
echo " list - 列出所有日志文件"
|
||||||
|
echo " help - 显示此帮助信息"
|
||||||
|
echo ""
|
||||||
|
echo "示例:"
|
||||||
|
echo " $0 clean # 清理旧日志"
|
||||||
|
echo " $0 stats # 查看统计信息"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 清理旧日志文件
|
||||||
|
clean_old_logs() {
|
||||||
|
print_info "开始清理超过 $RETENTION_DAYS 天的旧日志文件..."
|
||||||
|
|
||||||
|
if [ ! -d "$LOG_DIR" ]; then
|
||||||
|
print_error "日志目录 $LOG_DIR 不存在"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 查找并删除超过指定天数的日志文件
|
||||||
|
find "$LOG_DIR" -name "*.log*" -type f -mtime +$RETENTION_DAYS -exec rm -f {} \;
|
||||||
|
|
||||||
|
# 删除空的日期目录
|
||||||
|
find "$LOG_DIR" -type d -empty -delete
|
||||||
|
|
||||||
|
print_success "旧日志文件清理完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示日志统计信息
|
||||||
|
show_stats() {
|
||||||
|
print_info "日志统计信息:"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ ! -d "$LOG_DIR" ]; then
|
||||||
|
print_error "日志目录 $LOG_DIR 不存在"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 总文件数
|
||||||
|
total_files=$(find "$LOG_DIR" -name "*.log*" -type f | wc -l)
|
||||||
|
echo "总日志文件数: $total_files"
|
||||||
|
|
||||||
|
# 总大小
|
||||||
|
total_size=$(du -sh "$LOG_DIR" 2>/dev/null | cut -f1)
|
||||||
|
echo "日志目录总大小: $total_size"
|
||||||
|
|
||||||
|
# 按日期统计
|
||||||
|
echo ""
|
||||||
|
echo "按日期统计:"
|
||||||
|
for date_dir in "$LOG_DIR"/*/; do
|
||||||
|
if [ -d "$date_dir" ]; then
|
||||||
|
date_name=$(basename "$date_dir")
|
||||||
|
file_count=$(find "$date_dir" -name "*.log*" -type f | wc -l)
|
||||||
|
dir_size=$(du -sh "$date_dir" 2>/dev/null | cut -f1)
|
||||||
|
echo " $date_name: $file_count 个文件, $dir_size"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 最近修改的文件
|
||||||
|
echo ""
|
||||||
|
echo "最近修改的日志文件:"
|
||||||
|
find "$LOG_DIR" -name "*.log*" -type f -exec ls -lh {} \; | head -5
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示日志目录大小
|
||||||
|
show_size() {
|
||||||
|
if [ ! -d "$LOG_DIR" ]; then
|
||||||
|
print_error "日志目录 $LOG_DIR 不存在"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
total_size=$(du -sh "$LOG_DIR" 2>/dev/null | cut -f1)
|
||||||
|
print_info "日志目录大小: $total_size"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 列出所有日志文件
|
||||||
|
list_logs() {
|
||||||
|
if [ ! -d "$LOG_DIR" ]; then
|
||||||
|
print_error "日志目录 $LOG_DIR 不存在"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_info "所有日志文件:"
|
||||||
|
find "$LOG_DIR" -name "*.log*" -type f -exec ls -lh {} \;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
main() {
|
||||||
|
case "$1" in
|
||||||
|
"clean")
|
||||||
|
clean_old_logs
|
||||||
|
;;
|
||||||
|
"stats")
|
||||||
|
show_stats
|
||||||
|
;;
|
||||||
|
"size")
|
||||||
|
show_size
|
||||||
|
;;
|
||||||
|
"list")
|
||||||
|
list_logs
|
||||||
|
;;
|
||||||
|
"help"|"-h"|"--help"|"")
|
||||||
|
show_help
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "未知命令: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行主函数
|
||||||
|
main "$@"
|
||||||
13
scripts/set_timezone.sql
Normal file
13
scripts/set_timezone.sql
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
-- 设置时区为北京时间
|
||||||
|
ALTER SYSTEM SET timezone = 'Asia/Shanghai';
|
||||||
|
|
||||||
|
ALTER SYSTEM SET log_timezone = 'Asia/Shanghai';
|
||||||
|
|
||||||
|
-- 重新加载配置
|
||||||
|
SELECT pg_reload_conf ();
|
||||||
|
|
||||||
|
-- 验证时区设置
|
||||||
|
SELECT name, setting
|
||||||
|
FROM pg_settings
|
||||||
|
WHERE
|
||||||
|
name IN ('timezone', 'log_timezone');
|
||||||
98
scripts/成本价.csv
Normal file
98
scripts/成本价.csv
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
产品编号,产品名称,分类,价格,数据源,数据源编号,成本价
|
||||||
|
DWBG6A2C,司南报告服务,多维报告,10.8,安徽智查,ZCI102,2.4
|
||||||
|
DWBG8B4D,谛听多维报告,多维报告,10.8,安徽智查,ZCI103,2.1
|
||||||
|
FLXG2E8F,司法核验报告,风险管控,5,安徽智查,ZCI101,1.2
|
||||||
|
FLXG5A3B,个人司法涉诉B,风险管控,2.2,安徽智查,ZCI006,0.42
|
||||||
|
FLXG8B4D,涉赌涉诈风险评估,风险管控,1.8,安徽智查,ZCI027,0.3
|
||||||
|
FLXG9C1D,法院信息详情高级版,风险管控,1.5,安徽智查,ZCI007,0.23
|
||||||
|
FLXGDEA8,公安不良人员名单,风险管控,2,安徽智查,ZCI028,0.45
|
||||||
|
FLXGDEA9,公安不良人员名单(加强版),风险管控,2.5,安徽智查,ZCI005,0.45
|
||||||
|
IVYZ2A8B,身份二要素认证,身份验证,0.25,安徽智查,ZCI001,0.05
|
||||||
|
IVYZ5E3F,单人婚姻状态B,身份验证,2.5,安徽智查,ZCI029,0.55
|
||||||
|
IVYZ7C9D,人脸识别验证,身份验证,0.3,安徽智查,ZCI013,0.3
|
||||||
|
IVYZ7F3A,学历信息查询B,身份验证,4.5,安徽智查,ZCI035,2.3
|
||||||
|
JRZQ09J8,收入评估(社保评级),金融验证,3.5,安徽智查,ZCI031,0.83
|
||||||
|
JRZQ1D09,3C租赁申请意向,金融验证,3,安徽智查,ZCI020,0.23
|
||||||
|
JRZQ3C7B,借贷意向验证B,金融验证,2.5,安徽智查,ZCI017,0.33
|
||||||
|
JRZQ4B6C,探针C风险评估,金融验证,2,安徽智查,ZCI023,0.5
|
||||||
|
JRZQ5E9F,借选指数评估,金融验证,3,安徽智查,ZCI021,0.38
|
||||||
|
JRZQ7F1A,全景雷达,金融验证,3.5,安徽智查,ZCI008,0.6
|
||||||
|
JRZQ8A2D,特殊名单验证B,金融验证,2,安徽智查,ZCI018,0
|
||||||
|
QCXG9P1C,名下车辆详版,汽车相关,3.8,安徽智查,ZCI051,1.6
|
||||||
|
YYSY3E7F,空号检测服务,运营商验证,0.2,安徽智查,ZCI010,0.055
|
||||||
|
YYSY4F2E,运营商三要素验证(详版),运营商验证,0.35,安徽智查,ZCI002,0.16
|
||||||
|
YYSY6D9A,全网手机号状态验证,运营商验证,0.6,安徽智查,ZCI030,0.035
|
||||||
|
YYSY8B1C,手机在网时长B,运营商验证,0.3,安徽智查,ZCI003,0.1
|
||||||
|
YYSY9E4A,手机号码归属地,运营商验证,0.3,安徽智查,ZCI026,0
|
||||||
|
FLXG0687,反赌反诈,风险管控,1.8,羽山数据,RIS031,0.3
|
||||||
|
FLXGBC21,手机号码特别风险,风险管控,2,羽山数据,MOB032,0.1
|
||||||
|
QCXG7A2B,名下车辆,汽车相关,2,羽山数据,CAR061,1.6
|
||||||
|
FLXG0V3B,个人不良核验(标准版),风险管控,3,西部数据,G34BJ03,0.8
|
||||||
|
FLXG0V4B,个人司法涉诉,风险管控,2.5,西部数据,G22SC01,0.5
|
||||||
|
FLXG162A,团伙欺诈评估,风险管控,2.5,西部数据,G32BJ05,0.7
|
||||||
|
FLXG3D56,特殊名单验证,金融验证,2.5,西部数据,G26BJ05,0.2
|
||||||
|
FLXG54F5,手机号码风险,风险管控,3,西部数据,G03HZ01,0.55
|
||||||
|
FLXG5876,易诉人识别,风险管控,2,西部数据,G03XM02,0.6
|
||||||
|
FLXG5B2E,自然人限高信息,风险管控,2,西部数据,G36SC01,0.5
|
||||||
|
FLXG75FE,涉网风险,风险管控,2,西部数据,FLXG75FE,0.4
|
||||||
|
FLXG8A3F,自然人失信信息,风险管控,2,西部数据,G37SC01,0.5
|
||||||
|
FLXG9687,电诈风险预警,风险管控,1,西部数据,G31BJ05,0.4
|
||||||
|
FLXG970F,风险人员核验,风险管控,2,西部数据,WEST00028,0.35
|
||||||
|
FLXGC9D1,黑灰产等级,风险管控,3,西部数据,G30BJ05,0.2
|
||||||
|
FLXGCA3D,个人综合涉诉,风险管控,2.5,西部数据,G22BJ03,0.5
|
||||||
|
FLXGDEC7,个人不良核验,风险管控,3,西部数据,G23BJ03,0.8
|
||||||
|
IVYZ0B03,二要素验证(姓名、手机号),身份验证,0.3,西部数据,G17BJ02,0.29
|
||||||
|
IVYZ1C9D,,身份验证,,西部数据,G38SC02,
|
||||||
|
IVYZ2125,活体+人像核验组件,身份验证,0.3,西部数据,IVYZ2125,0.3
|
||||||
|
IVYZ385E,自然人生存状态标识,身份验证,1.5,西部数据,WEST00020,0.3
|
||||||
|
IVYZ4E8B,单人婚姻状态C,身份验证,2.5,西部数据,G09GZ02,
|
||||||
|
IVYZ5733,单人婚姻状态A,身份验证,2.5,西部数据,G09GZ02,1
|
||||||
|
IVYZ7F2A,双人婚姻状态B,身份验证,2.5,西部数据,G10GZ02,0.6
|
||||||
|
IVYZ81NC,单人婚姻查询(登记时间版),身份验证,4.5,西部数据,G09XM02,1
|
||||||
|
IVYZ9363,双人婚姻状态A,身份验证,2.5,西部数据,G10XM02,1
|
||||||
|
IVYZ9A2B,学历信息查询A,身份验证,5,西部数据,G11BJ06,3
|
||||||
|
IVYZADEE,身份证三要素比对,身份验证,0.3,西部数据,IVYZADEE,0.2
|
||||||
|
IVYZGZ08,,身份验证,,西部数据,G08SC02,
|
||||||
|
JRZQ0A03,借贷意向验证,金融验证,2.5,西部数据,G27BJ05,0.6
|
||||||
|
JRZQ4AA8,偿债压力指数,金融验证,3,西部数据,G29BJ05,0.6
|
||||||
|
JRZQ8203,借贷行为验证,金融验证,3,西部数据,G28BJ05,1
|
||||||
|
JRZQDCBE,银行卡四要素验证,金融验证,0.4,西部数据,G20GZ01,0.3
|
||||||
|
QYGL2ACD,企业三要素核验,企业相关,0.2,西部数据,WEST00022,0.1
|
||||||
|
QYGL45BD,企业法人四要素核验,企业相关,0.3,西部数据,WEST00021,0.25
|
||||||
|
QYGL6F2D,人企关联,企业相关,3,西部数据,G05XM02,0.9
|
||||||
|
QYGL8261,企业综合涉诉,企业相关,2.5,西部数据,Q03BJ03,0.5
|
||||||
|
QYGL8271,企业司法涉诉(详版),企业相关,2.5,西部数据,Q03SC01,0.5
|
||||||
|
QYGLB4C0,股东人企关系精准版,企业相关,3,西部数据,G05HZ01,0.6
|
||||||
|
YYSY09CD,运营商三要素验证(简版),运营商验证,0.3,西部数据,G16BJ02,0.3
|
||||||
|
YYSY4B21,手机在网状态,运营商验证,0.5,西部数据,G25BJ02,0.055
|
||||||
|
YYSY4B37,手机在网时长A,运营商验证,0.3,西部数据,G02BJ02,0.2
|
||||||
|
YYSY6F2E,运营商三要素核验(高级版),运营商验证,0.4,西部数据,G15BJ02,0.35
|
||||||
|
YYSYD50F,二要素核验(手机号、身份证号),运营商验证,0.35,西部数据,G18BJ02,0.29
|
||||||
|
YYSYF7DB,手机二次卡,运营商验证,0.3,西部数据,G19BJ02,0.2
|
||||||
|
DWBG7F3A,多头借贷行业风险版,金融验证,2.5,四川星维,CDJ-1101695406546284544,0.45
|
||||||
|
FLXG7E8F,个人司法涉诉查询,风险管控,2,四川星维,CDJ-1101695378264092672,0.36
|
||||||
|
IVYZ3A7F,学历信息查询(学校名称版),身份验证,5,四川星维,CDJ-1104648854749245440,3
|
||||||
|
IVYZ6G7H,单人婚姻状态(补证版),身份验证,3.5,四川星维,CDJ-1104646268587536384,0.7
|
||||||
|
IVYZ8I9J,互联网行为推测,身份验证,1.8,四川星维,CDJ-1074522823015198720,0.6
|
||||||
|
IVYZ9D2E,,身份验证,,四川星维,CDJ-1104648845446279168,2.2
|
||||||
|
JRZQ0L85,个人信用分,金融验证,1.5,四川星维,CDJ-1101695364016041984,0.38
|
||||||
|
JRZQ6F2A,借贷意向验证A,金融验证,2,四川星维,CDJ-1101695369065984000,0.25
|
||||||
|
JRZQ8B3C,个人消费能力等级,金融验证,3,四川星维,CDJ-1101695392528920576,0.34
|
||||||
|
JRZQ9D4E,多头借贷小时级,金融验证,2.5,四川星维,CDJ-1118085532960616448,0.4
|
||||||
|
JRZQ9E2A,多头借贷风险信息查询,金融验证,3,四川星维,CDJ-1068350101688086528,0.6
|
||||||
|
QYGL5F6A,名下企业关联,企业相关,2.8,四川星维,CDJ-1101695397213958144,0.44
|
||||||
|
YYSY7D3E,携号转网查询,运营商验证,0.3,四川星维,CDJ-1100244706893164544,0.02
|
||||||
|
YYSY8C2D,运营商三要素(新详版),运营商验证,0.35,四川星维,CDJ-1100244702166183936,0.19
|
||||||
|
YYSY8F3A,,运营商验证,,四川星维,CDJ-1100244697766359040,0.14
|
||||||
|
YYSY9A1B,运营商三要素验证(简版),运营商验证,0.3,四川星维,CDJ-1100244697766359040,0.14
|
||||||
|
QYGL4B2E,,企业相关,,天眼查,TaxContravention,
|
||||||
|
QYGL5A3C,对外投资历史,企业相关,0.5,天眼查,InvestHistory,0.1
|
||||||
|
QYGL7C1A,经营异常,企业相关,0.5,天眼查,AbnormalInfo,0.15
|
||||||
|
QYGL7D9A,,企业相关,,天眼查,OwnTax,
|
||||||
|
QYGL8B4D,融资历史,企业相关,0.5,天眼查,FinancingHistory,0.1
|
||||||
|
QYGL9E2F,行政处罚,企业相关,0.5,天眼查,PunishmentInfo,0.15
|
||||||
|
QYGL23T7,企业法人四要素高级版,企业相关,0.3,阿里云,check,
|
||||||
|
YYSYBE08,二要素核验(姓名、身份证号),运营商验证,0.25,阿里云,check,0.03
|
||||||
|
IVYZ3P9M,学历信息查询(实时版),身份验证,5,木子数据,PC0041,1.72
|
||||||
|
COMENT01,企业风险报告(专业版),组合包,30,内部处理,,
|
||||||
|
QYGL3F8E,人企关系加强版,企业相关,10.8,内部处理,,
|
||||||
|
Reference in New Issue
Block a user