配置页增加数据库类型字段

master
Lxy 1 month ago
parent 1106b3375f
commit 74f591ee78

@ -13,6 +13,7 @@ from app.services.amazing_data_adapter import AmazingDataAdapter
from app.services.sdk_manager import sdk_manager from app.services.sdk_manager import sdk_manager
from app.core.security import get_current_user from app.core.security import get_current_user
from app.models.user import User from app.models.user import User
from app.models.config import SystemConfig
router = APIRouter() router = APIRouter()
@ -164,11 +165,22 @@ async def get_system_configs(
current_user: User = Depends(get_current_user) current_user: User = Depends(get_current_user)
): ):
"""获取系统配置数据库、Redis等""" """获取系统配置数据库、Redis等"""
configs = { try:
"database": ConfigService.get_system_config(db, "DATABASE_URL") or "sqlite:///./amazing_data.db", configs = db.query(SystemConfig).all()
"redis": ConfigService.get_system_config(db, "REDIS_URL") or "redis://localhost:6379/0" configs_list = [
} {
return ResponseModel(data=configs) "configName": c.config_name,
"configKey": c.config_key,
"configValue": c.config_value,
"currentDbType": c.current_db_type,
"isActive": c.is_active
}
for c in configs
]
return ResponseModel(data={"configs": configs_list})
except Exception as e:
raise HTTPException(status_code=500, detail="获取系统配置失败")
@router.put("/system", response_model=ResponseModel) @router.put("/system", response_model=ResponseModel)
@ -178,21 +190,28 @@ async def update_system_configs(
current_user: User = Depends(get_current_user) current_user: User = Depends(get_current_user)
): ):
"""更新系统配置""" """更新系统配置"""
if "database" in configs: if "configs" in configs:
ConfigService.set_system_config( try:
db, for config in configs["configs"]:
"DATABASE_URL", if not config.get("configKey") or not config.get("configValue"):
configs["database"], raise HTTPException(status_code=400, detail="配置键和配置值不能为空")
"数据库连接URL" ConfigService.set_system_config(
) db,
config.get("configKey"),
if "redis" in configs: config.get("configValue"),
ConfigService.set_system_config( config.get("configName"),
db, config.get("currentDbType"),
"REDIS_URL", config.get("description"),
configs["redis"], config.get("isActive", True),
"Redis连接URL" auto_commit=False
) )
db.commit()
except HTTPException:
db.rollback()
raise
except Exception as e:
db.rollback()
raise HTTPException(status_code=500, detail=f"更新系统配置失败: {str(e)}")
return ResponseModel(message="更新成功") return ResponseModel(message="更新成功")

@ -37,7 +37,7 @@ class CacheTaskDetail(Base):
"""缓存任务详情表""" """缓存任务详情表"""
__tablename__ = "cache_task_details" __tablename__ = "cache_task_details"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
task_id = Column(Integer, ForeignKey("cache_tasks.id", ondelete="CASCADE"), nullable=False, index=True) task_id = Column(Integer, ForeignKey("cache_tasks.id", ondelete="CASCADE"), nullable=False, index=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
trade_date = Column(Date, nullable=False) trade_date = Column(Date, nullable=False)

@ -29,8 +29,11 @@ class SystemConfig(Base):
__tablename__ = "system_configs" __tablename__ = "system_configs"
id = Column(Integer, primary_key=True, index=True) id = Column(Integer, primary_key=True, index=True)
config_name = Column(String(100), nullable=False)
config_key = Column(String(100), unique=True, nullable=False) config_key = Column(String(100), unique=True, nullable=False)
config_value = Column(Text, nullable=False) config_value = Column(Text, nullable=False)
current_db_type = Column(String(50))
is_active = Column(Boolean, default=True)
description = Column(Text) description = Column(Text)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow) created_at = Column(DateTime(timezone=True), default=datetime.utcnow)
updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow) updated_at = Column(DateTime(timezone=True), default=datetime.utcnow, onupdate=datetime.utcnow)

