!12 RuoYi-Vue3-FastAPI v1.2.1
Merge pull request !12 from insistence/develop
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
|
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
|
||||||
</p>
|
</p>
|
||||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.2.0</h1>
|
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.2.1</h1>
|
||||||
<h4 align="center">基于RuoYi-Vue3+FastAPI前后端分离的快速开发框架</h4>
|
<h4 align="center">基于RuoYi-Vue3+FastAPI前后端分离的快速开发框架</h4>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/stargazers"><img src="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/badge/star.svg?theme=dark"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/stargazers"><img src="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/badge/star.svg?theme=dark"></a>
|
||||||
<a href="https://github.com/insistence/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/github/stars/insistence/RuoYi-Vue3-FastAPI?style=social"></a>
|
<a href="https://github.com/insistence/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/github/stars/insistence/RuoYi-Vue3-FastAPI?style=social"></a>
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.2.0-brightgreen.svg"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.2.1-brightgreen.svg"></a>
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
||||||
<img src="https://img.shields.io/badge/python-≥3.8-blue">
|
<img src="https://img.shields.io/badge/python-≥3.8-blue">
|
||||||
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
|
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
|
||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 平台简介
|
## 平台简介
|
||||||
|
|
||||||
RuoYi-Vue3-FastAPI是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
|
RuoYi-Vue3-FastAPI是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
|
||||||
|
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
|
|||||||
# 应用端口
|
# 应用端口
|
||||||
APP_PORT = 9099
|
APP_PORT = 9099
|
||||||
# 应用版本
|
# 应用版本
|
||||||
APP_VERSION= '1.2.0'
|
APP_VERSION= '1.2.1'
|
||||||
# 应用是否开启热重载
|
# 应用是否开启热重载
|
||||||
APP_RELOAD = true
|
APP_RELOAD = true
|
||||||
# 应用是否开启IP归属区域查询
|
# 应用是否开启IP归属区域查询
|
||||||
|
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
|
|||||||
# 应用端口
|
# 应用端口
|
||||||
APP_PORT = 9099
|
APP_PORT = 9099
|
||||||
# 应用版本
|
# 应用版本
|
||||||
APP_VERSION= '1.2.0'
|
APP_VERSION= '1.2.1'
|
||||||
# 应用是否开启热重载
|
# 应用是否开启热重载
|
||||||
APP_RELOAD = false
|
APP_RELOAD = false
|
||||||
# 应用是否开启IP归属区域查询
|
# 应用是否开启IP归属区域查询
|
||||||
|
@@ -31,7 +31,9 @@ async def get_system_config_list(request: Request, config_page_query: ConfigPage
|
|||||||
async def add_system_config(request: Request, add_config: ConfigModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_config(request: Request, add_config: ConfigModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_config.create_by = current_user.user.user_name
|
add_config.create_by = current_user.user.user_name
|
||||||
|
add_config.create_time = datetime.now()
|
||||||
add_config.update_by = current_user.user.user_name
|
add_config.update_by = current_user.user.user_name
|
||||||
|
add_config.update_time = datetime.now()
|
||||||
add_config_result = await ConfigService.add_config_services(request, query_db, add_config)
|
add_config_result = await ConfigService.add_config_services(request, query_db, add_config)
|
||||||
if add_config_result.is_success:
|
if add_config_result.is_success:
|
||||||
logger.info(add_config_result.message)
|
logger.info(add_config_result.message)
|
||||||
|
@@ -41,7 +41,9 @@ async def get_system_dept_list(request: Request, dept_query: DeptQueryModel = De
|
|||||||
async def add_system_dept(request: Request, add_dept: DeptModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_dept(request: Request, add_dept: DeptModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_dept.create_by = current_user.user.user_name
|
add_dept.create_by = current_user.user.user_name
|
||||||
|
add_dept.create_time = datetime.now()
|
||||||
add_dept.update_by = current_user.user.user_name
|
add_dept.update_by = current_user.user.user_name
|
||||||
|
add_dept.update_time = datetime.now()
|
||||||
add_dept_result = await DeptService.add_dept_services(query_db, add_dept)
|
add_dept_result = await DeptService.add_dept_services(query_db, add_dept)
|
||||||
if add_dept_result.is_success:
|
if add_dept_result.is_success:
|
||||||
logger.info(add_dept_result.message)
|
logger.info(add_dept_result.message)
|
||||||
|
@@ -31,7 +31,9 @@ async def get_system_dict_type_list(request: Request, dict_type_page_query: Dict
|
|||||||
async def add_system_dict_type(request: Request, add_dict_type: DictTypeModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_dict_type(request: Request, add_dict_type: DictTypeModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_dict_type.create_by = current_user.user.user_name
|
add_dict_type.create_by = current_user.user.user_name
|
||||||
|
add_dict_type.create_time = datetime.now()
|
||||||
add_dict_type.update_by = current_user.user.user_name
|
add_dict_type.update_by = current_user.user.user_name
|
||||||
|
add_dict_type.update_time = datetime.now()
|
||||||
add_dict_type_result = await DictTypeService.add_dict_type_services(request, query_db, add_dict_type)
|
add_dict_type_result = await DictTypeService.add_dict_type_services(request, query_db, add_dict_type)
|
||||||
if add_dict_type_result.is_success:
|
if add_dict_type_result.is_success:
|
||||||
logger.info(add_dict_type_result.message)
|
logger.info(add_dict_type_result.message)
|
||||||
@@ -160,7 +162,9 @@ async def get_system_dict_data_list(request: Request, dict_data_page_query: Dict
|
|||||||
async def add_system_dict_data(request: Request, add_dict_data: DictDataModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_dict_data(request: Request, add_dict_data: DictDataModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_dict_data.create_by = current_user.user.user_name
|
add_dict_data.create_by = current_user.user.user_name
|
||||||
|
add_dict_data.create_time = datetime.now()
|
||||||
add_dict_data.update_by = current_user.user.user_name
|
add_dict_data.update_by = current_user.user.user_name
|
||||||
|
add_dict_data.update_time = datetime.now()
|
||||||
add_dict_data_result = await DictDataService.add_dict_data_services(request, query_db, add_dict_data)
|
add_dict_data_result = await DictDataService.add_dict_data_services(request, query_db, add_dict_data)
|
||||||
if add_dict_data_result.is_success:
|
if add_dict_data_result.is_success:
|
||||||
logger.info(add_dict_data_result.message)
|
logger.info(add_dict_data_result.message)
|
||||||
|
@@ -32,7 +32,9 @@ async def get_system_job_list(request: Request, job_page_query: JobPageQueryMode
|
|||||||
async def add_system_job(request: Request, add_job: JobModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_job(request: Request, add_job: JobModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_job.create_by = current_user.user.user_name
|
add_job.create_by = current_user.user.user_name
|
||||||
|
add_job.create_time = datetime.now()
|
||||||
add_job.update_by = current_user.user.user_name
|
add_job.update_by = current_user.user.user_name
|
||||||
|
add_job.update_time = datetime.now()
|
||||||
add_job_result = await JobService.add_job_services(query_db, add_job)
|
add_job_result = await JobService.add_job_services(query_db, add_job)
|
||||||
if add_job_result.is_success:
|
if add_job_result.is_success:
|
||||||
logger.info(add_job_result.message)
|
logger.info(add_job_result.message)
|
||||||
|
@@ -50,7 +50,9 @@ async def get_system_menu_list(request: Request, menu_query: MenuQueryModel = De
|
|||||||
async def add_system_menu(request: Request, add_menu: MenuModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_menu(request: Request, add_menu: MenuModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_menu.create_by = current_user.user.user_name
|
add_menu.create_by = current_user.user.user_name
|
||||||
|
add_menu.create_time = datetime.now()
|
||||||
add_menu.update_by = current_user.user.user_name
|
add_menu.update_by = current_user.user.user_name
|
||||||
|
add_menu.update_time = datetime.now()
|
||||||
add_menu_result = await MenuService.add_menu_services(query_db, add_menu)
|
add_menu_result = await MenuService.add_menu_services(query_db, add_menu)
|
||||||
if add_menu_result.is_success:
|
if add_menu_result.is_success:
|
||||||
logger.info(add_menu_result.message)
|
logger.info(add_menu_result.message)
|
||||||
|
@@ -30,7 +30,9 @@ async def get_system_notice_list(request: Request, notice_page_query: NoticePage
|
|||||||
async def add_system_notice(request: Request, add_notice: NoticeModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_notice(request: Request, add_notice: NoticeModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_notice.create_by = current_user.user.user_name
|
add_notice.create_by = current_user.user.user_name
|
||||||
|
add_notice.create_time = datetime.now()
|
||||||
add_notice.update_by = current_user.user.user_name
|
add_notice.update_by = current_user.user.user_name
|
||||||
|
add_notice.update_time = datetime.now()
|
||||||
add_notice_result = await NoticeService.add_notice_services(query_db, add_notice)
|
add_notice_result = await NoticeService.add_notice_services(query_db, add_notice)
|
||||||
if add_notice_result.is_success:
|
if add_notice_result.is_success:
|
||||||
logger.info(add_notice_result.message)
|
logger.info(add_notice_result.message)
|
||||||
|
@@ -32,7 +32,9 @@ async def get_system_post_list(request: Request, post_page_query: PostPageQueryM
|
|||||||
async def add_system_post(request: Request, add_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_post(request: Request, add_post: PostModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_post.create_by = current_user.user.user_name
|
add_post.create_by = current_user.user.user_name
|
||||||
|
add_post.create_time = datetime.now()
|
||||||
add_post.update_by = current_user.user.user_name
|
add_post.update_by = current_user.user.user_name
|
||||||
|
add_post.update_time = datetime.now()
|
||||||
add_post_result = await PostService.add_post_services(query_db, add_post)
|
add_post_result = await PostService.add_post_services(query_db, add_post)
|
||||||
if add_post_result.is_success:
|
if add_post_result.is_success:
|
||||||
logger.info(add_post_result.message)
|
logger.info(add_post_result.message)
|
||||||
|
@@ -46,7 +46,9 @@ async def get_system_role_list(request: Request, role_page_query: RolePageQueryM
|
|||||||
async def add_system_role(request: Request, add_role: AddRoleModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
async def add_system_role(request: Request, add_role: AddRoleModel, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
|
||||||
try:
|
try:
|
||||||
add_role.create_by = current_user.user.user_name
|
add_role.create_by = current_user.user.user_name
|
||||||
|
add_role.create_time = datetime.now()
|
||||||
add_role.update_by = current_user.user.user_name
|
add_role.update_by = current_user.user.user_name
|
||||||
|
add_role.update_time = datetime.now()
|
||||||
add_role_result = await RoleService.add_role_services(query_db, add_role)
|
add_role_result = await RoleService.add_role_services(query_db, add_role)
|
||||||
if add_role_result.is_success:
|
if add_role_result.is_success:
|
||||||
logger.info(add_role_result.message)
|
logger.info(add_role_result.message)
|
||||||
|
@@ -47,7 +47,9 @@ async def add_system_user(request: Request, add_user: AddUserModel, query_db: As
|
|||||||
try:
|
try:
|
||||||
add_user.password = PwdUtil.get_password_hash(add_user.password)
|
add_user.password = PwdUtil.get_password_hash(add_user.password)
|
||||||
add_user.create_by = current_user.user.user_name
|
add_user.create_by = current_user.user.user_name
|
||||||
|
add_user.create_time = datetime.now()
|
||||||
add_user.update_by = current_user.user.user_name
|
add_user.update_by = current_user.user.user_name
|
||||||
|
add_user.update_time = datetime.now()
|
||||||
add_user_result = await UserService.add_user_services(query_db, add_user)
|
add_user_result = await UserService.add_user_services(query_db, add_user)
|
||||||
if add_user_result.is_success:
|
if add_user_result.is_success:
|
||||||
logger.info(add_user_result.message)
|
logger.info(add_user_result.message)
|
||||||
|
@@ -1,8 +1,9 @@
|
|||||||
import re
|
import re
|
||||||
from pydantic import BaseModel, ConfigDict, model_validator
|
from pydantic import BaseModel, ConfigDict, model_validator
|
||||||
from pydantic.alias_generators import to_camel
|
from pydantic.alias_generators import to_camel
|
||||||
from typing import Optional
|
from typing import Optional, List, Union
|
||||||
from exceptions.exception import ModelValidatorException
|
from exceptions.exception import ModelValidatorException
|
||||||
|
from module_admin.entity.vo.menu_vo import MenuModel
|
||||||
|
|
||||||
|
|
||||||
class UserLogin(BaseModel):
|
class UserLogin(BaseModel):
|
||||||
@@ -52,4 +53,31 @@ class SmsCode(BaseModel):
|
|||||||
is_success: Optional[bool] = None
|
is_success: Optional[bool] = None
|
||||||
sms_code: str
|
sms_code: str
|
||||||
session_id: str
|
session_id: str
|
||||||
message: Optional[str] = None
|
message: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
class MenuTreeModel(MenuModel):
|
||||||
|
children: Optional[Union[List['MenuTreeModel'], None]] = None
|
||||||
|
|
||||||
|
|
||||||
|
class MetaModel(BaseModel):
|
||||||
|
model_config = ConfigDict(alias_generator=to_camel)
|
||||||
|
|
||||||
|
title: Optional[str] = None
|
||||||
|
icon: Optional[str] = None
|
||||||
|
no_cache: Optional[bool] = None
|
||||||
|
link: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
class RouterModel(BaseModel):
|
||||||
|
model_config = ConfigDict(alias_generator=to_camel)
|
||||||
|
|
||||||
|
name: Optional[str] = None
|
||||||
|
path: Optional[str] = None
|
||||||
|
hidden: Optional[bool] = None
|
||||||
|
redirect: Optional[str] = None
|
||||||
|
component: Optional[str] = None
|
||||||
|
query: Optional[str] = None
|
||||||
|
always_show: Optional[bool] = None
|
||||||
|
meta: Optional[MetaModel] = None
|
||||||
|
children: Optional[Union[List['RouterModel'], None]] = None
|
||||||
|
@@ -24,6 +24,7 @@ class CustomOAuth2PasswordRequestForm(OAuth2PasswordRequestForm):
|
|||||||
"""
|
"""
|
||||||
自定义OAuth2PasswordRequestForm类,增加验证码及会话编号参数
|
自定义OAuth2PasswordRequestForm类,增加验证码及会话编号参数
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
grant_type: str = Form(default=None, regex="password"),
|
grant_type: str = Form(default=None, regex="password"),
|
||||||
@@ -47,6 +48,7 @@ class LoginService:
|
|||||||
"""
|
"""
|
||||||
登录模块服务层
|
登录模块服务层
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def authenticate_user(cls, request: Request, query_db: AsyncSession, login_user: UserLogin):
|
async def authenticate_user(cls, request: Request, query_db: AsyncSession, login_user: UserLogin):
|
||||||
"""
|
"""
|
||||||
@@ -231,57 +233,95 @@ class LoginService:
|
|||||||
"""
|
"""
|
||||||
query_user = await UserDao.get_user_by_id(query_db, user_id=user_id)
|
query_user = await UserDao.get_user_by_id(query_db, user_id=user_id)
|
||||||
user_router_menu = sorted([row for row in query_user.get('user_menu_info') if row.menu_type in ['M', 'C']], key=lambda x: x.order_num)
|
user_router_menu = sorted([row for row in query_user.get('user_menu_info') if row.menu_type in ['M', 'C']], key=lambda x: x.order_num)
|
||||||
user_router = cls.__generate_user_router_menu(0, user_router_menu)
|
menus = cls.__generate_menus(0, user_router_menu)
|
||||||
return user_router
|
user_router = cls.__generate_user_router_menu(menus)
|
||||||
|
return [router.model_dump(exclude_unset=True, by_alias=True) for router in user_router]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def __generate_user_router_menu(cls, pid: int, permission_list):
|
def __generate_menus(cls, pid: int, permission_list: List[SysMenu]):
|
||||||
"""
|
"""
|
||||||
工具方法:根据菜单信息生成路由信息树形嵌套数据
|
工具方法:根据菜单信息生成菜单信息树形嵌套数据
|
||||||
:param pid: 菜单id
|
:param pid: 菜单id
|
||||||
:param permission_list: 菜单列表信息
|
:param permission_list: 菜单列表信息
|
||||||
:return: 路由信息树形嵌套数据
|
:return: 菜单信息树形嵌套数据
|
||||||
"""
|
"""
|
||||||
router_list = []
|
menu_list: List[MenuTreeModel] = []
|
||||||
for permission in permission_list:
|
for permission in permission_list:
|
||||||
if permission.parent_id == pid:
|
if permission.parent_id == pid:
|
||||||
children = cls.__generate_user_router_menu(permission.menu_id, permission_list)
|
children = cls.__generate_menus(permission.menu_id, permission_list)
|
||||||
router_list_data = {}
|
menu_list_data = MenuTreeModel(**CamelCaseUtil.transform_result(permission))
|
||||||
if permission.menu_type == 'M':
|
if children:
|
||||||
router_list_data['name'] = permission.path.capitalize()
|
menu_list_data.children = children
|
||||||
router_list_data['hidden'] = False if permission.visible == '0' else True
|
menu_list.append(menu_list_data)
|
||||||
if permission.parent_id == 0:
|
|
||||||
router_list_data['component'] = 'Layout'
|
return menu_list
|
||||||
router_list_data['path'] = f'/{permission.path}'
|
|
||||||
else:
|
@classmethod
|
||||||
router_list_data['component'] = 'ParentView'
|
def __generate_user_router_menu(cls, permission_list: List[MenuTreeModel]):
|
||||||
router_list_data['path'] = permission.path
|
"""
|
||||||
if permission.is_frame == 1:
|
工具方法:根据菜单树信息生成路由信息树形嵌套数据
|
||||||
router_list_data['redirect'] = 'noRedirect'
|
:param permission_list: 菜单树列表信息
|
||||||
else:
|
:return: 路由信息树形嵌套数据
|
||||||
router_list_data['path'] = permission.path
|
"""
|
||||||
if children:
|
router_list: List[RouterModel] = []
|
||||||
router_list_data['alwaysShow'] = True
|
for permission in permission_list:
|
||||||
router_list_data['children'] = children
|
router = RouterModel(
|
||||||
router_list_data['meta'] = {
|
hidden=True if permission.visible == '1' else False,
|
||||||
'title': permission.menu_name,
|
name=RouterUtil.get_router_name(permission),
|
||||||
'icon': permission.icon,
|
path=RouterUtil.get_router_path(permission),
|
||||||
'noCache': False if permission.is_cache == '0' else True,
|
component=RouterUtil.get_component(permission),
|
||||||
'link': permission.path if permission.is_frame == 0 else None
|
query=permission.query,
|
||||||
}
|
meta=MetaModel(
|
||||||
elif permission.menu_type == 'C':
|
title=permission.menu_name,
|
||||||
router_list_data['name'] = permission.path.capitalize()
|
icon=permission.icon,
|
||||||
router_list_data['path'] = permission.path
|
noCache=True if permission.is_cache == 1 else False,
|
||||||
router_list_data['query'] = permission.query
|
link=permission.path if RouterUtil.is_http(permission.path) else None
|
||||||
router_list_data['hidden'] = False if permission.visible == '0' else True
|
)
|
||||||
router_list_data['component'] = permission.component
|
)
|
||||||
router_list_data['meta'] = {
|
c_menus = permission.children
|
||||||
'title': permission.menu_name,
|
if c_menus and permission.menu_type == 'M':
|
||||||
'icon': permission.icon,
|
router.always_show = True
|
||||||
'noCache': False if permission.is_cache == '0' else True,
|
router.redirect = 'noRedirect'
|
||||||
'link': permission.path if permission.is_frame == 0 else None
|
router.children = cls.__generate_user_router_menu(c_menus)
|
||||||
}
|
elif RouterUtil.is_menu_frame(permission):
|
||||||
router_list.append(router_list_data)
|
router.meta = None
|
||||||
|
children_list: List[RouterModel] = []
|
||||||
|
children = RouterModel(
|
||||||
|
path=permission.path,
|
||||||
|
component=permission.component,
|
||||||
|
name=permission.path.capitalize(),
|
||||||
|
meta=MetaModel(
|
||||||
|
title=permission.menu_name,
|
||||||
|
icon=permission.icon,
|
||||||
|
noCache=True if permission.is_cache == 1 else False,
|
||||||
|
link=permission.path if RouterUtil.is_http(permission.path) else None
|
||||||
|
),
|
||||||
|
query=permission.query
|
||||||
|
)
|
||||||
|
children_list.append(children)
|
||||||
|
router.children = children_list
|
||||||
|
elif permission.parent_id == 0 and RouterUtil.is_inner_link(permission):
|
||||||
|
router.meta = MetaModel(
|
||||||
|
title=permission.menu_name,
|
||||||
|
icon=permission.icon
|
||||||
|
)
|
||||||
|
router.path = '/'
|
||||||
|
children_list: List[RouterModel] = []
|
||||||
|
router_path = RouterUtil.inner_link_replace_each(permission.path)
|
||||||
|
children = RouterModel(
|
||||||
|
path=router_path,
|
||||||
|
component='InnerLink',
|
||||||
|
name=router_path.capitalize(),
|
||||||
|
meta=MetaModel(
|
||||||
|
title=permission.menu_name,
|
||||||
|
icon=permission.icon,
|
||||||
|
link=permission.path if RouterUtil.is_http(permission.path) else None
|
||||||
|
)
|
||||||
|
)
|
||||||
|
children_list.append(children)
|
||||||
|
router.children = children_list
|
||||||
|
|
||||||
|
router_list.append(router)
|
||||||
|
|
||||||
return router_list
|
return router_list
|
||||||
|
|
||||||
@@ -386,3 +426,106 @@ class LoginService:
|
|||||||
# await request.app.state.redis.delete(f'{current_user.user.user_id}_session_id')
|
# await request.app.state.redis.delete(f'{current_user.user.user_id}_session_id')
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class RouterUtil:
|
||||||
|
"""
|
||||||
|
路由处理工具类
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_router_name(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
获取路由名称
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 路由名称
|
||||||
|
"""
|
||||||
|
router_name = menu.path.capitalize()
|
||||||
|
if cls.is_menu_frame(menu):
|
||||||
|
router_name = ''
|
||||||
|
|
||||||
|
return router_name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_router_path(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
获取路由地址
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 路由地址
|
||||||
|
"""
|
||||||
|
# 内链打开外网方式
|
||||||
|
router_path = menu.path
|
||||||
|
if menu.parent_id != 0 and cls.is_inner_link(menu):
|
||||||
|
router_path = cls.inner_link_replace_each(router_path)
|
||||||
|
# 非外链并且是一级目录(类型为目录)
|
||||||
|
if menu.parent_id == 0 and menu.menu_type == 'M' and menu.is_frame == 1:
|
||||||
|
router_path = f'/{menu.path}'
|
||||||
|
# 非外链并且是一级目录(类型为菜单)
|
||||||
|
elif cls.is_menu_frame(menu):
|
||||||
|
router_path = '/'
|
||||||
|
return router_path
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_component(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
获取组件信息
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 组件信息
|
||||||
|
"""
|
||||||
|
component = 'Layout'
|
||||||
|
if menu.component and not cls.is_menu_frame(menu):
|
||||||
|
component = menu.component
|
||||||
|
elif menu.component and menu.parent_id != 0 and cls.is_inner_link(menu):
|
||||||
|
component = 'InnerLink'
|
||||||
|
elif menu.component and cls.is_parent_view(menu):
|
||||||
|
component = 'ParentView'
|
||||||
|
return component
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_menu_frame(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
判断是否为菜单内部跳转
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 是否为菜单内部跳转
|
||||||
|
"""
|
||||||
|
return menu.parent_id == 0 and menu.menu_type == 'C' and menu.is_frame == 1
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_inner_link(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
判断是否为内链组件
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 是否为内链组件
|
||||||
|
"""
|
||||||
|
return menu.is_frame == 1 and cls.is_http(menu.path)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_parent_view(cls, menu: MenuTreeModel):
|
||||||
|
"""
|
||||||
|
判断是否为parent_view组件
|
||||||
|
:param menu: 菜单数对象
|
||||||
|
:return: 是否为parent_view组件
|
||||||
|
"""
|
||||||
|
return menu.parent_id != 0 and menu.menu_type == 'M'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def is_http(cls, link: str):
|
||||||
|
"""
|
||||||
|
判断是否为http(s)://开头
|
||||||
|
:param link: 链接
|
||||||
|
:return: 是否为http(s)://开头
|
||||||
|
"""
|
||||||
|
return link.startswith('http://') or link.startswith('https://')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def inner_link_replace_each(cls, path: str):
|
||||||
|
"""
|
||||||
|
内链域名特殊字符替换
|
||||||
|
:param path: 内链域名
|
||||||
|
:return: 替换后的内链域名
|
||||||
|
"""
|
||||||
|
old_values = ["http://", "https://", "www.", ".", ":"]
|
||||||
|
new_values = ["", "", "", "/", "/"]
|
||||||
|
for old, new in zip(old_values, new_values):
|
||||||
|
path = path.replace(old, new)
|
||||||
|
return path
|
||||||
|
@@ -275,7 +275,9 @@ class UserService:
|
|||||||
sex=row['sex'],
|
sex=row['sex'],
|
||||||
status=row['status'],
|
status=row['status'],
|
||||||
createBy=current_user.user.user_name,
|
createBy=current_user.user.user_name,
|
||||||
updateBy=current_user.user.user_name
|
createTime=datetime.now(),
|
||||||
|
updateBy=current_user.user.user_name,
|
||||||
|
updateTime=datetime.now()
|
||||||
)
|
)
|
||||||
user_info = await UserDao.get_user_by_info(query_db, UserModel(userName=row['user_name']))
|
user_info = await UserDao.get_user_by_info(query_db, UserModel(userName=row['user_name']))
|
||||||
if user_info:
|
if user_info:
|
||||||
@@ -289,7 +291,8 @@ class UserService:
|
|||||||
phonenumber=str(row['phonenumber']),
|
phonenumber=str(row['phonenumber']),
|
||||||
sex=row['sex'],
|
sex=row['sex'],
|
||||||
status=row['status'],
|
status=row['status'],
|
||||||
updateBy=current_user.user.user_name
|
updateBy=current_user.user.user_name,
|
||||||
|
updateTime=datetime.now()
|
||||||
).model_dump(exclude_unset=True)
|
).model_dump(exclude_unset=True)
|
||||||
await UserDao.edit_user_dao(query_db, edit_user)
|
await UserDao.edit_user_dao(query_db, edit_user)
|
||||||
else:
|
else:
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vfadmin",
|
"name": "vfadmin",
|
||||||
"version": "1.2.0",
|
"version": "1.2.1",
|
||||||
"description": "vfadmin管理系统",
|
"description": "vfadmin管理系统",
|
||||||
"author": "insistence",
|
"author": "insistence",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => {
|
|||||||
proxy: {
|
proxy: {
|
||||||
// https://cn.vitejs.dev/config/#server-proxy
|
// https://cn.vitejs.dev/config/#server-proxy
|
||||||
'/dev-api': {
|
'/dev-api': {
|
||||||
target: 'http://localhost:9099',
|
target: 'http://127.0.0.1:9099',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
rewrite: (p) => p.replace(/^\/dev-api/, '')
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user