From bcc764142badb841fe8a13be7e63925ee3243a5d Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 22 May 2025 14:36:23 +0800 Subject: [PATCH] Update the OAuth2 module to plugin (#620) * Update the OAuth2 module to plugin * update create user social param --- backend/app/admin/api/router.py | 2 -- backend/app/admin/api/v1/oauth2/__init__.py | 11 ----------- backend/app/admin/crud/crud_user.py | 3 +-- backend/app/admin/model/__init__.py | 1 - backend/app/admin/model/user.py | 5 +---- backend/plugin/oauth2/__init__.py | 2 ++ backend/plugin/oauth2/api/__init__.py | 2 ++ backend/plugin/oauth2/api/router.py | 12 ++++++++++++ backend/plugin/oauth2/api/v1/__init__.py | 2 ++ .../v1/oauth2 => plugin/oauth2/api/v1}/github.py | 2 +- .../v1/oauth2 => plugin/oauth2/api/v1}/linux_do.py | 2 +- backend/plugin/oauth2/crud/__init__.py | 2 ++ .../oauth2}/crud/crud_user_social.py | 7 +++---- backend/plugin/oauth2/model/__init__.py | 3 +++ .../admin => plugin/oauth2}/model/user_social.py | 8 ++++---- backend/plugin/oauth2/plugin.toml | 8 ++++++++ backend/plugin/oauth2/requirements.txt | 1 + backend/plugin/oauth2/schema/__init__.py | 2 ++ .../admin => plugin/oauth2}/schema/user_social.py | 2 +- backend/plugin/oauth2/service/__init__.py | 2 ++ .../oauth2}/service/oauth2_service.py | 13 ++++++++----- backend/plugin/tools.py | 8 ++++---- backend/sql/mysql/create_tables.sql | 7 ++++--- backend/sql/mysql/init_test_data.sql | 14 +++++++------- backend/sql/postgresql/create_tables.sql | 8 ++++---- backend/sql/postgresql/init_test_data.sql | 14 +++++++------- pyproject.toml | 1 - requirements.txt | 6 +----- uv.lock | 14 -------------- 29 files changed, 83 insertions(+), 81 deletions(-) delete mode 100644 backend/app/admin/api/v1/oauth2/__init__.py create mode 100644 backend/plugin/oauth2/__init__.py create mode 100644 backend/plugin/oauth2/api/__init__.py create mode 100644 backend/plugin/oauth2/api/router.py create mode 100644 backend/plugin/oauth2/api/v1/__init__.py rename backend/{app/admin/api/v1/oauth2 => plugin/oauth2/api/v1}/github.py (96%) rename backend/{app/admin/api/v1/oauth2 => plugin/oauth2/api/v1}/linux_do.py (96%) create mode 100644 backend/plugin/oauth2/crud/__init__.py rename backend/{app/admin => plugin/oauth2}/crud/crud_user_social.py (81%) create mode 100644 backend/plugin/oauth2/model/__init__.py rename backend/{app/admin => plugin/oauth2}/model/user_social.py (79%) create mode 100644 backend/plugin/oauth2/plugin.toml create mode 100644 backend/plugin/oauth2/requirements.txt create mode 100644 backend/plugin/oauth2/schema/__init__.py rename backend/{app/admin => plugin/oauth2}/schema/user_social.py (92%) create mode 100644 backend/plugin/oauth2/service/__init__.py rename backend/{app/admin => plugin/oauth2}/service/oauth2_service.py (94%) diff --git a/backend/app/admin/api/router.py b/backend/app/admin/api/router.py index 1efa57cb..b6316772 100644 --- a/backend/app/admin/api/router.py +++ b/backend/app/admin/api/router.py @@ -5,14 +5,12 @@ from fastapi import APIRouter from backend.app.admin.api.v1.auth import router as auth_router from backend.app.admin.api.v1.log import router as log_router from backend.app.admin.api.v1.monitor import router as monitor_router -from backend.app.admin.api.v1.oauth2 import router as oauth2_router from backend.app.admin.api.v1.sys import router as sys_router from backend.core.conf import settings v1 = APIRouter(prefix=settings.FASTAPI_API_V1_PATH) v1.include_router(auth_router) -v1.include_router(oauth2_router) v1.include_router(sys_router) v1.include_router(log_router) v1.include_router(monitor_router) diff --git a/backend/app/admin/api/v1/oauth2/__init__.py b/backend/app/admin/api/v1/oauth2/__init__.py deleted file mode 100644 index 8ef946db..00000000 --- a/backend/app/admin/api/v1/oauth2/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -from fastapi import APIRouter - -from backend.app.admin.api.v1.oauth2.github import router as github_router -from backend.app.admin.api.v1.oauth2.linux_do import router as linux_do_router - -router = APIRouter(prefix='/oauth2') - -router.include_router(github_router, prefix='/github', tags=['GitHub OAuth2']) -router.include_router(linux_do_router, prefix='/linux-do', tags=['LinuxDo OAuth2']) diff --git a/backend/app/admin/crud/crud_user.py b/backend/app/admin/crud/crud_user.py index 6bbf82ac..951d4103 100644 --- a/backend/app/admin/crud/crud_user.py +++ b/backend/app/admin/crud/crud_user.py @@ -189,8 +189,7 @@ class CRUDUser(CRUDPlus[User]): select(self.model) .options( selectinload(self.model.dept).options(noload(Dept.parent), noload(Dept.children), noload(Dept.users)), - noload(self.model.socials), - selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.rules)), + selectinload(self.model.roles).options(noload(Role.users), noload(Role.menus), noload(Role.scopes)), ) .order_by(desc(self.model.join_time)) ) diff --git a/backend/app/admin/model/__init__.py b/backend/app/admin/model/__init__.py index 3f55eae8..7abff134 100644 --- a/backend/app/admin/model/__init__.py +++ b/backend/app/admin/model/__init__.py @@ -8,4 +8,3 @@ from backend.app.admin.model.menu import Menu from backend.app.admin.model.opera_log import OperaLog from backend.app.admin.model.role import Role from backend.app.admin.model.user import User -from backend.app.admin.model.user_social import UserSocial diff --git a/backend/app/admin/model/user.py b/backend/app/admin/model/user.py index 4f072a4d..871c1b6e 100644 --- a/backend/app/admin/model/user.py +++ b/backend/app/admin/model/user.py @@ -15,7 +15,7 @@ from backend.database.db import uuid4_str from backend.utils.timezone import timezone if TYPE_CHECKING: - from backend.app.admin.model import Dept, Role, UserSocial + from backend.app.admin.model import Dept, Role class User(Base): @@ -55,8 +55,5 @@ class User(Base): ) dept: Mapped[Dept | None] = relationship(init=False, back_populates='users') - # 用户社交信息一对多 - socials: Mapped[list[UserSocial]] = relationship(init=False, back_populates='user') - # 用户角色多对多 roles: Mapped[list[Role]] = relationship(init=False, secondary=sys_user_role, back_populates='users') diff --git a/backend/plugin/oauth2/__init__.py b/backend/plugin/oauth2/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/plugin/oauth2/api/__init__.py b/backend/plugin/oauth2/api/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/api/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/plugin/oauth2/api/router.py b/backend/plugin/oauth2/api/router.py new file mode 100644 index 00000000..1fff32a9 --- /dev/null +++ b/backend/plugin/oauth2/api/router.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from fastapi import APIRouter + +from backend.core.conf import settings +from backend.plugin.oauth2.api.v1.github import router as github_router +from backend.plugin.oauth2.api.v1.linux_do import router as linux_do_router + +v1 = APIRouter(prefix=f'{settings.FASTAPI_API_V1_PATH}/oauth2') + +v1.include_router(github_router, prefix='/github', tags=['Github OAuth2']) +v1.include_router(linux_do_router, prefix='/linux-do', tags=['LinuxDo OAuth2']) diff --git a/backend/plugin/oauth2/api/v1/__init__.py b/backend/plugin/oauth2/api/v1/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/api/v1/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/app/admin/api/v1/oauth2/github.py b/backend/plugin/oauth2/api/v1/github.py similarity index 96% rename from backend/app/admin/api/v1/oauth2/github.py rename to backend/plugin/oauth2/api/v1/github.py index ba7bf851..70ed32ee 100644 --- a/backend/app/admin/api/v1/oauth2/github.py +++ b/backend/plugin/oauth2/api/v1/github.py @@ -5,10 +5,10 @@ from fastapi_limiter.depends import RateLimiter from fastapi_oauth20 import FastAPIOAuth20, GitHubOAuth20 from starlette.responses import RedirectResponse -from backend.app.admin.service.oauth2_service import oauth2_service from backend.common.enums import UserSocialType from backend.common.response.response_schema import ResponseSchemaModel, response_base from backend.core.conf import settings +from backend.plugin.oauth2.service.oauth2_service import oauth2_service router = APIRouter() diff --git a/backend/app/admin/api/v1/oauth2/linux_do.py b/backend/plugin/oauth2/api/v1/linux_do.py similarity index 96% rename from backend/app/admin/api/v1/oauth2/linux_do.py rename to backend/plugin/oauth2/api/v1/linux_do.py index 9a2ae1ad..e4f0a215 100644 --- a/backend/app/admin/api/v1/oauth2/linux_do.py +++ b/backend/plugin/oauth2/api/v1/linux_do.py @@ -5,10 +5,10 @@ from fastapi_limiter.depends import RateLimiter from fastapi_oauth20 import FastAPIOAuth20, LinuxDoOAuth20 from starlette.responses import RedirectResponse -from backend.app.admin.service.oauth2_service import oauth2_service from backend.common.enums import UserSocialType from backend.common.response.response_schema import ResponseSchemaModel, response_base from backend.core.conf import settings +from backend.plugin.oauth2.service.oauth2_service import oauth2_service router = APIRouter() diff --git a/backend/plugin/oauth2/crud/__init__.py b/backend/plugin/oauth2/crud/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/crud/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/app/admin/crud/crud_user_social.py b/backend/plugin/oauth2/crud/crud_user_social.py similarity index 81% rename from backend/app/admin/crud/crud_user_social.py rename to backend/plugin/oauth2/crud/crud_user_social.py index d356ada6..53852f37 100644 --- a/backend/app/admin/crud/crud_user_social.py +++ b/backend/plugin/oauth2/crud/crud_user_social.py @@ -3,15 +3,14 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy_crud_plus import CRUDPlus -from backend.app.admin.model import UserSocial -from backend.app.admin.schema.user_social import CreateUserSocialParam -from backend.common.enums import UserSocialType +from backend.plugin.oauth2.model import UserSocial +from backend.plugin.oauth2.schema.user_social import CreateUserSocialParam class CRUDUserSocial(CRUDPlus[UserSocial]): """用户社交账号数据库操作类""" - async def get(self, db: AsyncSession, pk: int, source: UserSocialType) -> UserSocial | None: + async def get(self, db: AsyncSession, pk: int, source: str) -> UserSocial | None: """ 获取用户社交账号绑定详情 diff --git a/backend/plugin/oauth2/model/__init__.py b/backend/plugin/oauth2/model/__init__.py new file mode 100644 index 00000000..db9677e3 --- /dev/null +++ b/backend/plugin/oauth2/model/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from backend.plugin.oauth2.model.user_social import UserSocial diff --git a/backend/app/admin/model/user_social.py b/backend/plugin/oauth2/model/user_social.py similarity index 79% rename from backend/app/admin/model/user_social.py rename to backend/plugin/oauth2/model/user_social.py index 87cf10e1..980608b4 100644 --- a/backend/app/admin/model/user_social.py +++ b/backend/plugin/oauth2/model/user_social.py @@ -20,9 +20,9 @@ class UserSocial(Base): id: Mapped[id_key] = mapped_column(init=False) source: Mapped[str] = mapped_column(String(20), comment='第三方用户来源') - open_id: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户的 open id') - uid: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户的 ID') - union_id: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户的 union id') + open_id: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户 open id') + sid: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户 ID') + union_id: Mapped[str | None] = mapped_column(String(20), default=None, comment='第三方用户 union id') scope: Mapped[str | None] = mapped_column(String(120), default=None, comment='第三方用户授予的权限') code: Mapped[str | None] = mapped_column(String(50), default=None, comment='用户的授权 code') @@ -30,4 +30,4 @@ class UserSocial(Base): user_id: Mapped[int | None] = mapped_column( ForeignKey('sys_user.id', ondelete='SET NULL'), default=None, comment='用户关联ID' ) - user: Mapped[User | None] = relationship(init=False, back_populates='socials') + user: Mapped[User | None] = relationship(init=False, backref='socials') diff --git a/backend/plugin/oauth2/plugin.toml b/backend/plugin/oauth2/plugin.toml new file mode 100644 index 00000000..734af64e --- /dev/null +++ b/backend/plugin/oauth2/plugin.toml @@ -0,0 +1,8 @@ +[plugin] +summary = 'OAuth 2.0' +version = '0.0.1' +description = '通过 OAuth 2.0 的方式登录系统' +author = 'wu-clan' + +[app] +router = ['v1'] diff --git a/backend/plugin/oauth2/requirements.txt b/backend/plugin/oauth2/requirements.txt new file mode 100644 index 00000000..128d4062 --- /dev/null +++ b/backend/plugin/oauth2/requirements.txt @@ -0,0 +1 @@ +fastapi-oauth20>=0.0.1 diff --git a/backend/plugin/oauth2/schema/__init__.py b/backend/plugin/oauth2/schema/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/schema/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/app/admin/schema/user_social.py b/backend/plugin/oauth2/schema/user_social.py similarity index 92% rename from backend/app/admin/schema/user_social.py rename to backend/plugin/oauth2/schema/user_social.py index 70d6d1b6..104f735e 100644 --- a/backend/app/admin/schema/user_social.py +++ b/backend/plugin/oauth2/schema/user_social.py @@ -11,7 +11,7 @@ class UserSocialSchemaBase(SchemaBase): source: UserSocialType = Field(description='社交平台') open_id: str | None = Field(None, description='开放平台 ID') - uid: str | None = Field(None, description='用户 ID') + sid: str | None = Field(None, description='第三方用户 ID') union_id: str | None = Field(None, description='开放平台唯一 ID') scope: str | None = Field(None, description='授权范围') code: str | None = Field(None, description='授权码') diff --git a/backend/plugin/oauth2/service/__init__.py b/backend/plugin/oauth2/service/__init__.py new file mode 100644 index 00000000..56fafa58 --- /dev/null +++ b/backend/plugin/oauth2/service/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- diff --git a/backend/app/admin/service/oauth2_service.py b/backend/plugin/oauth2/service/oauth2_service.py similarity index 94% rename from backend/app/admin/service/oauth2_service.py rename to backend/plugin/oauth2/service/oauth2_service.py index 9ebf057a..3489faa7 100644 --- a/backend/app/admin/service/oauth2_service.py +++ b/backend/plugin/oauth2/service/oauth2_service.py @@ -6,10 +6,8 @@ from fast_captcha import text_captcha from fastapi import BackgroundTasks, Request, Response from backend.app.admin.crud.crud_user import user_dao -from backend.app.admin.crud.crud_user_social import user_social_dao from backend.app.admin.schema.token import GetLoginToken from backend.app.admin.schema.user import RegisterUserParam -from backend.app.admin.schema.user_social import CreateUserSocialParam from backend.app.admin.service.login_log_service import login_log_service from backend.common.enums import LoginLogStatusType, UserSocialType from backend.common.exception.errors import AuthorizationError @@ -17,6 +15,8 @@ from backend.common.security import jwt from backend.core.conf import settings from backend.database.db import async_db_session from backend.database.redis import redis_client +from backend.plugin.oauth2.crud.crud_user_social import user_social_dao +from backend.plugin.oauth2.schema.user_social import CreateUserSocialParam from backend.utils.timezone import timezone @@ -45,15 +45,18 @@ class OAuth2Service: async with async_db_session.begin() as db: # 获取 OAuth2 平台用户信息 social_id = user.get('id') + social_nickname = user.get('name') + social_username = user.get('username') if social == UserSocialType.github: social_username = user.get('login') - social_nickname = user.get('name') + social_email = user.get('email') - if social == UserSocialType.linux_do: # 不提供明文邮箱的平台 + if social == UserSocialType.linux_do: social_email = f'{social_username}@linux.do' if not social_email: raise AuthorizationError(msg=f'授权失败,{social.value} 账户未绑定邮箱') + # 创建系统用户 sys_user = await user_dao.check_email(db, social_email) if not sys_user: @@ -73,7 +76,7 @@ class OAuth2Service: sys_user_id = sys_user.id user_social = await user_social_dao.get(db, sys_user_id, social.value) if not user_social: - new_user_social = CreateUserSocialParam(source=social.value, uid=str(social_id), user_id=sys_user_id) + new_user_social = CreateUserSocialParam(source=social.value, sid=str(social_id), user_id=sys_user_id) await user_social_dao.create(db, new_user_social) # 创建 token access_token = await jwt.create_access_token( diff --git a/backend/plugin/tools.py b/backend/plugin/tools.py index 566f3883..7f8d7cda 100644 --- a/backend/plugin/tools.py +++ b/backend/plugin/tools.py @@ -149,9 +149,9 @@ def inject_extra_router(plugin: dict[str, Any]) -> None: continue # 解析插件路由配置 - file_config = plugin.get('api', {}).get(f'{file[:-3]}', {}) - prefix = file_config.get('prefix', '') - tags = file_config.get('tags', []) + file_config = plugin['api'][file[:-3]] + prefix = file_config['prefix'] + tags = file_config['tags'] # 获取插件路由模块 file_path = os.path.join(root, file) @@ -204,7 +204,7 @@ def inject_app_router(plugin: dict[str, Any], target_router: APIRouter) -> None: module_path = f'backend.plugin.{plugin_name}.api.router' try: module = import_module_cached(module_path) - routers = plugin.get('app', {}).get('router') + routers = plugin['app']['router'] if not routers or not isinstance(routers, list): raise PluginConfigError(f'应用级插件 {plugin_name} 配置文件存在错误,请检查') diff --git a/backend/sql/mysql/create_tables.sql b/backend/sql/mysql/create_tables.sql index 80a68650..ac5086ae 100644 --- a/backend/sql/mysql/create_tables.sql +++ b/backend/sql/mysql/create_tables.sql @@ -418,9 +418,9 @@ create table sys_user_social id int auto_increment comment '主键 ID' primary key, source varchar(20) not null comment '第三方用户来源', - open_id varchar(20) null comment '第三方用户的 open id', - uid varchar(20) null comment '第三方用户的 ID', - union_id varchar(20) null comment '第三方用户的 union id', + open_id varchar(20) null comment '第三方用户 open id', + sid varchar(20) null comment '第三方用户 ID', + union_id varchar(20) null comment '第三方用户 union id', scope varchar(120) null comment '第三方用户授予的权限', code varchar(50) null comment '用户的授权 code', user_id int null comment '用户关联ID', @@ -437,3 +437,4 @@ create index ix_sys_user_social_id create index user_id on sys_user_social (user_id); + diff --git a/backend/sql/mysql/init_test_data.sql b/backend/sql/mysql/init_test_data.sql index c23dc0aa..75a149ad 100644 --- a/backend/sql/mysql/init_test_data.sql +++ b/backend/sql/mysql/init_test_data.sql @@ -6,13 +6,13 @@ values (1, '测试', 'Test', 'test', 0, null, 0, null, null, 0, 0, 1, null, nul (2, '仪表盘', 'Dashboard', 'dashboard', 0, 'material-symbols:dashboard', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:15:45', null), (3, '工作台', 'Workspace', 'workspace', 0, null, 1, '/dashboard/workspace/index.vue', null, 1, 1, 1, null, null, 2, '2023-07-27 19:17:59', null), (4, '数据分析', 'Analytics', 'analytics', 0, null, 1, '/dashboard/analytics/index.vue', null, 1, 1, 1, null, null, 2, '2023-07-27 19:17:59', null), - (5, '系统管理', 'Admin', 'admin', 0, 'eos-icons:admin', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:23:00', null), - (6, '部门管理', 'SysDept', 'sys-dept', 0, null, 1, '/admin/dept/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:23:42', null), - (7, '用户管理', 'SysUser', 'sys-user', 0, null, 1, '/admin/user/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:13', null), - (8, '角色管理', 'SysRole', 'sys-role', 0, null, 1, '/admin/role/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:45', null), - (9, '菜单管理', 'SysMenu', 'sys-menu', 0, null, 1, '/admin/menu/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:45:29', null), - (10, 'API 管理', 'SysApi', 'sys-api', 0, null, 1, '/admin/api/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), - (11, '数据规则管理', 'SysDataRule', 'sys-data-rule', 0, null, 1, '/admin/data-rule/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), + (5, '系统管理', 'System', 'system', 0, 'eos-icons:admin', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:23:00', null), + (6, '部门管理', 'SysDept', 'sys-dept', 0, null, 1, '/system/dept/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:23:42', null), + (7, '用户管理', 'SysUser', 'sys-user', 0, null, 1, '/system/user/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:13', null), + (8, '角色管理', 'SysRole', 'sys-role', 0, null, 1, '/system/role/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:45', null), + (9, '菜单管理', 'SysMenu', 'sys-menu', 0, null, 1, '/system/menu/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:45:29', null), + (10, '插件管理', 'SysPlugin', 'sys-plugin', 0, null, 1, '/system/plugin/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), + (11, '数据权限', 'SysDataPermission', 'sys-data-permission', 0, null, 1, '/system/data-permission/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), (12, '系统自动化', 'Automation', 'automation', 0, 'material-symbols:automation', 0, null, null, 1, 1, 1, null, null, null, '2024-07-27 02:06:20', null), (13, '代码生成', 'CodeGenerator', 'code-generator', 0, null, 1, '/automation/code-generator/index.vue', null, 1, 1, 1, null, null, 12, '2024-07-27 12:24:54', null), (14, '系统监控', 'Monitor', 'monitor', 0, 'mdi:monitor-eye', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:27:08', null), diff --git a/backend/sql/postgresql/create_tables.sql b/backend/sql/postgresql/create_tables.sql index e03e8a7e..11d53033 100644 --- a/backend/sql/postgresql/create_tables.sql +++ b/backend/sql/postgresql/create_tables.sql @@ -727,7 +727,7 @@ create table sys_user_social primary key, source varchar(20) not null, open_id varchar(20), - uid varchar(20), + sid varchar(20), union_id varchar(20), scope varchar(120), code varchar(50), @@ -744,11 +744,11 @@ comment on column sys_user_social.id is '主键 ID'; comment on column sys_user_social.source is '第三方用户来源'; -comment on column sys_user_social.open_id is '第三方用户的 open id'; +comment on column sys_user_social.open_id is '第三方用户 open id'; -comment on column sys_user_social.uid is '第三方用户的 ID'; +comment on column sys_user_social.uid is '第三方用户 ID'; -comment on column sys_user_social.union_id is '第三方用户的 union id'; +comment on column sys_user_social.union_id is '第三方用户 union id'; comment on column sys_user_social.scope is '第三方用户授予的权限'; diff --git a/backend/sql/postgresql/init_test_data.sql b/backend/sql/postgresql/init_test_data.sql index 55f84d74..0e6cc27e 100644 --- a/backend/sql/postgresql/init_test_data.sql +++ b/backend/sql/postgresql/init_test_data.sql @@ -6,13 +6,13 @@ values (1, '测试', 'Test', 'test', 0, null, 0, null, null, 0, 0, 1, null, nul (2, '仪表盘', 'Dashboard', 'dashboard', 0, 'material-symbols:dashboard', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:15:45', null), (3, '工作台', 'Workspace', 'workspace', 0, null, 1, '/dashboard/workspace/index.vue', null, 1, 1, 1, null, null, 2, '2023-07-27 19:17:59', null), (4, '数据分析', 'Analytics', 'analytics', 0, null, 1, '/dashboard/analytics/index.vue', null, 1, 1, 1, null, null, 2, '2023-07-27 19:17:59', null), - (5, '系统管理', 'Admin', 'admin', 0, 'eos-icons:admin', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:23:00', null), - (6, '部门管理', 'SysDept', 'sys-dept', 0, null, 1, '/admin/dept/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:23:42', null), - (7, '用户管理', 'SysUser', 'sys-user', 0, null, 1, '/admin/user/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:13', null), - (8, '角色管理', 'SysRole', 'sys-role', 0, null, 1, '/admin/role/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:45', null), - (9, '菜单管理', 'SysMenu', 'sys-menu', 0, null, 1, '/admin/menu/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:45:29', null), - (10, 'API 管理', 'SysApi', 'sys-api', 0, null, 1, '/admin/api/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), - (11, '数据规则管理', 'SysDataRule', 'sys-data-rule', 0, null, 1, '/admin/data-rule/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), + (5, '系统管理', 'System', 'system', 0, 'eos-icons:admin', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:23:00', null), + (6, '部门管理', 'SysDept', 'sys-dept', 0, null, 1, '/system/dept/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:23:42', null), + (7, '用户管理', 'SysUser', 'sys-user', 0, null, 1, '/system/user/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:13', null), + (8, '角色管理', 'SysRole', 'sys-role', 0, null, 1, '/system/role/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:25:45', null), + (9, '菜单管理', 'SysMenu', 'sys-menu', 0, null, 1, '/system/menu/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:45:29', null), + (10, '插件管理', 'SysPlugin', 'sys-plugin', 0, null, 1, '/system/plugin/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), + (11, '数据权限', 'SysDataPermission', 'sys-data-permission', 0, null, 1, '/system/data-permission/index.vue', null, 1, 1, 1, null, null, 5, '2023-07-27 19:24:12', null), (12, '系统自动化', 'Automation', 'automation', 0, 'material-symbols:automation', 0, null, null, 1, 1, 1, null, null, null, '2024-07-27 02:06:20', null), (13, '代码生成', 'CodeGenerator', 'code-generator', 0, null, 1, '/automation/code-generator/index.vue', null, 1, 1, 1, null, null, 12, '2024-07-27 12:24:54', null), (14, '系统监控', 'Monitor', 'monitor', 0, 'mdi:monitor-eye', 0, null, null, 1, 1, 1, null, null, null, '2023-07-27 19:27:08', null), diff --git a/pyproject.toml b/pyproject.toml index 1935878d..5b20bc47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,6 @@ dependencies = [ "fast-captcha>=0.3.2", "fastapi-cli==0.0.5", "fastapi-limiter>=0.1.6", - "fastapi-oauth20>=0.0.1", "fastapi-pagination>=0.13.0", "fastapi[standard]==0.115.11", "flower>=2.0.0", diff --git a/requirements.txt b/requirements.txt index 312ab722..67737b83 100644 --- a/requirements.txt +++ b/requirements.txt @@ -97,8 +97,6 @@ fastapi-cli==0.0.5 # fastapi-best-architecture fastapi-limiter==0.1.6 # via fastapi-best-architecture -fastapi-oauth20==0.0.1 - # via fastapi-best-architecture fastapi-pagination==0.13.0 # via fastapi-best-architecture filelock==3.18.0 @@ -123,9 +121,7 @@ httpcore==1.0.7 httptools==0.6.4 # via uvicorn httpx==0.28.1 - # via - # fastapi - # fastapi-oauth20 + # via fastapi humanize==4.12.2 # via flower identify==2.6.9 diff --git a/uv.lock b/uv.lock index 3955b0fb..5c29cae5 100644 --- a/uv.lock +++ b/uv.lock @@ -603,7 +603,6 @@ dependencies = [ { name = "fastapi", extra = ["standard"] }, { name = "fastapi-cli" }, { name = "fastapi-limiter" }, - { name = "fastapi-oauth20" }, { name = "fastapi-pagination" }, { name = "flower" }, { name = "gevent" }, @@ -657,7 +656,6 @@ requires-dist = [ { name = "fastapi", extras = ["standard"], specifier = "==0.115.11" }, { name = "fastapi-cli", specifier = "==0.0.5" }, { name = "fastapi-limiter", specifier = ">=0.1.6" }, - { name = "fastapi-oauth20", specifier = ">=0.0.1" }, { name = "fastapi-pagination", specifier = ">=0.13.0" }, { name = "flower", specifier = ">=2.0.0" }, { name = "gevent", specifier = ">=24.11.1" }, @@ -723,18 +721,6 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/cd/b5/6f6b4d18bee1cafc857eae12738b3a03b7d1102b833668be868938c57b9d/fastapi_limiter-0.1.6-py3-none-any.whl", hash = "sha256:2e53179a4208b8f2c8795e38bb001324d3dc37d2800ff49fd28ec5caabf7a240" }, ] -[[package]] -name = "fastapi-oauth20" -version = "0.0.1" -source = { registry = "https://mirrors.aliyun.com/pypi/simple" } -dependencies = [ - { name = "httpx" }, -] -sdist = { url = "https://mirrors.aliyun.com/pypi/packages/8e/66/25d4ece161689184f47130bc7ea5bf9c73113c2e628cf586546aa574d8d1/fastapi_oauth20-0.0.1.tar.gz", hash = "sha256:22bf6564f3af42a94cb597f8e20af1366e89e19af49291d15784a4c14059d4c9" } -wheels = [ - { url = "https://mirrors.aliyun.com/pypi/packages/cf/87/7e0423109ba2c0f8a0794eedff5bb1f79792e5d8d0941ba0b26f962e3e5c/fastapi_oauth20-0.0.1-py3-none-any.whl", hash = "sha256:921fe0e874cb4186998f74b1d951c360400aceb5ca3889a85c806d865a991f88" }, -] - [[package]] name = "fastapi-pagination" version = "0.13.0"