@ -10,7 +10,7 @@ class FinanceBalanceSheet(Base):
"""资产负债表""" """资产负债表"""
__tablename__ = "finance_balance_sheet" __tablename__ = "finance_balance_sheet"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
report_date = Column(Date, nullable=False, index=True) report_date = Column(Date, nullable=False, index=True)
report_type = Column(Integer) report_type = Column(Integer)
@ -65,7 +65,7 @@ class FinanceIncome(Base):
"""利润表""" """利润表"""
__tablename__ = "finance_income" __tablename__ = "finance_income"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
report_date = Column(Date, nullable=False, index=True) report_date = Column(Date, nullable=False, index=True)
report_type = Column(Integer) report_type = Column(Integer)

@ -31,7 +31,7 @@ class FutureKlineDaily(Base):
"""期货日线数据表""" """期货日线数据表"""
__tablename__ = "future_kline_daily" __tablename__ = "future_kline_daily"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
trade_date = Column(Date, nullable=False, index=True) trade_date = Column(Date, nullable=False, index=True)
open = Column(Numeric(12, 4), nullable=False) open = Column(Numeric(12, 4), nullable=False)
@ -51,7 +51,7 @@ class FutureKlineMin(Base):
"""期货分钟数据表""" """期货分钟数据表"""
__tablename__ = "future_kline_min" __tablename__ = "future_kline_min"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
period_type = Column(String(10), nullable=False) period_type = Column(String(10), nullable=False)
trade_datetime = Column(DateTime, nullable=False, index=True) trade_datetime = Column(DateTime, nullable=False, index=True)

@ -10,7 +10,7 @@ class RealtimeSnapshot(Base):
"""实时快照数据表""" """实时快照数据表"""
__tablename__ = "realtime_snapshot" __tablename__ = "realtime_snapshot"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
security_type = Column(String(20), nullable=False) # stock, future, index, etf, kzz, option security_type = Column(String(20), nullable=False) # stock, future, index, etf, kzz, option
trade_time = Column(DateTime, nullable=False, index=True) trade_time = Column(DateTime, nullable=False, index=True)

@ -30,7 +30,7 @@ class StockKlineDaily(Base):
"""股票日线数据表""" """股票日线数据表"""
__tablename__ = "stock_kline_daily" __tablename__ = "stock_kline_daily"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
trade_date = Column(Date, nullable=False, index=True) trade_date = Column(Date, nullable=False, index=True)
open = Column(Numeric(12, 4), nullable=False) open = Column(Numeric(12, 4), nullable=False)
@ -48,7 +48,7 @@ class StockKlineMin(Base):
"""股票分钟数据表""" """股票分钟数据表"""
__tablename__ = "stock_kline_min" __tablename__ = "stock_kline_min"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), nullable=False, index=True) code = Column(String(20), nullable=False, index=True)
period_type = Column(String(10), nullable=False) # min1, min5, min15, min30, min60 period_type = Column(String(10), nullable=False) # min1, min5, min15, min30, min60
trade_datetime = Column(DateTime, nullable=False, index=True) trade_datetime = Column(DateTime, nullable=False, index=True)

@ -11,7 +11,7 @@ class StockBasic(Base):
"""股票基础数据表""" """股票基础数据表"""
__tablename__ = "stock_basic" __tablename__ = "stock_basic"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
code = Column(String(20), unique=True, nullable=False, index=True) code = Column(String(20), unique=True, nullable=False, index=True)
name = Column(String(50)) name = Column(String(50))
total_shares = Column(BigInteger) total_shares = Column(BigInteger)
@ -46,7 +46,7 @@ class IndexTrade(Base):
"""指数交易表""" """指数交易表"""
__tablename__ = "index_trade" __tablename__ = "index_trade"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
index_code = Column(String(20), ForeignKey("index_basic.code"), nullable=False, index=True) index_code = Column(String(20), ForeignKey("index_basic.code"), nullable=False, index=True)
trade_date = Column(Date, nullable=False, index=True) trade_date = Column(Date, nullable=False, index=True)
open = Column(Numeric(10, 3)) open = Column(Numeric(10, 3))

@ -24,7 +24,7 @@ class APITestLog(Base):
"""API测试日志表""" """API测试日志表"""
__tablename__ = "api_test_logs" __tablename__ = "api_test_logs"
id = Column(BigInteger, primary_key=True, index=True) id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
test_name = Column(String(200), nullable=False) test_name = Column(String(200), nullable=False)
api_category = Column(String(50), nullable=False, index=True) api_category = Column(String(50), nullable=False, index=True)
api_endpoint = Column(String(200), nullable=False, index=True) api_endpoint = Column(String(200), nullable=False, index=True)

