This commit is contained in:
薇薇安 2026-01-21 19:06:49 +08:00
parent fe60f12ee0
commit 18cfeaf5db
2 changed files with 52 additions and 6 deletions

View File

@ -87,8 +87,8 @@ async def list_accounts(user: Dict[str, Any] = Depends(get_current_user)) -> Lis
r = Account.get(int(aid))
if not r:
continue
# 普通用户:不返回密钥相关字段
_, _, use_testnet = Account.get_credentials(int(aid))
# 普通用户:不返回密钥明文,但返回“是否已配置”的状态,方便前端提示
api_key, api_secret, use_testnet = Account.get_credentials(int(aid))
out.append(
{
"id": int(aid),
@ -96,6 +96,8 @@ async def list_accounts(user: Dict[str, Any] = Depends(get_current_user)) -> Lis
"status": r.get("status") or "active",
"use_testnet": bool(use_testnet),
"role": membership_map.get(int(aid), "viewer"),
"has_api_key": bool(api_key),
"has_api_secret": bool(api_secret),
}
)
return out

View File

@ -15,6 +15,7 @@ const ConfigPanel = ({ currentUser }) => {
const [systemBusy, setSystemBusy] = useState(false)
const [accountTradingStatus, setAccountTradingStatus] = useState(null)
const [accountTradingErr, setAccountTradingErr] = useState('')
const [currentAccountMeta, setCurrentAccountMeta] = useState(null)
//
const [accountId, setAccountId] = useState(getCurrentAccountId())
@ -220,6 +221,21 @@ const ConfigPanel = ({ currentUser }) => {
}
}
const loadCurrentAccountMeta = async () => {
try {
const list = await api.getAccounts()
const accounts = Array.isArray(list) ? list : []
const meta = accounts.find((a) => parseInt(String(a?.id || '0'), 10) === parseInt(String(accountId || '0'), 10))
setCurrentAccountMeta(meta || null)
// testnet
if (meta && !credForm.api_key && !credForm.api_secret) {
setCredForm((prev) => ({ ...prev, use_testnet: !!meta.use_testnet }))
}
} catch (e) {
setCurrentAccountMeta(null)
}
}
const handleAccountTradingEnsure = async () => {
setSystemBusy(true)
setMessage('')
@ -235,6 +251,12 @@ const ConfigPanel = ({ currentUser }) => {
}
const handleAccountTradingStart = async () => {
const hasKey = !!currentAccountMeta?.has_api_key
const hasSecret = !!currentAccountMeta?.has_api_secret
if (!hasKey || !hasSecret) {
setMessage('请先在“账号密钥(当前账号)”中配置 BINANCE_API_KEY 与 BINANCE_API_SECRET然后再启动交易进程')
return
}
setSystemBusy(true)
setMessage('')
try {
@ -263,6 +285,12 @@ const ConfigPanel = ({ currentUser }) => {
}
const handleAccountTradingRestart = async () => {
const hasKey = !!currentAccountMeta?.has_api_key
const hasSecret = !!currentAccountMeta?.has_api_secret
if (!hasKey || !hasSecret) {
setMessage('请先在“账号密钥(当前账号)”中配置 BINANCE_API_KEY 与 BINANCE_API_SECRET然后再重启交易进程')
return
}
setSystemBusy(true)
setMessage('')
try {
@ -359,6 +387,7 @@ const ConfigPanel = ({ currentUser }) => {
}
loadBackendStatus()
loadAccountTradingStatus()
loadCurrentAccountMeta()
const timer = setInterval(() => {
if (isAdmin) {
@ -366,6 +395,7 @@ const ConfigPanel = ({ currentUser }) => {
}
loadBackendStatus()
loadAccountTradingStatus()
loadCurrentAccountMeta()
}, 3000)
return () => clearInterval(timer)
@ -395,9 +425,12 @@ const ConfigPanel = ({ currentUser }) => {
setLoading(true)
loadConfigs()
checkFeasibility()
loadSystemStatus()
if (isAdmin) {
loadSystemStatus()
}
loadBackendStatus()
loadAccountTradingStatus()
loadCurrentAccountMeta()
}, [accountId])
// localStorage
@ -829,20 +862,26 @@ const ConfigPanel = ({ currentUser }) => {
<div className="accounts-form">
<label>
API KEY留空=不改
<div className="system-status-meta" style={{ marginTop: '4px' }}>
当前状态{currentAccountMeta?.has_api_key ? '已配置(******' : '未配置(必须先配置才能启动交易)'}
</div>
<input
type="password"
value={credForm.api_key}
onChange={(e) => setCredForm({ ...credForm, api_key: e.target.value })}
placeholder="粘贴你的 Binance API KEY"
placeholder={currentAccountMeta?.has_api_key ? '已配置(******),如需更换请重新填写' : '粘贴你的 Binance API KEY'}
/>
</label>
<label>
API SECRET留空=不改
<div className="system-status-meta" style={{ marginTop: '4px' }}>
当前状态{currentAccountMeta?.has_api_secret ? '已配置(******' : '未配置(必须先配置才能启动交易)'}
</div>
<input
type="password"
value={credForm.api_secret}
onChange={(e) => setCredForm({ ...credForm, api_secret: e.target.value })}
placeholder="粘贴你的 Binance API SECRET"
placeholder={currentAccountMeta?.has_api_secret ? '已配置(******),如需更换请重新填写' : '粘贴你的 Binance API SECRET'}
/>
</label>
<label className="accounts-inline">
@ -1454,7 +1493,12 @@ const ConfigPanel = ({ currentUser }) => {
<h3>{label}</h3>
<div className="config-grid">
{Object.entries(configs)
.filter(([key, config]) => config.category === category)
.filter(([key, config]) => {
if (config.category !== category) return false
//
if (key === 'BINANCE_API_KEY' || key === 'BINANCE_API_SECRET' || key === 'USE_TESTNET') return false
return true
})
.map(([key, config]) => (
<ConfigItem
key={key}