diff --git a/backend/apps/system/api/user.py b/backend/apps/system/api/user.py index d5a7a1db..cb4e9fdb 100644 --- a/backend/apps/system/api/user.py +++ b/backend/apps/system/api/user.py @@ -95,7 +95,7 @@ async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Tran return await user_ws_options(session, current_user.id, trans) @router.put("/ws/{oid}") -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") async def ws_change(session: SessionDep, current_user: CurrentUser, oid: int): ws_list: list[UserWs] = await user_ws_options(session, current_user.id) if not any(x.id == oid for x in ws_list): @@ -137,7 +137,7 @@ async def create(session: SessionDep, creator: UserCreator): session.commit() @router.put("") -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id") async def update(session: SessionDep, editor: UserEditor): user_model: UserModel = get_db_user(session = session, user_id = editor.id) origin_oid: int = user_model.oid @@ -173,7 +173,7 @@ async def batch_del(session: SessionDep, id_list: list[int]): await single_delete(session, id) @router.put("/language") -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") async def langChange(session: SessionDep, current_user: CurrentUser, language: UserLanguage): lang = language.language if lang not in ["zh-CN", "en"]: @@ -184,7 +184,7 @@ async def langChange(session: SessionDep, current_user: CurrentUser, language: U session.commit() @router.patch("/pwd/{id}") -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") async def pwdReset(session: SessionDep, current_user: CurrentUser, id: int): if not current_user.isAdmin: raise HTTPException('only for admin') @@ -194,7 +194,7 @@ async def pwdReset(session: SessionDep, current_user: CurrentUser, id: int): session.commit() @router.put("/pwd") -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") async def pwdUpdate(session: SessionDep, current_user: CurrentUser, editor: PwdEditor): db_user: UserModel = get_db_user(session=session, user_id=current_user.id) if not verify_md5pwd(editor.pwd, db_user.password): diff --git a/backend/apps/system/crud/user.py b/backend/apps/system/crud/user.py index ffad38a8..fa0166e8 100644 --- a/backend/apps/system/crud/user.py +++ b/backend/apps/system/crud/user.py @@ -22,7 +22,7 @@ def get_user_by_account(*, session: Session, account: str) -> BaseUserDTO | None return None return BaseUserDTO.model_validate(db_user.model_dump()) -#@cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="user_id") +@cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="user_id") async def get_user_info(*, session: Session, user_id: int) -> UserInfoDTO | None: db_user: UserModel = get_db_user(session = session, user_id = user_id) userInfo = UserInfoDTO.model_validate(db_user.model_dump()) @@ -58,7 +58,7 @@ async def user_ws_options(session: Session, uid: int, trans: Optional[I18n] = No for id, name in result.all() ] -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") async def single_delete(session: SessionDep, id: int): user_model: UserModel = get_db_user(session = session, user_id = id) del_stmt = sqlmodel_delete(UserWsModel).where(UserWsModel.uid == id) @@ -66,6 +66,6 @@ async def single_delete(session: SessionDep, id: int): session.delete(user_model) session.commit() -#@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") +@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") async def clean_user_cache(id: int): SQLBotLogUtil.info(f"User cache for [{id}] has been cleaned") diff --git a/frontend/src/components/layout/Workspace.vue b/frontend/src/components/layout/Workspace.vue index 6c4d34e5..da669173 100644 --- a/frontend/src/components/layout/Workspace.vue +++ b/frontend/src/components/layout/Workspace.vue @@ -6,13 +6,11 @@ import icon_done_outlined from '@/assets/svg/icon_done_outlined.svg' import icon_searchOutline_outlined from '@/assets/svg/icon_search-outline_outlined.svg' import { userApi } from '@/api/auth' import { ElMessage } from 'element-plus-secondary' -import { useRouter } from 'vue-router' import { useI18n } from 'vue-i18n' import { useUserStore } from '@/stores/user' const userStore = useUserStore() const { t } = useI18n() -const router = useRouter() defineProps({ collapse: { type: [Boolean], required: true }, }) @@ -46,7 +44,6 @@ const handleDefaultWorkspaceChange = (item: any) => { currentWorkspace.value = { id: item.id, name: item.name } userApi.ws_change(item.id).then(() => { ElMessage.success(t('common.switch_success')) - router.push('/chat/index') setTimeout(() => { location.reload() }, 300) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 8a75f65d..fb34662f 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -114,38 +114,6 @@ const router = createRouter({ component: DashboardPreview, meta: { title: 'DashboardPreview', icon: 'dashboard' }, }, - /* { - path: "/setting", - component: Layout, - redirect: "/setting/index", - children: [ - { - path: "index", - name: "setting", - component: setting, - meta: { title: "Settings", icon: "setting" }, - }, - ], - }, */ - // { - // path: '/system', - // component: Layout, - // redirect: '/system/model', - // children: [ - // /* { - // path: "user", - // name: "user", - // component: User, - // meta: { title: "User Management", icon: "icon_user" }, - // }, */ - // { - // path: 'model', - // name: 'model', - // component: Model, - // meta: { title: 'AI Model Configuration', icon: 'icon_ai' }, - // }, - // ], - // }, { path: '/system', component: LayoutDsl, diff --git a/frontend/src/router/watch.ts b/frontend/src/router/watch.ts index 14bf2ad9..b480d2ca 100644 --- a/frontend/src/router/watch.ts +++ b/frontend/src/router/watch.ts @@ -26,10 +26,7 @@ export const watchRouter = (router: any) => { if (!userStore.getUid) { await userStore.info() } - /* if (!wsCache.get('user.uid')) { - await userStore.info() - } */ - if (to.path === '/') { + if (to.path === '/' || accessCrossPermission(to)) { next('/chat') return } @@ -41,6 +38,14 @@ export const watchRouter = (router: any) => { } }) } + +const accessCrossPermission = (to: any) => { + if (!to?.path) return false + return ( + (to.path.startsWith('/system') && !userStore.isAdmin) || + (to.path.startsWith('/set') && !userStore.isSpaceAdmin) + ) +} const loadXpackStatic = () => { if (document.getElementById('sqlbot_xpack_static')) { return Promise.resolve()