first commit

This commit is contained in:
2026-03-30 16:55:04 +08:00
commit 8d04a0fd6e
133 changed files with 11587 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/crawlful_hub?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 30000
connection-timeout: 20000
max-lifetime: 1800000
jpa:
hibernate:
ddl-auto: update
show-sql: true
redis:
host: localhost
port: 6379
password:
database: 0
security:
jwt:
secret: your-secret-key
expiration: 86400000
springdoc:
api-docs:
path: /api-docs
swagger-ui:
path: /swagger-ui.html
enabled: true
server:
port: 3001
servlet:
context-path: /api

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,130 @@
-- 创建用户表
CREATE TABLE IF NOT EXISTS cf_user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
role VARCHAR(50),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建商品表
CREATE TABLE IF NOT EXISTS cf_product (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
shop_id VARCHAR(255),
title VARCHAR(255) NOT NULL,
description TEXT,
main_image VARCHAR(255),
platform VARCHAR(50),
platform_product_id VARCHAR(255),
price DECIMAL(10,2),
cost_price DECIMAL(10,2),
quantity INT,
status VARCHAR(50),
phash VARCHAR(255),
semantic_hash VARCHAR(255),
vector_embedding TEXT,
attributes JSON,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建订单表
CREATE TABLE IF NOT EXISTS cf_order (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
shop_id VARCHAR(255),
platform VARCHAR(50),
platform_order_id VARCHAR(255),
status VARCHAR(50),
total_amount DECIMAL(10,2),
currency VARCHAR(10),
customer_info JSON,
items JSON,
shipping_address JSON,
tracking_number VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建支付表
CREATE TABLE IF NOT EXISTS cf_payment (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
order_id BIGINT,
payment_method VARCHAR(50),
amount DECIMAL(10,2),
currency VARCHAR(10),
status VARCHAR(50),
transaction_id VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES cf_order(id)
);
-- 创建物流表
CREATE TABLE IF NOT EXISTS cf_logistics (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
order_id BIGINT,
shipping_method VARCHAR(50),
tracking_number VARCHAR(255),
carrier VARCHAR(50),
status VARCHAR(50),
estimated_delivery_date DATETIME,
actual_delivery_date DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES cf_order(id)
);
-- 创建配置表
CREATE TABLE IF NOT EXISTS cf_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255),
shop_id VARCHAR(255),
config_key VARCHAR(255) NOT NULL,
config_value VARCHAR(255) NOT NULL,
config_type VARCHAR(50),
description TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 创建审计表
CREATE TABLE IF NOT EXISTS cf_audit (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255),
shop_id VARCHAR(255),
user_id BIGINT,
action VARCHAR(255),
resource_type VARCHAR(255),
resource_id VARCHAR(255),
ip_address VARCHAR(100),
user_agent TEXT,
details TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_user_tenant_id ON cf_user(tenant_id);
CREATE INDEX IF NOT EXISTS idx_product_tenant_id ON cf_product(tenant_id);
CREATE INDEX IF NOT EXISTS idx_product_platform ON cf_product(platform);
CREATE INDEX IF NOT EXISTS idx_order_tenant_id ON cf_order(tenant_id);
CREATE INDEX IF NOT EXISTS idx_order_platform ON cf_order(platform);
CREATE INDEX IF NOT EXISTS idx_payment_tenant_id ON cf_payment(tenant_id);
CREATE INDEX IF NOT EXISTS idx_payment_order_id ON cf_payment(order_id);
CREATE INDEX IF NOT EXISTS idx_logistics_tenant_id ON cf_logistics(tenant_id);
CREATE INDEX IF NOT EXISTS idx_logistics_order_id ON cf_logistics(order_id);
CREATE INDEX IF NOT EXISTS idx_config_tenant_id ON cf_config(tenant_id);
CREATE INDEX IF NOT EXISTS idx_config_shop_id ON cf_config(shop_id);
CREATE INDEX IF NOT EXISTS idx_config_key ON cf_config(config_key);
CREATE INDEX IF NOT EXISTS idx_audit_tenant_id ON cf_audit(tenant_id);
CREATE INDEX IF NOT EXISTS idx_audit_shop_id ON cf_audit(shop_id);
CREATE INDEX IF NOT EXISTS idx_audit_user_id ON cf_audit(user_id);
CREATE INDEX IF NOT EXISTS idx_audit_action ON cf_audit(action);
CREATE INDEX IF NOT EXISTS idx_audit_resource_type ON cf_audit(resource_type);
CREATE INDEX IF NOT EXISTS idx_audit_created_at ON cf_audit(created_at);

View File

@@ -0,0 +1,21 @@
-- 创建告警表
CREATE TABLE IF NOT EXISTS cf_alert (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
tenant_id VARCHAR(255) NOT NULL,
alert_type VARCHAR(50),
severity VARCHAR(50),
message TEXT,
status VARCHAR(50),
source VARCHAR(255),
threshold VARCHAR(255),
actual_value VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
resolved_at DATETIME
);
-- 为告警表添加索引
CREATE INDEX IF NOT EXISTS idx_alert_tenant_id ON cf_alert(tenant_id);
CREATE INDEX IF NOT EXISTS idx_alert_status ON cf_alert(status);
CREATE INDEX IF NOT EXISTS idx_alert_severity ON cf_alert(severity);
CREATE INDEX IF NOT EXISTS idx_alert_alert_type ON cf_alert(alert_type);
CREATE INDEX IF NOT EXISTS idx_alert_created_at ON cf_alert(created_at);

View File

@@ -0,0 +1,62 @@
# Authentication messages
auth.register.success=User registered successfully
auth.login.success=Login successful
auth.login.failure=Invalid username or password
auth.username.required=Username is required
auth.password.required=Password is required
auth.email.required=Email is required
auth.email.invalid=Invalid email format
auth.password.minlength=Password must be at least 6 characters
auth.username.minlength=Username must be at least 3 characters
auth.username.exists=Username already exists
# Product messages
product.create.success=Product created successfully
product.update.success=Product updated successfully
product.delete.success=Product deleted successfully
product.not.found=Product not found
product.title.required=Product title is required
product.price.required=Product price is required
product.price.positive=Product price must be positive
# Order messages
order.create.success=Order created successfully
order.update.success=Order updated successfully
order.not.found=Order not found
order.status.updated=Order status updated successfully
# Payment messages
payment.create.success=Payment created successfully
payment.update.success=Payment updated successfully
payment.not.found=Payment not found
payment.status.updated=Payment status updated successfully
# Logistics messages
logistics.create.success=Logistics created successfully
logistics.update.success=Logistics updated successfully
logistics.not.found=Logistics not found
logistics.status.updated=Logistics status updated successfully
# Alert messages
alert.create.success=Alert created successfully
alert.update.success=Alert updated successfully
alert.resolve.success=Alert resolved successfully
alert.not.found=Alert not found
# Monitoring messages
monitoring.health.ok=System health is OK
monitoring.health.error=System health check failed
monitoring.metrics.success=Performance metrics retrieved successfully
monitoring.services.success=Service status retrieved successfully
monitoring.database.success=Database status retrieved successfully
monitoring.cache.success=Cache status retrieved successfully
monitoring.stats.success=System stats retrieved successfully
# Common messages
common.success=Operation successful
common.error=Operation failed
common.invalid.request=Invalid request
common.missing.parameter=Missing required parameter
common.not.found=Resource not found
common.access.denied=Access denied
common.server.error=Server internal error

View File

@@ -0,0 +1,62 @@
# Authentication messages
auth.register.success=用户注册成功
auth.login.success=登录成功
auth.login.failure=用户名或密码错误
auth.username.required=用户名不能为空
auth.password.required=密码不能为空
auth.email.required=邮箱不能为空
auth.email.invalid=邮箱格式错误
auth.password.minlength=密码至少6个字符
auth.username.minlength=用户名至少3个字符
auth.username.exists=用户名已存在
# Product messages
product.create.success=商品创建成功
product.update.success=商品更新成功
product.delete.success=商品删除成功
product.not.found=商品不存在
product.title.required=商品标题不能为空
product.price.required=商品价格不能为空
product.price.positive=商品价格必须大于0
# Order messages
order.create.success=订单创建成功
order.update.success=订单更新成功
order.not.found=订单不存在
order.status.updated=订单状态更新成功
# Payment messages
payment.create.success=支付创建成功
payment.update.success=支付更新成功
payment.not.found=支付不存在
payment.status.updated=支付状态更新成功
# Logistics messages
logistics.create.success=物流创建成功
logistics.update.success=物流更新成功
logistics.not.found=物流不存在
logistics.status.updated=物流状态更新成功
# Alert messages
alert.create.success=告警创建成功
alert.update.success=告警更新成功
alert.resolve.success=告警已解决
alert.not.found=告警不存在
# Monitoring messages
monitoring.health.ok=系统健康状态良好
monitoring.health.error=系统健康检查失败
monitoring.metrics.success=性能指标获取成功
monitoring.services.success=服务状态获取成功
monitoring.database.success=数据库状态获取成功
monitoring.cache.success=缓存状态获取成功
monitoring.stats.success=系统统计信息获取成功
# Common messages
common.success=操作成功
common.error=操作失败
common.invalid.request=无效的请求
common.missing.parameter=缺少必要参数
common.not.found=资源不存在
common.access.denied=访问被拒绝
common.server.error=服务器内部错误

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_HOME" value="./logs" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 错误日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务日志 -->
<appender name="BUSINESS_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/business.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/business-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志配置 -->
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<!-- 业务日志配置 -->
<logger name="com.crawlful.hub.service" level="info" additivity="false">
<appender-ref ref="BUSINESS_FILE" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- 控制器日志配置 -->
<logger name="com.crawlful.hub.api.controllers" level="info" additivity="false">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- 数据库日志配置 -->
<logger name="org.springframework.data.jpa" level="warn" additivity="false">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- 安全日志配置 -->
<logger name="org.springframework.security" level="warn" additivity="false">
<appender-ref ref="FILE" />
<appender-ref ref="CONSOLE" />
</logger>
</configuration>