Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
ruoyi-fastapi-backend/.env.dev
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
Expand Down Expand Up @@ -85,7 +86,7 @@ ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ pip3 install -r requirements.txt
pip3 install -r requirements-pg.txt

# 配置环境
.env.dev文件中配置开发环境的数据库和redis
把.env.dev.example修改为.env.dev,并在.env.dev文件中配置开发环境的数据库和redis

# 运行sql文件
1.新建数据库ruoyi-fastapi(默认,可修改)
Expand Down
2 changes: 2 additions & 0 deletions ruoyi-fastapi-backend/.env.dev
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ APP_DEMO_MODE = false
APP_DISABLE_SWAGGER = false
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = false
# 启用用户信息缓存
APP_ENABLE_USER_CACHE = true

# -------- Jwt配置 --------
# Jwt秘钥
Expand Down
122 changes: 122 additions & 0 deletions ruoyi-fastapi-backend/.env.dev.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# -------- 应用配置 --------
# 应用运行环境
APP_ENV = 'dev'
# 应用名称
APP_NAME = 'RuoYi-FastAPI'
# 应用代理路径
APP_ROOT_PATH = '/dev-api'
# 应用主机
APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
APP_VERSION= '1.9.0'
# 应用是否开启热重载
APP_RELOAD = true
# 应用工作进程数
APP_WORKERS = 1
# 应用是否开启IP归属区域查询
APP_IP_LOCATION_QUERY = true
# 应用是否允许账号同时登录
APP_SAME_TIME_LOGIN = true
# 应用是否为演示模式
APP_DEMO_MODE = false
# 应用是否禁用Swagger文档
APP_DISABLE_SWAGGER = false
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = false
# 启用用户信息缓存
APP_ENABLE_USER_CACHE = true

# -------- Jwt配置 --------
# Jwt秘钥
JWT_SECRET_KEY = 'b01c66dc2c58dc6a0aabfe2144256be36226de378bf87f72c0c795dda67f4d55'
# Jwt算法
JWT_ALGORITHM = 'HS256'
# 令牌过期时间
JWT_EXPIRE_MINUTES = 1440
# redis中令牌过期时间
JWT_REDIS_EXPIRE_MINUTES = 30


# -------- 数据库配置 --------
# 数据库类型,可选的有'mysql'、'postgresql',默认为'mysql'
DB_TYPE = 'mysql'
# 数据库主机
DB_HOST = '127.0.0.1'
# 数据库端口
DB_PORT = 3306
# 数据库用户名
DB_USERNAME = 'root'
# 数据库密码
DB_PASSWORD = 'mysqlroot'
# 数据库名称
DB_DATABASE = 'ruoyi-fastapi'
# 是否开启sqlalchemy日志
DB_ECHO = true
# 允许溢出连接池大小的最大连接数
DB_MAX_OVERFLOW = 10
# 连接池大小,0表示连接数无限制
DB_POOL_SIZE = 50
# 连接回收时间(单位:秒)
DB_POOL_RECYCLE = 3600
# 连接池中没有线程可用时,最多等待的时间(单位:秒)
DB_POOL_TIMEOUT = 30

# -------- Redis配置 --------
# Redis主机
REDIS_HOST = '127.0.0.1'
# Redis端口
REDIS_PORT = 6379
# Redis用户名
REDIS_USERNAME = ''
# Redis密码
REDIS_PASSWORD = ''
# Redis数据库
REDIS_DATABASE = 2

# -------- 日志配置 --------
# Redis Stream Key
LOG_STREAM_KEY = 'log:stream'
# Redis Stream 消费组名称
LOG_STREAM_GROUP = 'log_aggregator'
# Redis Stream 消费者名称前缀
LOG_STREAM_CONSUMER_PREFIX = 'worker'
# 每次读取的最大消息数量
LOG_STREAM_BATCH_SIZE = 100
# 阻塞读取等待时间(毫秒)
LOG_STREAM_BLOCK_MS = 2000
# Stream 最大长度(近似裁剪)
LOG_STREAM_MAXLEN = 100000
# Pending 回收最小空闲时间(毫秒)
LOG_STREAM_CLAIM_IDLE_MS = 60000
# Pending 回收检查间隔(毫秒)
LOG_STREAM_CLAIM_INTERVAL_MS = 5000
# 每次回收的最大消息数量
LOG_STREAM_CLAIM_BATCH_SIZE = 100
# 去重 Key 过期时间(秒)
LOG_STREAM_DEDUP_TTL = 3600
# 去重 Key 前缀
LOG_STREAM_DEDUP_PREFIX = 'log:dedup'
# stdout 输出是否为 JSON
LOGURU_JSON = false
# Loguru 最低输出级别
LOGURU_LEVEL = 'INFO'
# 是否输出到 stdout
LOGURU_STDOUT = true
# 是否启用文件日志
LOG_FILE_ENABLED = true
# 文件日志根目录
LOG_FILE_BASE_DIR = 'logs'
# 文件滚动策略
LOGURU_ROTATION = '50MB'
# 文件保留策略
LOGURU_RETENTION = '30 days'
# 文件压缩格式
LOGURU_COMPRESSION = 'zip'
# 实例标识(用于区分实例)
LOG_INSTANCE_ID = 'dev'
# 服务名称(用于统一标识服务)
LOG_SERVICE_NAME = 'ruoyi-fastapi-backend'
# Worker 标识(auto 自动生成)
LOG_WORKER_ID = 'auto'
2 changes: 2 additions & 0 deletions ruoyi-fastapi-backend/.env.dockermy
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ APP_DEMO_MODE = false
APP_DISABLE_SWAGGER = true
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = true
# 启用用户信息缓存
APP_ENABLE_USER_CACHE = true

