Skip to content

Commit 2c66f40

Browse files
authored
feat: 新增ApiCache接口缓存装饰器和ApiCacheEvict接口缓存失效装饰器 (#31)
* feat: 新增ApiCache接口缓存装饰器和ApiCacheEvict接口缓存失效装饰器 * fix: 修复ruff lint异常
1 parent cf38956 commit 2c66f40

File tree

19 files changed

+956
-3
lines changed

19 files changed

+956
-3
lines changed

ruoyi-fastapi-backend/common/annotation/cache_annotation.py

Lines changed: 563 additions & 0 deletions
Large diffs are not rendered by default.

ruoyi-fastapi-backend/common/constant.py

Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,268 @@ class LockConstant:
143143
LOCK_RENEWAL_INTERVAL = 20
144144

145145

146+
class CacheNamespace:
147+
"""
148+
接口缓存命名空间常量
149+
150+
MONITOR_SERVER_INFO: 服务监控信息缓存
151+
MONITOR_JOB_LIST: 定时任务分页列表缓存
152+
MONITOR_JOB_DETAIL: 定时任务详情缓存
153+
LOGIN_USER_INFO: 登录用户信息缓存
154+
LOGIN_USER_ROUTERS: 登录用户路由缓存
155+
SYSTEM_MENU_TREE: 菜单树缓存
156+
SYSTEM_MENU_ROLE_TREE: 角色菜单树缓存
157+
SYSTEM_MENU_LIST: 菜单分页列表缓存
158+
SYSTEM_MENU_DETAIL: 菜单详情缓存
159+
SYSTEM_DEPT_EDIT_TREE: 部门编辑树缓存
160+
SYSTEM_DEPT_LIST: 部门列表缓存
161+
SYSTEM_DEPT_DETAIL: 部门详情缓存
162+
SYSTEM_POST_LIST: 岗位列表缓存
163+
SYSTEM_POST_DETAIL: 岗位详情缓存
164+
SYSTEM_NOTICE_LIST: 通知公告列表缓存
165+
SYSTEM_NOTICE_DETAIL: 通知公告详情缓存
166+
SYSTEM_ROLE_DEPT_TREE: 角色部门树缓存
167+
SYSTEM_ROLE_LIST: 角色列表缓存
168+
SYSTEM_ROLE_DETAIL: 角色详情缓存
169+
SYSTEM_ROLE_ALLOCATED_USER_LIST: 已分配用户角色列表缓存
170+
SYSTEM_ROLE_UNALLOCATED_USER_LIST: 未分配用户角色列表缓存
171+
SYSTEM_USER_DEPT_TREE: 用户部门树缓存
172+
SYSTEM_USER_LIST: 用户列表缓存
173+
SYSTEM_USER_PROFILE: 用户个人信息缓存
174+
SYSTEM_USER_DETAIL: 用户详情缓存
175+
SYSTEM_CONFIG_LIST: 参数配置列表缓存
176+
SYSTEM_CONFIG_DETAIL: 参数配置详情缓存
177+
SYSTEM_DICT_TYPE_LIST: 字典类型列表缓存
178+
SYSTEM_DICT_TYPE_OPTIONS: 字典类型选项缓存
179+
SYSTEM_DICT_TYPE_DETAIL: 字典类型详情缓存
180+
SYSTEM_DICT_DATA_LIST: 字典数据列表缓存
181+
SYSTEM_DICT_DATA_DETAIL: 字典数据详情缓存
182+
AI_MODEL_LIST: AI模型列表缓存
183+
AI_MODEL_ALL: AI模型全量列表缓存
184+
AI_MODEL_DETAIL: AI模型详情缓存
185+
AI_CHAT_CONFIG: AI对话配置缓存
186+
TOOL_GEN_LIST: 代码生成列表缓存
187+
TOOL_GEN_DB_LIST: 代码生成数据源列表缓存
188+
TOOL_GEN_DETAIL: 代码生成详情缓存
189+
TOOL_GEN_PREVIEW: 代码生成预览缓存
190+
"""
191+
192+
MONITOR_SERVER_INFO = 'monitor:server:info'
193+
MONITOR_JOB_LIST = 'monitor:job:list'
194+
MONITOR_JOB_DETAIL = 'monitor:job:detail'
195+
196+
LOGIN_USER_INFO = 'login:user:info'
197+
LOGIN_USER_ROUTERS = 'login:user:routers'
198+
199+
SYSTEM_MENU_TREE = 'system:menu:tree'
200+
SYSTEM_MENU_ROLE_TREE = 'system:menu:role-tree'
201+
SYSTEM_MENU_LIST = 'system:menu:list'
202+
SYSTEM_MENU_DETAIL = 'system:menu:detail'
203+
204+
SYSTEM_DEPT_EDIT_TREE = 'system:dept:edit-tree'
205+
SYSTEM_DEPT_LIST = 'system:dept:list'
206+
SYSTEM_DEPT_DETAIL = 'system:dept:detail'
207+
208+
SYSTEM_POST_LIST = 'system:post:list'
209+
SYSTEM_POST_DETAIL = 'system:post:detail'
210+
211+
SYSTEM_NOTICE_LIST = 'system:notice:list'
212+
SYSTEM_NOTICE_DETAIL = 'system:notice:detail'
213+
214+
SYSTEM_ROLE_DEPT_TREE = 'system:role:dept-tree'
215+
SYSTEM_ROLE_LIST = 'system:role:list'
216+
SYSTEM_ROLE_DETAIL = 'system:role:detail'
217+
SYSTEM_ROLE_ALLOCATED_USER_LIST = 'system:role:allocated-user-list'
218+
SYSTEM_ROLE_UNALLOCATED_USER_LIST = 'system:role:unallocated-user-list'
219+
220+
SYSTEM_USER_DEPT_TREE = 'system:user:dept-tree'
221+
SYSTEM_USER_LIST = 'system:user:list'
222+
SYSTEM_USER_PROFILE = 'system:user:profile'
223+
SYSTEM_USER_DETAIL = 'system:user:detail'
224+
225+
SYSTEM_CONFIG_LIST = 'system:config:list'
226+
SYSTEM_CONFIG_DETAIL = 'system:config:detail'
227+
228+
SYSTEM_DICT_TYPE_LIST = 'system:dict:type-list'
229+
SYSTEM_DICT_TYPE_OPTIONS = 'system:dict:type-options'
230+
SYSTEM_DICT_TYPE_DETAIL = 'system:dict:type-detail'
231+
SYSTEM_DICT_DATA_LIST = 'system:dict:data-list'
232+
SYSTEM_DICT_DATA_DETAIL = 'system:dict:data-detail'
233+
234+
AI_MODEL_LIST = 'ai:model:list'
235+
AI_MODEL_ALL = 'ai:model:all'
236+
AI_MODEL_DETAIL = 'ai:model:detail'
237+
AI_CHAT_CONFIG = 'ai:chat:config'
238+
239+
TOOL_GEN_LIST = 'tool:gen:list'
240+
TOOL_GEN_DB_LIST = 'tool:gen:db-list'
241+
TOOL_GEN_DETAIL = 'tool:gen:detail'
242+
TOOL_GEN_PREVIEW = 'tool:gen:preview'
243+
244+
245+
class CacheGroup:
246+
"""
247+
接口缓存失效分组常量
248+
249+
PERMISSION_MUTATION: 权限及菜单视图关联缓存失效基础分组
250+
DATA_SCOPE_MUTATION: 数据范围相关视图关联缓存失效基础分组
251+
MENU_MUTATION: 菜单写操作关联缓存失效分组
252+
JOB_MUTATION: 定时任务写操作关联缓存失效分组
253+
POST_MUTATION: 岗位写操作关联缓存失效分组
254+
NOTICE_MUTATION: 通知公告写操作关联缓存失效分组
255+
ROLE_ENTITY_MUTATION: 角色实体信息变更关联缓存失效分组
256+
ROLE_PERMISSION_MUTATION: 角色权限变更关联缓存失效分组
257+
ROLE_MUTATION: 角色通用写操作关联缓存失效组合分组
258+
USER_ENTITY_MUTATION: 用户实体信息变更关联缓存失效分组
259+
USER_PERMISSION_MUTATION: 用户权限变更关联缓存失效分组
260+
USER_INFO_MUTATION: 用户资料与安全相关写操作关联缓存失效分组
261+
LOGIN_SUCCESS_MUTATION: 登录成功后关联缓存失效分组
262+
LOGOUT_MUTATION: 登出后关联缓存失效分组
263+
CONFIG_MUTATION: 参数配置写操作关联缓存失效分组
264+
DICT_TYPE_MUTATION: 字典类型写操作关联缓存失效分组
265+
DICT_DATA_MUTATION: 字典数据写操作关联缓存失效分组
266+
AI_MODEL_MUTATION: AI模型写操作关联缓存失效分组
267+
AI_CHAT_CONFIG_MUTATION: AI对话配置写操作关联缓存失效分组
268+
GEN_MUTATION: 代码生成写操作关联缓存失效分组
269+
"""
270+
271+
PERMISSION_MUTATION = (
272+
CacheNamespace.LOGIN_USER_INFO,
273+
CacheNamespace.LOGIN_USER_ROUTERS,
274+
CacheNamespace.SYSTEM_MENU_TREE,
275+
CacheNamespace.SYSTEM_MENU_ROLE_TREE,
276+
CacheNamespace.SYSTEM_MENU_LIST,
277+
)
278+
279+
DATA_SCOPE_MUTATION = (
280+
CacheNamespace.LOGIN_USER_INFO,
281+
CacheNamespace.SYSTEM_DEPT_EDIT_TREE,
282+
CacheNamespace.SYSTEM_DEPT_LIST,
283+
CacheNamespace.SYSTEM_DEPT_DETAIL,
284+
CacheNamespace.SYSTEM_ROLE_DEPT_TREE,
285+
CacheNamespace.SYSTEM_ROLE_LIST,
286+
CacheNamespace.SYSTEM_ROLE_DETAIL,
287+
CacheNamespace.SYSTEM_ROLE_ALLOCATED_USER_LIST,
288+
CacheNamespace.SYSTEM_ROLE_UNALLOCATED_USER_LIST,
289+
CacheNamespace.SYSTEM_USER_DEPT_TREE,
290+
CacheNamespace.SYSTEM_USER_LIST,
291+
CacheNamespace.SYSTEM_USER_DETAIL,
292+
CacheNamespace.SYSTEM_USER_PROFILE,
293+
CacheNamespace.AI_MODEL_LIST,
294+
CacheNamespace.AI_MODEL_ALL,
295+
CacheNamespace.AI_MODEL_DETAIL,
296+
)
297+
298+
MENU_MUTATION = (
299+
*PERMISSION_MUTATION,
300+
CacheNamespace.SYSTEM_MENU_DETAIL,
301+
)
302+
303+
JOB_MUTATION = (
304+
CacheNamespace.MONITOR_JOB_LIST,
305+
CacheNamespace.MONITOR_JOB_DETAIL,
306+
)
307+
308+
POST_MUTATION = (
309+
CacheNamespace.SYSTEM_POST_LIST,
310+
CacheNamespace.SYSTEM_POST_DETAIL,
311+
CacheNamespace.SYSTEM_USER_DETAIL,
312+
CacheNamespace.SYSTEM_USER_PROFILE,
313+
)
314+
315+
NOTICE_MUTATION = (
316+
CacheNamespace.SYSTEM_NOTICE_LIST,
317+
CacheNamespace.SYSTEM_NOTICE_DETAIL,
318+
)
319+
320+
ROLE_ENTITY_MUTATION = (
321+
CacheNamespace.SYSTEM_ROLE_DEPT_TREE,
322+
CacheNamespace.SYSTEM_ROLE_LIST,
323+
CacheNamespace.SYSTEM_ROLE_DETAIL,
324+
CacheNamespace.SYSTEM_ROLE_ALLOCATED_USER_LIST,
325+
CacheNamespace.SYSTEM_ROLE_UNALLOCATED_USER_LIST,
326+
CacheNamespace.SYSTEM_MENU_ROLE_TREE,
327+
CacheNamespace.SYSTEM_USER_DETAIL,
328+
)
329+
330+
ROLE_PERMISSION_MUTATION = (
331+
*ROLE_ENTITY_MUTATION,
332+
CacheNamespace.SYSTEM_USER_PROFILE,
333+
CacheNamespace.LOGIN_USER_INFO,
334+
*PERMISSION_MUTATION,
335+
)
336+
337+
ROLE_MUTATION = (
338+
*ROLE_PERMISSION_MUTATION,
339+
*DATA_SCOPE_MUTATION,
340+
)
341+
342+
USER_ENTITY_MUTATION = (
343+
CacheNamespace.SYSTEM_USER_LIST,
344+
CacheNamespace.SYSTEM_USER_DETAIL,
345+
CacheNamespace.SYSTEM_ROLE_ALLOCATED_USER_LIST,
346+
CacheNamespace.SYSTEM_ROLE_UNALLOCATED_USER_LIST,
347+
)
348+
349+
USER_PERMISSION_MUTATION = (
350+
*DATA_SCOPE_MUTATION,
351+
*PERMISSION_MUTATION,
352+
)
353+
354+
USER_INFO_MUTATION = (
355+
CacheNamespace.SYSTEM_USER_LIST,
356+
CacheNamespace.SYSTEM_USER_DETAIL,
357+
CacheNamespace.SYSTEM_USER_PROFILE,
358+
CacheNamespace.LOGIN_USER_INFO,
359+
)
360+
361+
LOGIN_SUCCESS_MUTATION = (
362+
CacheNamespace.SYSTEM_USER_LIST,
363+
CacheNamespace.LOGIN_USER_INFO,
364+
CacheNamespace.LOGIN_USER_ROUTERS,
365+
CacheNamespace.SYSTEM_USER_PROFILE,
366+
CacheNamespace.SYSTEM_USER_DETAIL,
367+
)
368+
369+
LOGOUT_MUTATION = (
370+
CacheNamespace.LOGIN_USER_INFO,
371+
CacheNamespace.LOGIN_USER_ROUTERS,
372+
)
373+
374+
CONFIG_MUTATION = (
375+
CacheNamespace.SYSTEM_CONFIG_LIST,
376+
CacheNamespace.SYSTEM_CONFIG_DETAIL,
377+
)
378+
379+
DICT_TYPE_MUTATION = (
380+
CacheNamespace.SYSTEM_DICT_TYPE_LIST,
381+
CacheNamespace.SYSTEM_DICT_TYPE_OPTIONS,
382+
CacheNamespace.SYSTEM_DICT_TYPE_DETAIL,
383+
CacheNamespace.SYSTEM_DICT_DATA_LIST,
384+
CacheNamespace.SYSTEM_DICT_DATA_DETAIL,
385+
)
386+
387+
DICT_DATA_MUTATION = (
388+
CacheNamespace.SYSTEM_DICT_DATA_LIST,
389+
CacheNamespace.SYSTEM_DICT_DATA_DETAIL,
390+
)
391+
392+
AI_MODEL_MUTATION = (
393+
CacheNamespace.AI_MODEL_LIST,
394+
CacheNamespace.AI_MODEL_ALL,
395+
CacheNamespace.AI_MODEL_DETAIL,
396+
)
397+
398+
AI_CHAT_CONFIG_MUTATION = (CacheNamespace.AI_CHAT_CONFIG,)
399+
400+
GEN_MUTATION = (
401+
CacheNamespace.TOOL_GEN_LIST,
402+
CacheNamespace.TOOL_GEN_DB_LIST,
403+
CacheNamespace.TOOL_GEN_DETAIL,
404+
CacheNamespace.TOOL_GEN_PREVIEW,
405+
)
406+
407+
146408
class MenuConstant:
147409
"""
148410
菜单常量

ruoyi-fastapi-backend/common/enums.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def remark(self) -> str | None:
4545
ACCESS_TOKEN = {'key': 'access_token', 'remark': '登录令牌信息'}
4646
SYS_DICT = {'key': 'sys_dict', 'remark': '数据字典'}
4747
SYS_CONFIG = {'key': 'sys_config', 'remark': '配置信息'}
48+
API_CACHE = {'key': 'api_cache', 'remark': '接口响应缓存'}
4849
CAPTCHA_CODES = {'key': 'captcha_codes', 'remark': '图片验证码'}
4950
ACCOUNT_LOCK = {'key': 'account_lock', 'remark': '用户锁定'}
5051
PASSWORD_ERROR_COUNT = {'key': 'password_error_count', 'remark': '密码错误次数'}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
from pydantic_validation_decorator import ValidateFields
77
from sqlalchemy.ext.asyncio import AsyncSession
88

9+
from common.annotation.cache_annotation import ApiCache, ApiCacheEvict
910
from common.annotation.log_annotation import Log
1011
from common.aspect.db_seesion import DBSessionDependency
1112
from common.aspect.interface_auth import UserInterfaceAuthDependency
1213
from common.aspect.pre_auth import CurrentUserDependency, PreAuthDependency
14+
from common.constant import CacheGroup, CacheNamespace
1315
from common.enums import BusinessType
1416
from common.router import APIRouterPro
1517
from common.vo import DataResponseModel, PageResponseModel, ResponseBaseModel
@@ -32,6 +34,7 @@
3234
response_model=PageResponseModel[ConfigModel],
3335
dependencies=[UserInterfaceAuthDependency('system:config:list')],
3436
)
37+
@ApiCache(namespace=CacheNamespace.SYSTEM_CONFIG_LIST)
3538
async def get_system_config_list(
3639
request: Request,
3740
config_page_query: Annotated[ConfigPageQueryModel, Query()],
@@ -52,6 +55,7 @@ async def get_system_config_list(
5255
dependencies=[UserInterfaceAuthDependency('system:config:add')],
5356
)
5457
@ValidateFields(validate_model='add_config')
58+
@ApiCacheEvict(namespaces=CacheGroup.CONFIG_MUTATION)
5559
@Log(title='参数管理', business_type=BusinessType.INSERT)
5660
async def add_system_config(
5761
request: Request,
@@ -77,6 +81,7 @@ async def add_system_config(
7781
dependencies=[UserInterfaceAuthDependency('system:config:edit')],
7882
)
7983
@ValidateFields(validate_model='edit_config')
84+
@ApiCacheEvict(namespaces=CacheGroup.CONFIG_MUTATION)
8085
@Log(title='参数管理', business_type=BusinessType.UPDATE)
8186
async def edit_system_config(
8287
request: Request,
@@ -117,6 +122,7 @@ async def refresh_system_config(
117122
response_model=ResponseBaseModel,
118123
dependencies=[UserInterfaceAuthDependency('system:config:remove')],
119124
)
125+
@ApiCacheEvict(namespaces=CacheGroup.CONFIG_MUTATION)
120126
@Log(title='参数管理', business_type=BusinessType.DELETE)
121127
async def delete_system_config(
122128
request: Request,
@@ -137,6 +143,7 @@ async def delete_system_config(
137143
response_model=DataResponseModel[ConfigModel],
138144
dependencies=[UserInterfaceAuthDependency('system:config:query')],
139145
)
146+
@ApiCache(namespace=CacheNamespace.SYSTEM_CONFIG_DETAIL)
140147
async def query_detail_system_config(
141148
request: Request,
142149
config_id: Annotated[int, Path(description='参数主键')],

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from sqlalchemy import ColumnElement
77
from sqlalchemy.ext.asyncio import AsyncSession
88

9+
from common.annotation.cache_annotation import ApiCache, ApiCacheEvict
910
from common.annotation.log_annotation import Log
1011
from common.aspect.data_scope import DataScopeDependency
1112
from common.aspect.db_seesion import DBSessionDependency
1213
from common.aspect.interface_auth import UserInterfaceAuthDependency
1314
from common.aspect.pre_auth import CurrentUserDependency, PreAuthDependency
15+
from common.constant import CacheGroup, CacheNamespace
1416
from common.enums import BusinessType
1517
from common.router import APIRouterPro
1618
from common.vo import DataResponseModel, ResponseBaseModel
@@ -33,6 +35,7 @@
3335
response_model=DataResponseModel[list[DeptModel]],
3436
dependencies=[UserInterfaceAuthDependency('system:dept:list')],
3537
)
38+
@ApiCache(namespace=CacheNamespace.SYSTEM_DEPT_EDIT_TREE)
3639
async def get_system_dept_tree_for_edit_option(
3740
request: Request,
3841
dept_id: Annotated[int, Path(description='部门id')],
@@ -53,6 +56,7 @@ async def get_system_dept_tree_for_edit_option(
5356
response_model=DataResponseModel[list[DeptModel]],
5457
dependencies=[UserInterfaceAuthDependency('system:dept:list')],
5558
)
59+
@ApiCache(namespace=CacheNamespace.SYSTEM_DEPT_LIST)
5660
async def get_system_dept_list(
5761
request: Request,
5862
dept_query: Annotated[DeptQueryModel, Query()],
@@ -73,6 +77,7 @@ async def get_system_dept_list(
7377
dependencies=[UserInterfaceAuthDependency('system:dept:add')],
7478
)
7579
@ValidateFields(validate_model='add_dept')
80+
@ApiCacheEvict(namespaces=CacheGroup.DATA_SCOPE_MUTATION)
7681
@Log(title='部门管理', business_type=BusinessType.INSERT)
7782
async def add_system_dept(
7883
request: Request,
@@ -98,6 +103,7 @@ async def add_system_dept(
98103
dependencies=[UserInterfaceAuthDependency('system:dept:edit')],
99104
)
100105
@ValidateFields(validate_model='edit_dept')
106+
@ApiCacheEvict(namespaces=CacheGroup.DATA_SCOPE_MUTATION)
101107
@Log(title='部门管理', business_type=BusinessType.UPDATE)
102108
async def edit_system_dept(
103109
request: Request,
@@ -123,6 +129,7 @@ async def edit_system_dept(
123129
response_model=ResponseBaseModel,
124130
dependencies=[UserInterfaceAuthDependency('system:dept:remove')],
125131
)
132+
@ApiCacheEvict(namespaces=CacheGroup.DATA_SCOPE_MUTATION)
126133
@Log(title='部门管理', business_type=BusinessType.DELETE)
127134
async def delete_system_dept(
128135
request: Request,
@@ -152,6 +159,7 @@ async def delete_system_dept(
152159
response_model=DataResponseModel[DeptModel],
153160
dependencies=[UserInterfaceAuthDependency('system:dept:query')],
154161
)
162+
@ApiCache(namespace=CacheNamespace.SYSTEM_DEPT_DETAIL)
155163
async def query_detail_system_dept(
156164
request: Request,
157165
dept_id: Annotated[int, Path(description='部门id')],

0 commit comments

Comments
 (0)