Skip to content

Commit 1dd4d82

Browse files
insistencegitee-org
authored andcommitted
!11 RuoYi-Vue3-FastAPI v1.2.0
Merge pull request !11 from insistence/async-database
2 parents 18103e3 + b1e3fcd commit 1dd4d82

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1476
-1281
lines changed

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<p align="center">
22
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
33
</p>
4-
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.1.3</h1>
4+
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.2.0</h1>
55
<h4 align="center">基于RuoYi-Vue3+FastAPI前后端分离的快速开发框架</h4>
66
<p align="center">
77
<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>
88
<a href="https://github.com/insistence/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/github/stars/insistence/RuoYi-Vue3-FastAPI?style=social"></a>
9-
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.1.3-brightgreen.svg"></a>
9+
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.2.0-brightgreen.svg"></a>
1010
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
1111
<img src="https://img.shields.io/badge/python-≥3.8-blue">
1212
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
@@ -18,7 +18,6 @@
1818

1919

2020

21-
2221
## 平台简介
2322

2423
RuoYi-Vue3-FastAPI是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。

ruoyi-fastapi-backend/.env.dev

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
1010
# 应用端口
1111
APP_PORT = 9099
1212
# 应用版本
13-
APP_VERSION= '1.1.3'
13+
APP_VERSION= '1.2.0'
1414
# 应用是否开启热重载
1515
APP_RELOAD = true
1616
# 应用是否开启IP归属区域查询

ruoyi-fastapi-backend/.env.prod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ APP_HOST = '0.0.0.0'
1010
# 应用端口
1111
APP_PORT = 9099
1212
# 应用版本
13-
APP_VERSION= '1.1.3'
13+
APP_VERSION= '1.2.0'
1414
# 应用是否开启热重载
1515
APP_RELOAD = false
1616
# 应用是否开启IP归属区域查询
1717
APP_IP_LOCATION_QUERY = true
1818
# 应用是否允许账号同时登录
19-
APP_SAMETIME_LOGIN = true
19+
APP_SAME_TIME_LOGIN = true
2020

2121
# -------- Jwt配置 --------
2222
# Jwt秘钥
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1-
from sqlalchemy import create_engine
2-
from sqlalchemy.ext.declarative import declarative_base
3-
from sqlalchemy.orm import sessionmaker
1+
from sqlalchemy.ext.asyncio import create_async_engine
2+
from sqlalchemy.ext.asyncio import async_sessionmaker
3+
from sqlalchemy.ext.asyncio import AsyncAttrs
4+
from sqlalchemy.orm import DeclarativeBase
45
from urllib.parse import quote_plus
56
from config.env import DataBaseConfig
67

7-
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@" \
8+
ASYNC_SQLALCHEMY_DATABASE_URL = f"mysql+asyncmy://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@" \
89
f"{DataBaseConfig.db_host}:{DataBaseConfig.db_port}/{DataBaseConfig.db_database}"
910

