diff --git a/client/web/src/plugin/common/reg.ts b/client/web/src/plugin/common/reg.ts
index 5c2cb0a0..55391271 100644
--- a/client/web/src/plugin/common/reg.ts
+++ b/client/web/src/plugin/common/reg.ts
@@ -314,3 +314,11 @@ export const [pluginGroupConfigItems, regPluginGroupConfigItem] = buildRegList<{
loading: boolean;
}) => ReactElement;
}>();
+
+/**
+ * 注册登录操作
+ */
+export const [pluginLoginAction, regLoginAction] = buildRegList<{
+ name: string;
+ component: React.ComponentType;
+}>();
diff --git a/client/web/src/routes/Entry/LoginView.tsx b/client/web/src/routes/Entry/LoginView.tsx
index d4b7b1ed..c17d6631 100644
--- a/client/web/src/routes/Entry/LoginView.tsx
+++ b/client/web/src/routes/Entry/LoginView.tsx
@@ -4,12 +4,10 @@ import {
isValidStr,
loginWithEmail,
t,
- useAppSelector,
useAsyncFn,
useGlobalConfigStore,
} from 'tailchat-shared';
import React, { useEffect, useState } from 'react';
-import { Spinner } from '../../components/Spinner';
import { string } from 'yup';
import { useLocation, useNavigate } from 'react-router';
import { setUserJWT } from '../../utils/jwt-helper';
@@ -23,6 +21,7 @@ import { LanguageSelect } from '@/components/LanguageSelect';
import { EntryInput } from './components/Input';
import { SecondaryBtn } from './components/SecondaryBtn';
import { PrimaryBtn } from './components/PrimaryBtn';
+import { pluginLoginAction } from '@/plugin/common';
/**
* TODO:
@@ -156,6 +155,12 @@ export const LoginView: React.FC = React.memo(() => {
)}
+
+ {pluginLoginAction.map((item) => {
+ const { name, component: Component } = item;
+
+ return ;
+ })}
diff --git a/client/web/src/routes/Entry/components/PrimaryBtn.tsx b/client/web/src/routes/Entry/components/PrimaryBtn.tsx
index 06c75971..3ac3a4fa 100644
--- a/client/web/src/routes/Entry/components/PrimaryBtn.tsx
+++ b/client/web/src/routes/Entry/components/PrimaryBtn.tsx
@@ -1,6 +1,7 @@
import { Spinner } from '@/components/Spinner';
import clsx from 'clsx';
import React, { ButtonHTMLAttributes } from 'react';
+import _omit from 'lodash/omit';
export const PrimaryBtn: React.FC<
ButtonHTMLAttributes
& {
@@ -10,7 +11,7 @@ export const PrimaryBtn: React.FC<
return (