Add roles/ACL so admin and users can issue activation codes; exe opens review login.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-17 18:07:23 +08:00
parent 1d4d5b06df
commit a4474c28ea
13 changed files with 517 additions and 145 deletions
+1
View File
@@ -4,6 +4,7 @@
- 连接本机已登录 MT5,市价开平、ATR 止损止盈、保本、满仓灰显等(由原 `MT5黄金方案/Desktop` 迁入)
- **通用包 + 首次激活**:启动时填写中控地址与激活码
- **打开复盘**:主界面按钮用浏览器打开中控 `/login`,用网页账号直接登录复盘
- **自动上报**:开仓/平仓成功后 `POST /api/v1/trades`,并上传 M1/M5/M15/H1 K 线供网页复盘
## 本地配置
+34 -1
View File
@@ -7,9 +7,10 @@ import math
import sys
import threading
import time
import webbrowser
import tkinter as tk
from datetime import datetime, timedelta
from tkinter import messagebox, ttk
from tkinter import messagebox, simpledialog, ttk
from typing import Any, Optional, Tuple, Union
# 顶层导入,避免打包 exe 漏依赖
@@ -66,6 +67,17 @@ BE_MIN_MOVE_USD = 3.0 # 价格向有利方向走出该美金距离才可保本
BE_OFFSET_USD = 1.0 # 保本止损 = 开仓价 ± 1$
def simpledialog_ask_server(parent: tk.Misc) -> str:
"""未激活或本地无中控地址时,让用户输入复盘服务器 URL。"""
value = simpledialog.askstring(
"打开复盘",
"请输入中控地址(例如 http://192.168.1.10:5800)",
parent=parent,
initialvalue="http://127.0.0.1:5800",
)
return (value or "").strip()
def enable_dpi_awareness() -> None:
"""避免高分屏下 Tk 窗口被系统拉伸发虚。"""
if sys.platform != "win32":
@@ -743,6 +755,9 @@ class OrderApp(tk.Tk):
ttk.Label(pos_bar, text="持仓记录", font=("Microsoft YaHei UI", 13, "bold")).pack(side=tk.LEFT)
self.btn_break_even = self._mk_btn(pos_bar, "保本", COLOR_BE, self.on_break_even, h=34, w=90)
self.btn_break_even.pack(side=tk.RIGHT, padx=4)
self._mk_btn(pos_bar, "打开复盘", "#3a5a80", self.on_open_review, h=34, w=100).pack(
side=tk.RIGHT, padx=4
)
self._set_be_button_enabled(False)
# 持仓列表:无竖线;列宽按权重拉满右侧;平仓红色边框按钮
@@ -1430,6 +1445,24 @@ class OrderApp(tk.Tk):
self._run_async(work)
def on_open_review(self) -> None:
"""打开中控复盘登录页(浏览器)。"""
server = ""
try:
server = (load_device().get("server") or "").rstrip("/")
except Exception:
server = ""
if not server:
server = simpledialog_ask_server(self)
if not server:
return
url = server.rstrip("/") + "/login"
try:
webbrowser.open(url)
self.set_status(f"已打开复盘登录页:{url}", ok=True)
except Exception as exc:
self.set_status(f"无法打开浏览器:{exc}", ok=False)
def destroy(self) -> None:
try:
self.bridge.shutdown()