10-
engine = create_engine(
11-
SQLALCHEMY_DATABASE_URL,
11+
async_engine = create_async_engine(
12+
ASYNC_SQLALCHEMY_DATABASE_URL,
1213
echo=DataBaseConfig.db_echo,
1314
max_overflow=DataBaseConfig.db_max_overflow,
1415
pool_size=DataBaseConfig.db_pool_size,
1516
pool_recycle=DataBaseConfig.db_pool_recycle,
1617
pool_timeout=DataBaseConfig.db_pool_timeout
1718
)
18-
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
19-
Base = declarative_base()
19+
AsyncSessionLocal = async_sessionmaker(autocommit=False, autoflush=False, bind=async_engine)
20+
21+
22+
class Base(AsyncAttrs, DeclarativeBase):
23+
pass

ruoyi-fastapi-backend/config/get_db.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@
22
from utils.log_util import logger
33

44

5-
def get_db_pro():
5+
async def get_db():
66
"""
77
每一个请求处理完毕后会关闭当前连接,不同的请求使用不同的连接
88
:return:
99
"""
10-
current_db = SessionLocal()
11-
try:
10+
async with AsyncSessionLocal() as current_db:
1211
yield current_db
13-
finally:
14-
current_db.close()
1512

1613

1714
async def init_create_table():
@@ -20,8 +17,6 @@ async def init_create_table():
2017
:return:
2118
"""
2219
logger.info("初始化数据库连接...")
23-
Base.metadata.create_all(bind=engine)
20+
async with async_engine.begin() as conn:
21+
await conn.run_sync(Base.metadata.create_all)
2422
logger.info("数据库连接成功")
25-
26-
27-
get_db = get_db_pro

ruoyi-fastapi-backend/config/get_redis.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from module_admin.service.dict_service import DictDataService
44
from module_admin.service.config_service import ConfigService
55
from config.env import RedisConfig
6-
from config.database import SessionLocal
6+
from config.database import AsyncSessionLocal
77
from utils.log_util import logger
88

99

@@ -59,10 +59,8 @@ async def init_sys_dict(cls, redis):
5959
:param redis: redis对象
6060
:return:
6161
"""
62-
session = SessionLocal()
63-
await DictDataService.init_cache_sys_dict_services(session, redis)
64-
65-
session.close()
62+
async with AsyncSessionLocal() as session:
63+
await DictDataService.init_cache_sys_dict_services(session, redis)
6664

6765
@classmethod
6866
async def init_sys_config(cls, redis):
@@ -71,7 +69,5 @@ async def init_sys_config(cls, redis):
7169
:param redis: redis对象
7270
:return:
7371
"""
74-
session = SessionLocal()
75-
await ConfigService.init_cache_sys_config_services(session, redis)
76-
77-
session.close()
72+
async with AsyncSessionLocal() as session:
73+
await ConfigService.init_cache_sys_config_services(session, redis)

ruoyi-fastapi-backend/config/get_scheduler.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1+
import json
12
from apscheduler.schedulers.background import BackgroundScheduler
23
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
34
from apscheduler.jobstores.memory import MemoryJobStore
45
from apscheduler.jobstores.redis import RedisJobStore
56
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
67
from apscheduler.triggers.cron import CronTrigger
78
from apscheduler.events import EVENT_ALL
8-
import json
9+
from sqlalchemy.engine import create_engine
10+
from sqlalchemy.orm import sessionmaker
911
from datetime import datetime, timedelta
10-
from config.database import engine, SQLALCHEMY_DATABASE_URL, SessionLocal
11-
from config.env import RedisConfig
12+
from config.database import quote_plus, AsyncSessionLocal
13+
from config.env import DataBaseConfig, RedisConfig
1214
from module_admin.service.job_log_service import JobLogService, JobLogModel
13-
from module_admin.dao.job_dao import Session, JobDao
15+
from module_admin.dao.job_dao import JobDao
1416
from utils.log_util import logger
1517
import module_task
1618

@@ -65,6 +67,17 @@ def __find_recent_workday(cls, day):
6567
diff += 1
6668

6769

70+
SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{DataBaseConfig.db_username}:{quote_plus(DataBaseConfig.db_password)}@" \
71+
f"{DataBaseConfig.db_host}:{DataBaseConfig.db_port}/{DataBaseConfig.db_database}"
72+
engine = create_engine(
73+
SQLALCHEMY_DATABASE_URL,
74+
echo=DataBaseConfig.db_echo,
75+
max_overflow=DataBaseConfig.db_max_overflow,
76+
pool_size=DataBaseConfig.db_pool_size,
77+
pool_recycle=DataBaseConfig.db_pool_recycle,
78+
pool_timeout=DataBaseConfig.db_pool_timeout
79+
)
80+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
6881
job_stores = {
6982
'default': MemoryJobStore(),
7083
'sqlalchemy': SQLAlchemyJobStore(url=SQLALCHEMY_DATABASE_URL, engine=engine),
@@ -96,20 +109,20 @@ class SchedulerUtil:
96109
"""
97110

98111
@classmethod
99-
async def init_system_scheduler(cls, query_db: Session = SessionLocal()):
112+
async def init_system_scheduler(cls):
100113
"""
101114
应用启动时初始化定时任务
102115
:return:
103116
"""
104117
logger.info("开始启动定时任务...")
105118
scheduler.start()
106-
job_list = JobDao.get_job_list_for_scheduler(query_db)
107-
for item in job_list:
108-
query_job = cls.get_scheduler_job(job_id=str(item.job_id))
109-
if query_job:
110-
cls.remove_scheduler_job(job_id=str(item.job_id))
111-
cls.add_scheduler_job(item)
112-
query_db.close()
119+
async with AsyncSessionLocal() as session:
120+
job_list = await JobDao.get_job_list_for_scheduler(session)
121+
for item in job_list:
122+
query_job = cls.get_scheduler_job(job_id=str(item.job_id))
123+
if query_job:
124+
cls.remove_scheduler_job(job_id=str(item.job_id))
125+
cls.add_scheduler_job(item)
113126
scheduler.add_listener(cls.scheduler_event_listener, EVENT_ALL)
114127
logger.info("系统初始定时任务加载成功")
115128

@@ -225,7 +238,8 @@ def scheduler_event_listener(cls, event):
225238
jobTrigger=job_trigger,
226239
jobMessage=job_message,
227240
status=status,
228-
exceptionInfo=exception_info
241+
exceptionInfo=exception_info,
242+
createTime=datetime.now()
229243
)
230244
session = SessionLocal()
231245
JobLogService.add_job_log_services(session, job_log)

