feat: 重构前端代码结构并添加Java后端支持

- 重构前端导入和组件结构,优化代码组织
- 添加Java后端基础框架和API实现
- 修复类型定义和接口兼容性问题
- 新增测试页面和工具函数
- 优化国际化支持和错误处理
- 更新依赖配置和构建脚本

新增Java后端模块:
- 实现基础认证、订单、支付等服务
- 添加Swagger API文档支持
- 配置数据库连接和缓存
- 实现国际化消息处理
- 添加安全过滤器和限流控制
This commit is contained in:
2026-03-30 16:51:18 +08:00
parent 1b14947e7b
commit e47beffaf9
199 changed files with 24719 additions and 958 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

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>