# -------- Jwt配置 --------
# Jwt秘钥
Expand Down
2 changes: 2 additions & 0 deletions ruoyi-fastapi-backend/.env.dockerpg
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ APP_SAME_TIME_LOGIN = true
APP_DISABLE_SWAGGER = true
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = true
# 启用用户信息缓存
APP_ENABLE_USER_CACHE = true

# -------- Jwt配置 --------
# Jwt秘钥
Expand Down
2 changes: 2 additions & 0 deletions ruoyi-fastapi-backend/.env.prod
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ APP_DEMO_MODE = false
APP_DISABLE_SWAGGER = true
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = true
# 启用用户信息缓存
APP_ENABLE_USER_CACHE = true

# -------- Jwt配置 --------
# Jwt秘钥
Expand Down
1 change: 1 addition & 0 deletions ruoyi-fastapi-backend/common/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ def remark(self) -> str | None:
ACCOUNT_LOCK = {'key': 'account_lock', 'remark': '用户锁定'}
PASSWORD_ERROR_COUNT = {'key': 'password_error_count', 'remark': '密码错误次数'}
SMS_CODE = {'key': 'sms_code', 'remark': '短信验证码'}
USER_INFO = {'key': 'user', 'remark': '用户信息缓存'}
1 change: 1 addition & 0 deletions ruoyi-fastapi-backend/config/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AppSettings(BaseSettings):
app_demo_mode: bool = False
app_disable_swagger: bool = False
app_disable_redoc: bool = False
app_enable_user_cache: bool = True