ruoyi-fastapi-backend/module_admin/annotation/log_annotation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ async def wrapper(*args, **kwargs):
131131
login_log['status'] = str(status)
132132
login_log['msg'] = result_dict.get('msg')
133133

134-
LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log))
134+
await LoginLogService.add_login_log_services(query_db, LogininforModel(**login_log))
135135
else:
136136
current_user = await LoginService.get_current_user(request, token, query_db)
137137
oper_name = current_user.user.user_name
@@ -154,7 +154,7 @@ async def wrapper(*args, **kwargs):
154154
operTime=oper_time,
155155
costTime=int(cost_time)
156156
)
157-
OperationLogService.add_operation_log_services(query_db, operation_log)
157+
await OperationLogService.add_operation_log_services(query_db, operation_log)
158158

159159
return result
160160

ruoyi-fastapi-backend/module_admin/aspect/data_scope.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ def __call__(self, current_user: CurrentUserModel = Depends(LoginService.get_cur
2424
if self.query_alias == '' or max_data_scope == 1 or user_id == 1:
2525
param_sql = '1 == 1'
2626
elif max_data_scope == 2:
27-
param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysRoleDept.dept_id).filter(SysRoleDept.role_id == {max_role_id})) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
27+
param_sql = f"{self.query_alias}.{self.dept_alias}.in_(select(SysRoleDept.dept_id).where(SysRoleDept.role_id == {max_role_id})) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
2828
elif max_data_scope == 3:
2929
param_sql = f"{self.query_alias}.{self.dept_alias} == {dept_id} if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
3030
elif max_data_scope == 4:
31-
param_sql = f"{self.query_alias}.{self.dept_alias}.in_({self.db_alias}.query(SysDept.dept_id).filter(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors)))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
31+
param_sql = f"{self.query_alias}.{self.dept_alias}.in_(select(SysDept.dept_id).where(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors)))) if hasattr({self.query_alias}, '{self.dept_alias}') else 1 == 1"
3232
elif max_data_scope == 5:
3333
param_sql = f"{self.query_alias}.{self.user_alias} == {user_id} if hasattr({self.query_alias}, '{self.user_alias}') else 1 == 1"
3434
else:

ruoyi-fastapi-backend/module_admin/controller/cache_controller.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ async def get_monitor_cache_info(request: Request):
2626
async def get_monitor_cache_name(request: Request):
2727
try:
2828
# 获取全量数据
29-
cache_name_list_result = CacheService.get_cache_monitor_cache_name_services()
29+
cache_name_list_result = await CacheService.get_cache_monitor_cache_name_services()
3030
logger.info('获取成功')
3131
return ResponseUtil.success(data=cache_name_list_result)
3232
except Exception as e:

0 commit comments

Comments
 (0)