From d79b39b7ebfcc681299d76b4a3cd0138d5d99efa Mon Sep 17 00:00:00 2001 From: zy7y <13271962515@163.com> Date: Wed, 14 Sep 2022 00:39:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=87=E6=8D=A2=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controller/menu.py | 1 - backend/controller/role.py | 13 +++- backend/controller/user.py | 24 +++++- backend/core/security.py | 2 +- backend/dbhelper/menu.py | 2 +- backend/dbhelper/user.py | 6 ++ backend/mini.db-shm | Bin 32768 -> 0 bytes backend/mini.db-wal | Bin 412032 -> 0 bytes backend/router/url.py | 29 ++++++-- backend/tests/test_case.py | 14 ---- .../src/components/layout/layout-header.vue | 42 +++++++++++ .../layout/layout-info/layout-info.vue | 41 +++++++++++ .../layout/layout-info/select-role.vue | 69 ++++++++++++++++++ frontend/src/router/index.js | 1 - frontend/src/service/user.js | 8 ++ frontend/src/stores/user.js | 29 ++++++-- frontend/src/utils/request.js | 10 ++- frontend/src/views/main/main.vue | 14 ++-- 18 files changed, 255 insertions(+), 50 deletions(-) delete mode 100644 backend/mini.db-shm delete mode 100644 backend/mini.db-wal create mode 100644 frontend/src/components/layout/layout-header.vue create mode 100644 frontend/src/components/layout/layout-info/layout-info.vue create mode 100644 frontend/src/components/layout/layout-info/select-role.vue diff --git a/backend/controller/menu.py b/backend/controller/menu.py index 8d913d0..b97ec60 100644 --- a/backend/controller/menu.py +++ b/backend/controller/menu.py @@ -28,4 +28,3 @@ async def menu_put(pk: int, data: MenuIn) -> Response: if await put_menu(pk, data) == 0: return Response(code=400, msg="菜单不存在") return Response() - diff --git a/backend/controller/role.py b/backend/controller/role.py index 6579935..d9e1222 100644 --- a/backend/controller/role.py +++ b/backend/controller/role.py @@ -4,10 +4,15 @@ from fastapi import Query from core.utils import list_to_tree from dbhelper.relation import role_assigned_menu -from dbhelper.role import (del_role, get_role, get_role_menus, get_roles, - new_role, put_role) -from schemas import (ListAll, Response, RoleIn, RoleInfo, RoleMenuIn, - RoleQuery, RoleRead) +from dbhelper.role import ( + del_role, + get_role, + get_role_menus, + get_roles, + new_role, + put_role, +) +from schemas import ListAll, Response, RoleIn, RoleInfo, RoleMenuIn, RoleQuery, RoleRead async def role_add(data: RoleIn) -> Response[RoleInfo]: diff --git a/backend/controller/user.py b/backend/controller/user.py index 81e9647..4d51ed4 100644 --- a/backend/controller/user.py +++ b/backend/controller/user.py @@ -1,8 +1,16 @@ -from fastapi import Query +from fastapi import Depends, Query +from starlette.requests import Request -from core.security import get_password_hash -from dbhelper.user import (del_user, get_user, get_user_info, get_users, - insert_user, put_user) +from core.security import check_token, get_password_hash +from dbhelper.user import ( + del_user, + get_user, + get_user_info, + get_users, + insert_user, + put_user, + select_role, +) from schemas import Response, UserAdd, UserInfo, UserPut, UserQuery, UserRead from schemas.common import ListAll @@ -63,3 +71,11 @@ async def user_put(pk: int, data: UserPut) -> Response: if isinstance(result, int): return Response(code=400, msg=f"角色不存在{result}") return Response() + + +async def user_select_role(rid: int, user=Depends(check_token)): + """用户切换角色""" + res = await select_role(user.id, rid) + if res == 0: + return Response(code=400, msg=f"角色不存在{res}") + return Response() diff --git a/backend/core/security.py b/backend/core/security.py index c178d0d..8492817 100644 --- a/backend/core/security.py +++ b/backend/core/security.py @@ -74,7 +74,7 @@ async def check_permissions(request: Request, user: UserModel = Depends(check_to whitelist = [f"/user/{user.id}", f"/role/{active_rid}/menu"] flag = request.url.path in whitelist and request.method == "GET" if flag: - return + return user api = request.url.path for k, v in request.path_params.items(): diff --git a/backend/dbhelper/menu.py b/backend/dbhelper/menu.py index 26256d1..b59c069 100644 --- a/backend/dbhelper/menu.py +++ b/backend/dbhelper/menu.py @@ -71,4 +71,4 @@ async def get_apis(pk: int): async def put_menu(pk: int, data): """更新菜单""" - return await MenuModel.filter(id=pk).update(**data.dict()) \ No newline at end of file + return await MenuModel.filter(id=pk).update(**data.dict()) diff --git a/backend/dbhelper/user.py b/backend/dbhelper/user.py index 708adff..ea1da61 100644 --- a/backend/dbhelper/user.py +++ b/backend/dbhelper/user.py @@ -104,3 +104,9 @@ async def put_user(uid: int, data: UserPut): await UserRoleModel.bulk_create( [UserRoleModel(uid=uid, **role.dict()) for role in roles] ) + + +async def select_role(uid: int, rid: int): + """用户切换角色""" + await UserRoleModel.filter(uid=uid, rid__not=rid).update(status=1) + return await UserRoleModel.filter(uid=uid, rid=rid).update(status=5) diff --git a/backend/mini.db-shm b/backend/mini.db-shm deleted file mode 100644 index cd21bd97f7bf1e1417f1cc7affacc37610437fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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%0DxTqTxLk7_zBx{} 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 diff --git a/backend/router/url.py b/backend/router/url.py index f146478..29111c0 100644 --- a/backend/router/url.py +++ b/backend/router/url.py @@ -4,10 +4,24 @@ from fastapi import Depends, routing from controller.common import about, login from controller.menu import menu_add, menu_arr, menu_del, menu_put -from controller.role import (assigned_menu, role_add, role_arr, role_del, - role_has_menu, role_put, role_query) -from controller.user import (user_add, user_arr, user_del, user_info, - user_list, user_put) +from controller.role import ( + assigned_menu, + role_add, + role_arr, + role_del, + role_has_menu, + role_put, + role_query, +) +from controller.user import ( + user_add, + user_arr, + user_del, + user_info, + user_list, + user_put, + user_select_role, +) from core.security import check_permissions @@ -107,9 +121,7 @@ class Route(routing.APIRoute): ) -has_perm = { - # "dependencies": [Depends(check_permissions)] -} +has_perm = {"dependencies": [Depends(check_permissions)]} routes = [ Route.post("/login", endpoint=login, tags=["公共"], summary="登录"), @@ -129,6 +141,9 @@ routes = [ Route.post( "/user/query", endpoint=user_list, tags=["用户管理"], summary="用户列表查询", **has_perm ), + Route.put( + "/user/role/{rid}", endpoint=user_select_role, tags=["用户管理"], summary="用户切换角色" + ), # 角色管理, Route.get("/role", endpoint=role_arr, tags=["角色管理"], summary="角色列表", **has_perm), Route.post("/role", endpoint=role_add, tags=["角色管理"], summary="角色新增", **has_perm), diff --git a/backend/tests/test_case.py b/backend/tests/test_case.py index b676cb2..4d708a7 100644 --- a/backend/tests/test_case.py +++ b/backend/tests/test_case.py @@ -309,20 +309,6 @@ params = [ method="DELETE", ).dict(), ), - ( - "/menu", - MenuIn( - name="修改菜单", - meta={"icon": "Update"}, - path=None, - type=2, - component=None, - pid=5, - identifier="menu:update", - api="/menu/{pk}", - method="PUT", - ).dict(), - ), # 分配权限 ( "/role/assigned/menu", diff --git a/frontend/src/components/layout/layout-header.vue b/frontend/src/components/layout/layout-header.vue new file mode 100644 index 0000000..fbd00c6 --- /dev/null +++ b/frontend/src/components/layout/layout-header.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/frontend/src/components/layout/layout-info/layout-info.vue b/frontend/src/components/layout/layout-info/layout-info.vue new file mode 100644 index 0000000..a2bec66 --- /dev/null +++ b/frontend/src/components/layout/layout-info/layout-info.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/frontend/src/components/layout/layout-info/select-role.vue b/frontend/src/components/layout/layout-info/select-role.vue new file mode 100644 index 0000000..6b418f2 --- /dev/null +++ b/frontend/src/components/layout/layout-info/select-role.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index e2f563c..f6a53aa 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -1,7 +1,6 @@ import { createRouter, createWebHistory } from "vue-router"; import { message } from "ant-design-vue"; import { userStore } from "@/stores/user"; -import { loadRouter } from "@/utils/loadCpn"; const routes = [ { diff --git a/frontend/src/service/user.js b/frontend/src/service/user.js index 435d494..73ae873 100644 --- a/frontend/src/service/user.js +++ b/frontend/src/service/user.js @@ -21,3 +21,11 @@ export function getMenus(rid) { url: `/role/${rid}/menu`, }); } + +// 修改用户信息 +export function selectRole(rid) { + return request({ + url: `/user/role/${rid}`, + method: "put", + }); +} diff --git a/frontend/src/stores/user.js b/frontend/src/stores/user.js index 3ed7110..0744bdc 100644 --- a/frontend/src/stores/user.js +++ b/frontend/src/stores/user.js @@ -4,7 +4,7 @@ import { message } from "ant-design-vue"; import router from "@/router"; import { loadRouter, loadDefaultMenu } from "@/utils/loadCpn"; -import { getMenus, getUserInfo, login } from "@/service/user"; +import { getMenus, getUserInfo, login, selectRole } from "@/service/user"; export const userStore = defineStore( "user", @@ -28,14 +28,13 @@ export const userStore = defineStore( userMenus.value = []; }; - // 非setup语法时的actions - const loginAction = async (data) => { - // 1. 登录 - const res = await login(data); - token.value = res.data.token; - + /** + * 获取用户信息 & 菜单路由 + * @param {*} uid 用户id + */ + const getUserData = async (uid) => { // 2. 获取用户信息 - const info = await getUserInfo(res.data.id); + const info = await getUserInfo(uid); userInfo.value = info.data; // 3. 获取权限信息 @@ -55,7 +54,13 @@ export const userStore = defineStore( } else { router.push("/main"); } + }; + const loginAction = async (data) => { + // 1. 登录 + const res = await login(data); + token.value = res.data.token; + await getUserData(res.data.id); // 弹框提示登录成功 message.success("登录成功."); }; @@ -65,6 +70,13 @@ export const userStore = defineStore( loadRouter(userMenus.value); }; + // 切换角色 + const userSelectRole = async (rid) => { + await selectRole(rid); + // 重新拿用户信息 + await getUserData(userInfo.value.id); + }; + return { token, accessToken, @@ -75,6 +87,7 @@ export const userStore = defineStore( $reset, loginAction, loadRoleRouter, + userSelectRole, }; }, { diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index a6e2283..a633c95 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -25,7 +25,15 @@ export default (config) => { }, (err) => { userStore().isLoading = !userStore().isLoading; - message.error(err); + if (err.response.data?.msg) { + message.error(err.response.data.msg); + } else if (err.response.data?.detail) { + // 请求参数缺失 + message.error(err.response.data?.detail[0].msg); + } else { + message.error(err.message); + } + return Promise.reject(err); } ); diff --git a/frontend/src/views/main/main.vue b/frontend/src/views/main/main.vue index 714380a..9c6f5bf 100644 --- a/frontend/src/views/main/main.vue +++ b/frontend/src/views/main/main.vue @@ -1,17 +1,15 @@ @@ -25,7 +23,7 @@ const logout = () => { - 退出 +