diff --git a/server/crud/internal/roles.py b/server/crud/internal/roles.py index 397ea95..06e43c2 100644 --- a/server/crud/internal/roles.py +++ b/server/crud/internal/roles.py @@ -10,6 +10,10 @@ class CRUDRole(CRUDBase[Role]): def get_roles_by_id(self, session: Session, roles: List[str]): return session.exec(select(self.model).where(self.model.id.in_(roles))).all() + def check_exist(self, session: Session, name: str): + sql = select(self.model).where(self.model.name == name) + return session.exec(sql).one() + def check_admin(self, session: Session, uid: int) -> bool: """ 通过uid,判断此用户是否在admin组中 diff --git a/server/models/internal/role.py b/server/models/internal/role.py index 523916b..0ef46e7 100644 --- a/server/models/internal/role.py +++ b/server/models/internal/role.py @@ -8,7 +8,7 @@ class RoleBase(SQLModel): - name: str = Field(max_length=20, sa_column_kwargs={'comment': '角色名'}) + name: str = Field(max_length=20, sa_column_kwargs={'unique': True, 'comment': '角色名'}) description: str = Field(max_length=100, sa_column_kwargs={'comment': '描述'}) enable: bool = Field(default=True, sa_column=Column(Boolean, comment='启用')) diff --git a/server/models/internal/user.py b/server/models/internal/user.py index 503c0a7..0292a31 100644 --- a/server/models/internal/user.py +++ b/server/models/internal/user.py @@ -9,7 +9,7 @@ class UserWithOutPasswd(SQLModel): - name: str = Field(max_length=20, sa_column_kwargs={'comment': '用户名'}) + name: str = Field(max_length=20, sa_column_kwargs={'unique': True, 'comment': '用户名'}) enable: bool = Field(default=True, sa_column=Column(Boolean, comment='可用')) avatar: Optional[str] = Field(max_length=100, sa_column_kwargs={'comment': '头像'}) email: Optional[str] = Field(max_length=20, sa_column_kwargs={'comment': '邮箱'}) diff --git a/server/routers/internal/roles.py b/server/routers/internal/roles.py index 71ffc7f..56b28a2 100644 --- a/server/routers/internal/roles.py +++ b/server/routers/internal/roles.py @@ -3,6 +3,7 @@ from fastapi import APIRouter, Depends, status from fastapi.exceptions import HTTPException from sqlmodel import Session +from sqlalchemy.exc import NoResultFound from ...common.response_code import ApiResponse from ...common.auth_casbin import Authority from ...common.database import get_session @@ -53,17 +54,37 @@ async def get_roles(search: Pagination[RoleBase], session: Session = Depends(get ) +@router.get('/roles/exist', summary='角色是否存在') +async def check_uname_exist(name: str, session: Session = Depends(get_session)): + try: + crud.internal.role.check_exist(session, name) + except NoResultFound: + return ApiResponse() + else: + return ApiResponse( + message='error', + data='error' + ) + + @router.post('/roles', summary="新建角色", response_model=ApiResponse[Role], dependencies=[Depends(Authority('role:add'))]) async def add_roles(role_info: RoleInsert, session: Session = Depends(get_session)): logger.debug(role_info) enable_menus = role_info.menus delattr(role_info, 'menus') - db_obj = crud.internal.role.insert(session, Role(**role_info.dict())) - crud.internal.role.update_menus(session, db_obj, enable_menus) - return ApiResponse( - data=db_obj - ) + try: + db_obj = crud.internal.role.insert(session, Role(**role_info.dict())) + crud.internal.role.update_menus(session, db_obj, enable_menus) + return ApiResponse( + data=db_obj + ) + except Exception as e: + logger.error(f"add role error:{str(e)}") + return ApiResponse( + code=500, + message=f"新建角色错误" + ) @router.put('/roles', summary="更新角色", response_model=ApiResponse[Role], diff --git a/server/routers/internal/user.py b/server/routers/internal/user.py index eb54a1c..e92d679 100644 --- a/server/routers/internal/user.py +++ b/server/routers/internal/user.py @@ -34,14 +34,17 @@ async def get_roles(id: Optional[int] = None, session: Session = Depends(get_ses ) -@router.get('/users/exist', summary='用户是否存在', status_code=status.HTTP_204_NO_CONTENT) +@router.get('/users/exist', summary='用户是否存在') async def check_uname_exist(name: str, session: Session = Depends(get_session)): try: crud.internal.user.check_name(session, name) except NoResultFound: - return + return ApiResponse() else: - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='用户名已存在') + return ApiResponse( + message='error', + data='error' + ) @router.get('/users/{uid}', @@ -88,8 +91,14 @@ async def update_user(user_info: UserCreateWithRoles, session: Session = Depends :param session: :return: """ - logger.debug(user_info) - user: User = crud.internal.user.insert(session, user_info) + try: + user: User = crud.internal.user.insert(session, user_info) + except Exception as e: + logger.error(f"User Add Error:{str(e)}") + return ApiResponse( + code=500, + message=f"新建用户错误" + ) new_roles = [role.id for role in user.roles] for role in new_roles: casbin_enforcer.add_role_for_user(f'uid_{user.id}', f'role_{role}') diff --git a/www/.env.dev b/www/.env.developmentv similarity index 100% rename from www/.env.dev rename to www/.env.developmentv diff --git a/www/.env.production b/www/.env.production new file mode 100644 index 0000000..a348a52 --- /dev/null +++ b/www/.env.production @@ -0,0 +1,2 @@ +NODE_ENV=production +VITE_APP_BASEURL='http://172.16.8.201:8000' \ No newline at end of file diff --git a/www/.env_pro b/www/.env_pro deleted file mode 100644 index 9a5d45f..0000000 --- a/www/.env_pro +++ /dev/null @@ -1,2 +0,0 @@ -NODE_ENV=production -VUE_API_SERVER='http://172.16.8.201:8000' \ No newline at end of file diff --git a/www/src/api/roles.js b/www/src/api/roles.js index 7aff33e..b04bb28 100644 --- a/www/src/api/roles.js +++ b/www/src/api/roles.js @@ -6,4 +6,5 @@ export const GetRoleInfo = (roleId) => GET('/api/roles' + roleId) export const GetRoleEnableMenus = (roleId) => GET('/api/roles/enable-menus', {id: roleId}) export const PostNewRoles = (role) => POST('/api/roles', role) export const PutRoles = (role) => PUT('/api/roles', role) -export const DeleteRole = (roleId) => DELETE('/api/roles/' + roleId) \ No newline at end of file +export const DeleteRole = (roleId) => DELETE('/api/roles/' + roleId) +export const GetRoleExist = (name) => GET('/api/roles/exist', {name}) \ No newline at end of file diff --git a/www/src/utils/request.js b/www/src/utils/request.js index 1c1f7da..bbc5ac6 100644 --- a/www/src/utils/request.js +++ b/www/src/utils/request.js @@ -74,6 +74,7 @@ service.interceptors.response.use( message: response.data.message, type: 'error' }) + return Promise.reject() } }, error => { diff --git a/www/src/views/system/dictonary/index.vue b/www/src/views/system/dictonary/index.vue index 7c5ba6d..459598b 100644 --- a/www/src/views/system/dictonary/index.vue +++ b/www/src/views/system/dictonary/index.vue @@ -142,15 +142,7 @@ } }) - onMounted(() => { - freshCurrentPage() - }) - \ No newline at end of file diff --git a/www/src/views/system/roles/RoleDialog.vue b/www/src/views/system/roles/RoleDialog.vue index feb0d7e..a24e857 100644 --- a/www/src/views/system/roles/RoleDialog.vue +++ b/www/src/views/system/roles/RoleDialog.vue @@ -1,8 +1,8 @@