From 970dc8bfee7770f028be1ca1bb1fa95d0d46455b Mon Sep 17 00:00:00 2001 From: kx_guo Date: Sat, 5 Sep 2026 15:43:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=BF=90=E8=90=A5=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E6=B3=A8=E5=86=8C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/main.py | 10 ++---- frontend/src/main.jsx | 81 +++++++++++++------------------------------ 2 files changed, 26 insertions(+), 65 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index ead4cf2..3dfed97 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -2019,14 +2019,8 @@ def dingtalk_login_callback(response: Response, code: str = "", state: str = "", @app.post("/api/admin/auth/register", status_code=status.HTTP_201_CREATED) -def register(payload: RegisterRequest, db: Session = Depends(get_db)): - if db.scalar(select(AdminUser).where(AdminUser.username == payload.username)): - raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="用户名已存在") - user = AdminUser(username=payload.username, password_hash=hash_password(payload.password), display_name=payload.display_name, role_code="operator") - db.add(user) - db.commit() - db.refresh(user) - return {"success": True, "data": {"user": public_user(user)}} +def register(_: RegisterRequest): + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="运营后台已关闭自助注册,请联系管理员创建账号") @app.get("/api/admin/auth/me") diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index ea2ab1c..79db806 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -80,13 +80,15 @@ async function readReferenceFile(file, requestApi = api) { } function LoginPage({ onLogin }) { - const [registering, setRegistering] = useState(false); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); - const [displayName, setDisplayName] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [dingtalkLoading, setDingtalkLoading] = useState(false); + const [autoDingtalkLogin, setAutoDingtalkLogin] = useState(false); + const autoLoginStarted = useRef(false); + const query = new URLSearchParams(window.location.search); + const inDingtalkWorkbench = /DingTalk|AliApp\(DT/i.test(navigator.userAgent || "") || query.get("from") === "dingtalk"; async function loginWithDingTalk() { setDingtalkLoading(true); setError(""); @@ -96,42 +98,36 @@ function LoginPage({ onLogin }) { } catch (err) { setError(err.message); setDingtalkLoading(false); + setAutoDingtalkLogin(false); } } async function submit(event) { event.preventDefault(); setError(""); - if (!username.trim() || !password || (registering && !displayName.trim())) + if (!username.trim() || !password) return setError("\u8bf7\u5b8c\u6574\u586b\u5199\u4fe1\u606f"); setLoading(true); try { - if (registering) { - await api("/api/admin/auth/register", { - method: "POST", - body: JSON.stringify({ - username, - password, - display_name: displayName, - }), - }); - setRegistering(false); - setPassword(""); - setError( - "\u6ce8\u518c\u6210\u529f\uff0c\u8bf7\u4f7f\u7528\u65b0\u8d26\u53f7\u767b\u5f55", - ); - } else { - const result = await api("/api/admin/auth/login", { - method: "POST", - body: JSON.stringify({ username, password }), - }); - onLogin(result.data.user); - } + const result = await api("/api/admin/auth/login", { + method: "POST", + body: JSON.stringify({ username, password }), + }); + onLogin(result.data.user); } catch (err) { setError(err.message); } finally { setLoading(false); } } + useEffect(() => { + if (!inDingtalkWorkbench || query.get("dingtalk") === "success" || autoLoginStarted.current) return; + autoLoginStarted.current = true; + setAutoDingtalkLogin(true); + loginWithDingTalk(); + }, []); + if (autoDingtalkLogin) { + return
正在验证钉钉身份…
; + } return (
@@ -144,28 +140,17 @@ function LoginPage({ onLogin }) {
{Z.brand}
-

{registering ? Z.register : Z.backend}

+

{Z.backend}

从钉钉工作台进入,使用钉钉身份安全登录

或使用后台账号
- {registering && ( - - )} {error &&
{error}
}
-
{ "\u8fd0\u8425\u8d26\u53f7\u767b\u5f55 \u00b7 \u7528\u6237 A/B \u8bf7\u4f7f\u7528\u72ec\u7acb\u4efb\u52a1\u94fe\u63a5"