From c2818257dce76310e972e89858dfc9aebcbd35c9 Mon Sep 17 00:00:00 2001 From: xlsea Date: Thu, 24 Apr 2025 17:36:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=8D=95=E7=82=B9?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=9B=9E=E8=B0=83=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/langs/en-us.ts | 3 +- src/locales/langs/zh-cn.ts | 3 +- src/plugins/loading.ts | 8 +- src/router/elegant/imports.ts | 1 + src/router/elegant/routes.ts | 11 ++ src/router/elegant/transform.ts | 1 + src/router/routes/index.ts | 12 ++ src/service/api/auth.ts | 9 ++ src/service/api/system/index.ts | 1 + src/service/api/system/social.ts | 13 +++ src/service/request/index.ts | 1 + src/store/modules/auth/index.ts | 5 +- src/typings/api/api.d.ts | 10 ++ src/typings/api/system.api.d.ts | 18 +++ src/typings/elegant-router.d.ts | 3 + .../_builtin/login/modules/pwd-login.vue | 10 +- src/views/_builtin/social-callback/index.vue | 108 ++++++++++++++++++ 17 files changed, 207 insertions(+), 10 deletions(-) create mode 100644 src/service/api/system/social.ts create mode 100644 src/views/_builtin/social-callback/index.vue diff --git a/src/locales/langs/en-us.ts b/src/locales/langs/en-us.ts index d498a089..dbd6b1d1 100644 --- a/src/locales/langs/en-us.ts +++ b/src/locales/langs/en-us.ts @@ -181,7 +181,8 @@ const local: App.I18n.Schema = { 'monitor_login-infor': 'Login Log', 'monitor_oper-log': 'Operate Log', system_client: 'Client Management', - system_notice: 'Notice Management' + system_notice: 'Notice Management', + 'social-callback': 'Social Callback' }, page: { login: { diff --git a/src/locales/langs/zh-cn.ts b/src/locales/langs/zh-cn.ts index 16d97b74..6b3dbe6a 100644 --- a/src/locales/langs/zh-cn.ts +++ b/src/locales/langs/zh-cn.ts @@ -181,7 +181,8 @@ const local: App.I18n.Schema = { 'monitor_login-infor': '登录日志', 'monitor_oper-log': '操作日志', system_client: '客户端管理', - system_notice: '通知公告' + system_notice: '通知公告', + 'social-callback': '单点登录回调' }, page: { login: { diff --git a/src/plugins/loading.ts b/src/plugins/loading.ts index 82591041..c59e1df4 100644 --- a/src/plugins/loading.ts +++ b/src/plugins/loading.ts @@ -6,7 +6,7 @@ import { toggleHtmlClass } from '@/utils/common'; import systemLogo from '@/assets/imgs/logo.png'; import { $t } from '@/locales'; -export function setupLoading() { +export function loading() { const themeColor = localStg.get('themeColor') || '#2080f0'; const darkMode = localStg.get('darkMode') || false; const { r, g, b } = getRgb(themeColor); @@ -17,7 +17,7 @@ export function setupLoading() { toggleHtmlClass(DARK_CLASS).add(); } - const loading = ` + return `
@@ -26,10 +26,12 @@ export function setupLoading() {

${$t('system.title')}

`; +} +export function setupLoading() { const app = document.getElementById('app'); if (app) { - app.innerHTML = loading; + app.innerHTML = loading(); } } diff --git a/src/router/elegant/imports.ts b/src/router/elegant/imports.ts index 8d4098cc..90a75bbc 100644 --- a/src/router/elegant/imports.ts +++ b/src/router/elegant/imports.ts @@ -20,6 +20,7 @@ export const views: Record Promise import("@/views/_builtin/500/index.vue"), "iframe-page": () => import("@/views/_builtin/iframe-page/[url].vue"), login: () => import("@/views/_builtin/login/index.vue"), + "social-callback": () => import("@/views/_builtin/social-callback/index.vue"), home: () => import("@/views/home/index.vue"), "monitor_login-infor": () => import("@/views/monitor/login-infor/index.vue"), "monitor_oper-log": () => import("@/views/monitor/oper-log/index.vue"), diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index 5baca799..cca82f82 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -104,6 +104,17 @@ export const generatedRoutes: GeneratedRoute[] = [ } ] }, + { + name: 'social-callback', + path: '/social-callback', + component: 'layout.blank$view.social-callback', + meta: { + title: 'social-callback', + i18nKey: 'route.social-callback', + constant: true, + hideInMenu: true + } + }, { name: 'system', path: '/system', diff --git a/src/router/elegant/transform.ts b/src/router/elegant/transform.ts index 6f73346f..dcc5979e 100644 --- a/src/router/elegant/transform.ts +++ b/src/router/elegant/transform.ts @@ -172,6 +172,7 @@ const routeMap: RouteMap = { "monitor": "/monitor", "monitor_login-infor": "/monitor/login-infor", "monitor_oper-log": "/monitor/oper-log", + "social-callback": "/social-callback", "system": "/system", "system_client": "/system/client", "system_config": "/system/config", diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts index 4a1afda8..fdc4afc0 100644 --- a/src/router/routes/index.ts +++ b/src/router/routes/index.ts @@ -100,6 +100,18 @@ const dynamicConstantRoutes: ElegantRoute[] = [ keepAlive: true, icon: 'material-symbols:iframe-outline' } + }, + { + name: 'social-callback', + path: '/social-callback', + component: 'layout.blank$view.social-callback', + meta: { + title: 'social-callback', + i18nKey: 'route.social-callback', + constant: true, + hideInMenu: true, + icon: 'simple-icons:authy' + } } ]; diff --git a/src/service/api/auth.ts b/src/service/api/auth.ts index 4845a35e..2ef50b66 100644 --- a/src/service/api/auth.ts +++ b/src/service/api/auth.ts @@ -35,6 +35,15 @@ export function fetchLogin(data: Api.Auth.PwdLoginForm) { }); } +/** social login callback */ +export function fetchSocialLoginCallback(data: Api.Auth.SocialLoginForm) { + return request({ + url: '/auth/social/callback', + method: 'post', + data + }); +} + /** Register */ export function fetchRegister(data: Api.Auth.RegisterForm) { return request({ diff --git a/src/service/api/system/index.ts b/src/service/api/system/index.ts index 8e4f2c3e..1c22d4c5 100644 --- a/src/service/api/system/index.ts +++ b/src/service/api/system/index.ts @@ -4,3 +4,4 @@ export * from './user'; export * from './dept'; export * from './role'; export * from './post'; +export * from './social'; diff --git a/src/service/api/system/social.ts b/src/service/api/system/social.ts new file mode 100644 index 00000000..91683e21 --- /dev/null +++ b/src/service/api/system/social.ts @@ -0,0 +1,13 @@ +import { request } from '../../request'; + +/** 绑定账户 */ +export function fetchSocialAuthBinding(source: Api.System.SocialSource, tenantId: string = '000000') { + return request({ + url: `/auth/binding/${source}`, + method: 'get', + params: { + tenantId, + domain: window.location.host + } + }); +} diff --git a/src/service/request/index.ts b/src/service/request/index.ts index cedaea1c..e640b1d8 100644 --- a/src/service/request/index.ts +++ b/src/service/request/index.ts @@ -136,6 +136,7 @@ export const request = createFlatRequest { * * @param [redirect=true] Whether to redirect after login. Default is `true` */ - async function login(loginForm: Api.Auth.PwdLoginForm, redirect = true) { + async function login(loginForm: Api.Auth.PwdLoginForm | Api.Auth.SocialLoginForm, redirect = true) { startLoading(); const { VITE_APP_CLIENT_ID } = import.meta.env; const loginData: Api.Auth.PwdLoginForm = { ...loginForm, + tenantId: loginForm.tenantId ?? '000000', clientId: VITE_APP_CLIENT_ID!, - grantType: 'password' + grantType: loginForm.grantType ?? 'password' }; const { data: loginToken, error } = await fetchLogin(loginData); diff --git a/src/typings/api/api.d.ts b/src/typings/api/api.d.ts index 9428781c..62cc4f75 100644 --- a/src/typings/api/api.d.ts +++ b/src/typings/api/api.d.ts @@ -114,6 +114,16 @@ declare namespace Api { password?: string; } + /** social login form */ + interface SocialLoginForm extends LoginForm { + /** 授权码 */ + socialCode?: string; + /** 授权状态 */ + socialState?: string; + /** 来源 */ + source?: string; + } + /** register form */ interface RegisterForm extends LoginForm { /** 用户名 */ diff --git a/src/typings/api/system.api.d.ts b/src/typings/api/system.api.d.ts index a3937313..2a39c2cd 100644 --- a/src/typings/api/system.api.d.ts +++ b/src/typings/api/system.api.d.ts @@ -594,5 +594,23 @@ declare namespace Api { /** client list */ type ClientList = Api.Common.PaginatingQueryRecord; + + /** social source */ + type SocialSource = + | 'maxkey' + | 'topiam' + | 'qq' + | 'weibo' + | 'gitee' + | 'dingtalk' + | 'baidu' + | 'csdn' + | 'coding' + | 'oschina' + | 'alipay_wallet' + | 'wechat_open' + | 'wechat_mp' + | 'wechat_enterprise' + | 'gitlab'; } } diff --git a/src/typings/elegant-router.d.ts b/src/typings/elegant-router.d.ts index 729cc6f2..af5788cd 100644 --- a/src/typings/elegant-router.d.ts +++ b/src/typings/elegant-router.d.ts @@ -26,6 +26,7 @@ declare module "@elegant-router/types" { "monitor": "/monitor"; "monitor_login-infor": "/monitor/login-infor"; "monitor_oper-log": "/monitor/oper-log"; + "social-callback": "/social-callback"; "system": "/system"; "system_client": "/system/client"; "system_config": "/system/config"; @@ -78,6 +79,7 @@ declare module "@elegant-router/types" { | "iframe-page" | "login" | "monitor" + | "social-callback" | "system" | "tool" >; @@ -101,6 +103,7 @@ declare module "@elegant-router/types" { | "500" | "iframe-page" | "login" + | "social-callback" | "home" | "monitor_login-infor" | "monitor_oper-log" diff --git a/src/views/_builtin/login/modules/pwd-login.vue b/src/views/_builtin/login/modules/pwd-login.vue index 82484930..ea5543f4 100644 --- a/src/views/_builtin/login/modules/pwd-login.vue +++ b/src/views/_builtin/login/modules/pwd-login.vue @@ -4,6 +4,7 @@ import type { SelectOption } from 'naive-ui'; import { useLoading } from '@sa/hooks'; import { fetchCaptchaCode, fetchTenantList } from '@/service/api'; // import { fetchGetConfigDetail } from '@/service/api/system/config'; +import { fetchSocialAuthBinding } from '@/service/api/system'; import { useAuthStore } from '@/store/modules/auth'; import { useRouterPush } from '@/hooks/common/router'; import { useFormRules, useNaiveForm } from '@/hooks/common/form'; @@ -111,8 +112,10 @@ handleLoginRember(); // handleRegister(); -function handleSocialLogin(type: string) { - console.log(type); +async function handleSocialLogin(type: Api.System.SocialSource) { + const { data, error } = await fetchSocialAuthBinding(type, model.tenantId); + if (error) return; + window.location.href = data; } @@ -151,7 +154,8 @@ function handleSocialLogin(type: string) { - + +
diff --git a/src/views/_builtin/social-callback/index.vue b/src/views/_builtin/social-callback/index.vue new file mode 100644 index 00000000..75c95524 --- /dev/null +++ b/src/views/_builtin/social-callback/index.vue @@ -0,0 +1,108 @@ + + + + +