diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py
index c70f2561b6ff5d6a007d996b1fdc688c367a68f7..ca97fe214024af9ca66fcbf03e7d8f1133064f73 100644
--- a/backend/dvadmin/system/models.py
+++ b/backend/dvadmin/system/models.py
@@ -77,7 +77,13 @@ class Users(CoreModel, AbstractUser):
objects = CustomUserManager()
def set_password(self, raw_password):
- super().set_password(hashlib.md5(raw_password.encode(encoding="UTF-8")).hexdigest())
+ if raw_password:
+ super().set_password(hashlib.md5(raw_password.encode(encoding="UTF-8")).hexdigest())
+
+ def save(self, *args, **kwargs):
+ if self.name == "":
+ self.name = self.username
+ super().save(*args, **kwargs)
class Meta:
db_table = table_prefix + "system_users"
diff --git a/web/src/router/index.ts b/web/src/router/index.ts
index 0815e9eee873c805d2ef01d9036557066730481a..37708c6f426602fee4b15e3bef680b34767a9403 100644
--- a/web/src/router/index.ts
+++ b/web/src/router/index.ts
@@ -98,10 +98,22 @@ export function formatTwoStageRoutes(arr: any) {
const frameOutRoutes = staticRoutes.map(item => item.path)
+const checkToken = ()=>{
+ const urlParams = new URLSearchParams(window.location.search);
+ const _oauth2_token = urlParams.get('_oauth2_token');
+ if (_oauth2_token) {
+ Session.set('token', _oauth2_token);
+ const cleanUrl = window.location.href.split('?')[0];
+ window.history.replaceState({}, '', cleanUrl);
+ useUserInfo(pinia).setUserInfos();
+
+ }
+}
// 路由加载前
router.beforeEach(async (to, from, next) => {
// 检查浏览器本地版本与线上版本是否一致,判断是否需要刷新页面进行更新
await checkVersion()
+ checkToken()
NProgress.configure({showSpinner: false});
if (to.meta.title) NProgress.start();
const token = Session.get('token');
diff --git a/web/src/views/system/login/api.ts b/web/src/views/system/login/api.ts
index 7f835567d42db465daee34297dc168dff6da7433..4502a753f8cf2cc47d8b71446258ee78aa4e9885 100644
--- a/web/src/views/system/login/api.ts
+++ b/web/src/views/system/login/api.ts
@@ -28,3 +28,10 @@ export function getUserInfo() {
method: 'get',
});
}
+
+export function getBackends() {
+ return request({
+ url: '/api/dvadmin3_social_oauth2/backend/get_login_backend/',
+ method: 'get',
+ });
+}
\ No newline at end of file
diff --git a/web/src/views/system/login/component/oauth2.vue b/web/src/views/system/login/component/oauth2.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1b0c0c68b86bb7978de4a408d0504d046205373c
--- /dev/null
+++ b/web/src/views/system/login/component/oauth2.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
diff --git a/web/src/views/system/login/index.vue b/web/src/views/system/login/index.vue
index 0f4d9c86186777cfc8bb71bd38e7e01a9ea8f874..897ddc4121cf00fabb1900f0be02265ef9c37814 100644
--- a/web/src/views/system/login/index.vue
+++ b/web/src/views/system/login/index.vue
@@ -34,7 +34,9 @@
-->
-
+
+
+
@@ -81,6 +83,8 @@ const Account = defineAsyncComponent(() => import('/@/views/system/login/compone
const Mobile = defineAsyncComponent(() => import('/@/views/system/login/component/mobile.vue'));
const Scan = defineAsyncComponent(() => import('/@/views/system/login/component/scan.vue'));
const ChangePwd = defineAsyncComponent(() => import('/@/views/system/login/component/changePwd.vue'));
+const OAuth2 = defineAsyncComponent(() => import('/@/views/system/login/component/oauth2.vue'));
+
import _ from "lodash-es";
import {useUserInfo} from "/@/stores/userInfo";
const { userInfos } = storeToRefs(useUserInfo());
diff --git a/web/src/views/system/login/types.ts b/web/src/views/system/login/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5e2de5977f664e6468533432de28dbdc4b521635
--- /dev/null
+++ b/web/src/views/system/login/types.ts
@@ -0,0 +1,8 @@
+
+export interface OAuth2Backend {
+ app_name: string;
+ backend_name: string;
+ icon: string;
+ authentication_url: string;
+}
+