class JwtSettings(BaseSettings):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ async def edit_system_dept(
await DeptService.check_dept_data_scope_services(query_db, edit_dept.dept_id, data_scope_sql)
edit_dept.update_by = current_user.user.user_name
edit_dept.update_time = datetime.now()
edit_dept_result = await DeptService.edit_dept_services(query_db, edit_dept)
edit_dept_result = await DeptService.edit_dept_services(request, query_db, edit_dept)
logger.info(edit_dept_result.message)

return ResponseUtil.success(msg=edit_dept_result.message)
Expand Down Expand Up @@ -139,7 +139,7 @@ async def delete_system_dept(
delete_dept = DeleteDeptModel(deptIds=dept_ids)
delete_dept.update_by = current_user.user.user_name
delete_dept.update_time = datetime.now()
delete_dept_result = await DeptService.delete_dept_services(query_db, delete_dept)
delete_dept_result = await DeptService.delete_dept_services(request, query_db, delete_dept)
logger.info(delete_dept_result.message)

return ResponseUtil.success(msg=delete_dept_result.message)
Expand Down
15 changes: 10 additions & 5 deletions ruoyi-fastapi-backend/module_admin/controller/login_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ async def login(
ex=timedelta(minutes=JwtConfig.jwt_redis_expire_minutes),
)
await UserService.edit_user_services(
query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status')
request, query_db, EditUserModel(userId=result[0].user_id, loginDate=datetime.now(), type='status')
)
logger.info('登录成功')
# 判断请求是否来自于api文档,如果是返回指定格式的结果,用于修复api文档认证成功后token显示undefined的bug
Expand Down Expand Up @@ -169,14 +169,19 @@ async def register_user(
response_model=ResponseBaseModel,
)
async def logout(request: Request, token: Annotated[str | None, Depends(oauth2_scheme)]) -> Response:
payload = jwt.decode(
token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm], options={'verify_exp': False}
)
try:
payload = jwt.decode(
token, JwtConfig.jwt_secret_key, algorithms=[JwtConfig.jwt_algorithm], options={'verify_exp': False}
)
except jwt.InvalidSignatureError:
logger.info('Token已过期,无法解析用户信息')
return ResponseUtil.success(msg='退出成功')

if AppConfig.app_same_time_login:
token_id: str = payload.get('session_id')
else:
token_id: str = payload.get('user_id')
await LoginService.logout_services(request, token_id)
await LoginService.logout_services(request, token_id, payload.get('user_id'))
logger.info('退出成功')

return ResponseUtil.success(msg='退出成功')
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ async def edit_system_menu(
) -> Response:
edit_menu.update_by = current_user.user.user_name
edit_menu.update_time = datetime.now()
edit_menu_result = await MenuService.edit_menu_services(query_db, edit_menu)
edit_menu_result = await MenuService.edit_menu_services(request, query_db, edit_menu)
logger.info(edit_menu_result.message)

return ResponseUtil.success(msg=edit_menu_result.message)
Expand All @@ -140,7 +140,7 @@ async def delete_system_menu(
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
delete_menu = DeleteMenuModel(menuIds=menu_ids)
delete_menu_result = await MenuService.delete_menu_services(query_db, delete_menu)
delete_menu_result = await MenuService.delete_menu_services(request, query_db, delete_menu)
logger.info(delete_menu_result.message)

return ResponseUtil.success(msg=delete_menu_result.message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ async def edit_system_post(
) -> Response:
edit_post.update_by = current_user.user.user_name
edit_post.update_time = datetime.now()
edit_post_result = await PostService.edit_post_services(query_db, edit_post)
edit_post_result = await PostService.edit_post_services(request, query_db, edit_post)
logger.info(edit_post_result.message)

return ResponseUtil.success(msg=edit_post_result.message)
Expand All @@ -106,7 +106,7 @@ async def delete_system_post(
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
delete_post = DeletePostModel(postIds=post_ids)
delete_post_result = await PostService.delete_post_services(query_db, delete_post)
delete_post_result = await PostService.delete_post_services(request, query_db, delete_post)
logger.info(delete_post_result.message)

return ResponseUtil.success(msg=delete_post_result.message)
Expand Down
16 changes: 9 additions & 7 deletions ruoyi-fastapi-backend/module_admin/controller/role_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ async def edit_system_role(
await RoleService.check_role_data_scope_services(query_db, str(edit_role.role_id), data_scope_sql)
edit_role.update_by = current_user.user.user_name
edit_role.update_time = datetime.now()
edit_role_result = await RoleService.edit_role_services(query_db, edit_role)
edit_role_result = await RoleService.edit_role_services(request, query_db, edit_role)
logger.info(edit_role_result.message)

return ResponseUtil.success(msg=edit_role_result.message)
Expand Down Expand Up @@ -158,7 +158,7 @@ async def edit_system_role_datascope(
updateBy=current_user.user.user_name,
updateTime=datetime.now(),
)
role_data_scope_result = await RoleService.role_datascope_services(query_db, edit_role)
role_data_scope_result = await RoleService.role_datascope_services(request, query_db, edit_role)
logger.info(role_data_scope_result.message)

return ResponseUtil.success(msg=role_data_scope_result.message)
Expand Down Expand Up @@ -186,7 +186,7 @@ async def delete_system_role(
if not current_user.user.admin:
await RoleService.check_role_data_scope_services(query_db, role_id, data_scope_sql)
delete_role = DeleteRoleModel(roleIds=role_ids, updateBy=current_user.user.user_name, updateTime=datetime.now())
delete_role_result = await RoleService.delete_role_services(query_db, delete_role)
delete_role_result = await RoleService.delete_role_services(request, query_db, delete_role)
logger.info(delete_role_result.message)

return ResponseUtil.success(msg=delete_role_result.message)
Expand Down Expand Up @@ -271,7 +271,7 @@ async def reset_system_role_status(
updateTime=datetime.now(),
type='status',
)
edit_role_result = await RoleService.edit_role_services(query_db, edit_role)
edit_role_result = await RoleService.edit_role_services(request, query_db, edit_role)
logger.info(edit_role_result.message)

return ResponseUtil.success(msg=edit_role_result.message)
Expand Down Expand Up @@ -336,7 +336,7 @@ async def add_system_role_user(
) -> Response:
if not current_user.user.admin:
await RoleService.check_role_data_scope_services(query_db, str(add_role_user.role_id), data_scope_sql)
add_role_user_result = await UserService.add_user_role_services(query_db, add_role_user)
add_role_user_result = await UserService.add_user_role_services(request, query_db, add_role_user)
logger.info(add_role_user_result.message)

return ResponseUtil.success(msg=add_role_user_result.message)
Expand All @@ -355,7 +355,7 @@ async def cancel_system_role_user(
cancel_user_role: CrudUserRoleModel,
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
cancel_user_role_result = await UserService.delete_user_role_services(query_db, cancel_user_role)
cancel_user_role_result = await UserService.delete_user_role_services(request, query_db, cancel_user_role)
logger.info(cancel_user_role_result.message)

return ResponseUtil.success(msg=cancel_user_role_result.message)
Expand All @@ -374,7 +374,9 @@ async def batch_cancel_system_role_user(
batch_cancel_user_role: Annotated[CrudUserRoleModel, Query()],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
batch_cancel_user_role_result = await UserService.delete_user_role_services(query_db, batch_cancel_user_role)
batch_cancel_user_role_result = await UserService.delete_user_role_services(
request, query_db, batch_cancel_user_role
)
logger.info(batch_cancel_user_role_result.message)

return ResponseUtil.success(msg=batch_cancel_user_role_result.message)
Loading