@ -130,23 +130,32 @@ class ConfigService:
return config.config_value if config else None return config.config_value if config else None
@staticmethod @staticmethod
def set_system_config(db: Session, key: str, value: str, description: str = None): def set_system_config(db: Session, key: str, value: str, config_name: str = None, current_db_type: str = None, description: str = None, is_active: bool = True, auto_commit: bool = True):
"""设置系统配置""" """设置系统配置"""
config = db.query(SystemConfig).filter(SystemConfig.config_key == key).first() config = db.query(SystemConfig).filter(SystemConfig.config_key == key).first()
if config: if config:
config.config_value = value config.config_value = value
config.is_active = is_active
if config_name:
config.config_name = config_name
if current_db_type:
config.current_db_type = current_db_type
if description: if description:
config.description = description config.description = description
else: else:
config = SystemConfig( config = SystemConfig(
config_key=key, config_key=key,
config_value=value, config_value=value,
config_name=config_name or key,
current_db_type=current_db_type,
is_active=is_active,
description=description description=description
) )
db.add(config) db.add(config)
db.commit() if auto_commit:
db.commit()
@staticmethod @staticmethod
def get_all_system_configs(db: Session) -> dict: def get_all_system_configs(db: Session) -> dict:

@ -59,12 +59,45 @@
</div> </div>
<el-card> <el-card>
<h4 style="margin: 10px 0">当前系统配置</h4>
<el-table :data="systemConfigsList" stripe border>
<el-table-column prop="configName" label="配置名称" width="180" />
<el-table-column prop="configKey" label="配置键" width="200" />
<el-table-column prop="configValue" label="配置值" />
<el-table-column prop="currentDbType" label="当前数据库类型" width="150">
<template #default="{ row }">
<el-tag v-if="row.currentDbType" :type="row.currentDbType === 'postgresql' ? 'success' : row.currentDbType === 'sqlite' ? 'info' : 'warning'">
{{ row.currentDbType }}
</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="isActive" label="启用状态" width="100">
<template #default="{ row }">
<el-tag :type="row.isActive ? 'success' : 'danger'">
{{ row.isActive ? '启用' : '禁用' }}
</el-tag>
</template>
</el-table-column>
</el-table>
<el-divider />
<h4 style="margin: 10px 0">修改配置</h4>
<el-form <el-form
ref="systemFormRef" ref="systemFormRef"
:model="systemForm" :model="systemForm"
:rules="systemRules" :rules="systemRules"
label-width="100px" label-width="100px"
> >
<el-form-item label="配置名称" prop="configName">
<el-input v-model="systemForm.configName" placeholder="例如: DATABASE_URL" />
</el-form-item>
<el-form-item label="配置键" prop="configKey">
<el-input v-model="systemForm.configKey" placeholder="例如: DATABASE_URL" />
</el-form-item>
<el-form-item label="数据库类型" prop="dbType"> <el-form-item label="数据库类型" prop="dbType">
<el-select v-model="systemForm.dbType" placeholder="选择数据库类型"> <el-select v-model="systemForm.dbType" placeholder="选择数据库类型">
<el-option label="SQLite" value="sqlite" /> <el-option label="SQLite" value="sqlite" />
@ -90,9 +123,15 @@
<el-form-item label="SQLite路径" prop="dbPath" v-if="systemForm.dbType === 'sqlite'"> <el-form-item label="SQLite路径" prop="dbPath" v-if="systemForm.dbType === 'sqlite'">
<el-input v-model="systemForm.dbPath" placeholder="例如: ./amazing_data.db" /> <el-input v-model="systemForm.dbPath" placeholder="例如: ./amazing_data.db" />
</el-form-item> </el-form-item>
<el-form-item label="Redis连接" prop="redis"> <el-form-item label="启用状态">
<el-switch v-model="systemForm.isActive" />
</el-form-item>
<el-form-item label="Redis连接" prop="redis" v-if="systemForm.configKey === 'REDIS_URL'">
<el-input v-model="systemForm.redis" placeholder="例如: redis://localhost:6379/0" /> <el-input v-model="systemForm.redis" placeholder="例如: redis://localhost:6379/0" />
</el-form-item> </el-form-item>
<el-form-item label="Redis启用" prop="redisEnabled" v-if="systemForm.configKey === 'REDIS_URL'">
<el-switch v-model="systemForm.redisEnabled" />
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleSystemSubmit" :loading="systemSubmitting"> <el-button type="primary" @click="handleSystemSubmit" :loading="systemSubmitting">
保存配置 保存配置
@ -198,7 +237,10 @@ const formRef = ref()
const currentId = ref<number | null>(null) const currentId = ref<number | null>(null)
// //
const systemConfigsList = ref<any[]>([])
const systemForm = reactive({ const systemForm = reactive({
configName: '数据库配置',
configKey: 'DATABASE_URL',
dbType: 'sqlite', dbType: 'sqlite',
dbHost: 'localhost', dbHost: 'localhost',
dbPort: 5432, dbPort: 5432,
@ -206,7 +248,9 @@ const systemForm = reactive({
dbPassword: '', dbPassword: '',
dbName: 'amazing_data', dbName: 'amazing_data',
dbPath: './amazing_data.db', dbPath: './amazing_data.db',
redis: 'redis://localhost:6379/0' redis: 'redis://localhost:6379/0',
isActive: true,
redisEnabled: true
}) })
const systemRules = { const systemRules = {
@ -295,8 +339,18 @@ const fetchSystemConfigs = async () => {
try { try {
const res: any = await getSystemConfigs() const res: any = await getSystemConfigs()
if (res.data) { if (res.data) {
parseDatabaseUrl(res.data.database || 'sqlite:///./amazing_data.db') systemConfigsList.value = res.data.configs || []
systemForm.redis = res.data.redis || 'redis://localhost:6379/0' const dbConfig = systemConfigsList.value.find(c => c.configKey === 'DATABASE_URL')
if (dbConfig) {
parseDatabaseUrl(dbConfig.configValue || 'sqlite:///./amazing_data.db')
systemForm.configName = dbConfig.configName || '数据库配置'
systemForm.isActive = dbConfig.isActive ?? true
}
const redisConfig = systemConfigsList.value.find(c => c.configKey === 'REDIS_URL')
if (redisConfig) {
systemForm.redis = redisConfig.configValue || 'redis://localhost:6379/0'
systemForm.redisEnabled = redisConfig.isActive ?? true
}
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)
@ -365,10 +419,25 @@ const handleSystemSubmit = async () => {
try { try {
const databaseUrl = buildDatabaseUrl() const databaseUrl = buildDatabaseUrl()
await updateSystemConfigs({ await updateSystemConfigs({
database: databaseUrl, configs: [
redis: systemForm.redis {
configName: systemForm.configName,
configKey: systemForm.configKey,
configValue: databaseUrl,
currentDbType: systemForm.dbType,
isActive: systemForm.isActive
},
{
configName: 'Redis配置',
configKey: 'REDIS_URL',
configValue: systemForm.redis,
currentDbType: null,
isActive: systemForm.redisEnabled
}
]
}) })
ElMessage.success('保存成功') ElMessage.success('保存成功')
fetchSystemConfigs()
} catch (error) { } catch (error) {
console.error(error) console.error(error)
} finally { } finally {
@ -377,6 +446,8 @@ const handleSystemSubmit = async () => {
} }
const handleSystemReset = () => { const handleSystemReset = () => {
systemForm.configName = '数据库配置'
systemForm.configKey = 'DATABASE_URL'
systemForm.dbType = 'sqlite' systemForm.dbType = 'sqlite'
systemForm.dbHost = 'localhost' systemForm.dbHost = 'localhost'
systemForm.dbPort = 5432 systemForm.dbPort = 5432
@ -385,6 +456,8 @@ const handleSystemReset = () => {
systemForm.dbName = 'amazing_data' systemForm.dbName = 'amazing_data'
systemForm.dbPath = './amazing_data.db' systemForm.dbPath = './amazing_data.db'
systemForm.redis = 'redis://localhost:6379/0' systemForm.redis = 'redis://localhost:6379/0'
systemForm.isActive = true
systemForm.redisEnabled = true
dbStructureStatus.value = null dbStructureStatus.value = null
showInitButton.value = false showInitButton.value = false
} }

Loading…
Cancel
Save