package com.ruoyi.template.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 模板模块的 MVC 配置:把 {@link TemplateAvailabilityInterceptor} 挂到 * 本模块的模板管理端点上({@code sys_config: template.enabled} 关闭时明确报错)。 * *

为什么逐个列路径,而不是 {@code /smartor/**} 前缀

* {@code /smartor/*} 下还有大量不属于模板的端点(服务子任务、档案、服务任务、 * 问卷任务实例、方案流程…)。用前缀会误伤它们 —— * 关闭模板模块不该让那些功能一起停摆。 *

* 判断标准是"这个端点管的是不是模板数据",而不是"它在不在本模块里"。 * 这一点与出入院模块 {@code InhospVisitWebConfig} 的取舍完全一致 * (那里也刻意不用 {@code /smartor/patinhosp/**} 前缀)。 * *

受保护清单

* 共 66 个 URL 前缀,覆盖 ruoyi-template 内全部模板控制器 * 以及刻意留在 smartor 的 3 个模板管理控制器 * ({@code SvyLibTemplateController} / {@code SvyTaskController} / * {@code SvyTaskTemplateController} 等 —— 它们的端点是模板管理,所以照样受开关管)。 * *

刻意不受管的

* {@code IvrTaskVisitResultController} / {@code IvrTasksmsController} / * {@code IvrTaskcallrecordController} —— 它们是**任务执行记录**(运行时实例), * 已按职责移出本模块;关掉"模板"不该让"任务执行记录查询"停摆。 * *

生成方式

* 本文件由 {@code sql/_probe/gen_template_guarded_urls.py} + 本脚本从**实际控制器**抽取, * 不是手抄的 —— 手抄 66 个路径必然会漏,而漏了不会报错,只会让那个端点静默不受开关管。 */ @Configuration public class TemplateWebConfig implements WebMvcConfigurer { @Autowired private TemplateAvailabilityInterceptor templateAvailabilityInterceptor; /** * 供测试/非 Spring 环境直接构造 */ public TemplateWebConfig() { } public TemplateWebConfig(TemplateAvailabilityInterceptor interceptor) { this.templateAvailabilityInterceptor = interceptor; } /** * 本模块"关闭即明确报错"的端点(供校验脚本/测试断言) */ public static List guardedPathPatterns() { return new ArrayList<>(Arrays.asList( "/base/tag/**", // BaseTagController "/smartor/assort/**", // IvrLibaTargetAssortController "/smartor/category/**", // IvrLibaExtemplateCategoryController "/smartor/extemplate/**", // IvrLibaExtemplateController "/smartor/extemplatescript/**", // IvrLibaExtemplatescriptController "/smartor/heLibraryAssort/**", // HeLibraryAssortController "/smartor/heLibraryTag/**", // HeLibraryTagController "/smartor/hecategory/**", // HeCategoryController "/smartor/helibrary/**", // HeLocallibraryController "/smartor/ivrTaskTemplate/**", // IvrTaskTemplateController "/smartor/library/**", // HeLibraryController "/smartor/optionwjx/**", // SvyLibTemplateTargetoptionWjxController "/smartor/outicd10/**", // Icd10AssociationController "/smartor/schemeautofinshrule/**", // SchemeAutofinshruleController "/smartor/schemecalldetail/**", // SchemeTaskrecordCalldetailController "/smartor/schemecategory/**", // SchemeCategoryController "/smartor/schemelibrary/**", // SchemeLocallibraryController "/smartor/schemeplan/**", // SchemePlanController "/smartor/schemetask/**", // SchemeTaskController "/smartor/schemetaskconfig/**", // SchemeTaskconfigController "/smartor/schemetaskrecord/**", // SchemeTaskrecordController "/smartor/schemetaskrepeatconfig/**", // SchemeTaskrepeatconfigController "/smartor/schemetriggerrule/**", // SchemeTriggerruleController "/smartor/schemetriggerscene/**", // SchemeTriggersceneController "/smartor/script/**", // IvrLibaScriptController "/smartor/scriptassort/**", // IvrLibaScriptAssortController "/smartor/scripttag/**", // IvrLibaScriptTagController "/smartor/scripttarget/**", // IvrLibaScriptTargetController "/smartor/scripttargetoption/**", // IvrLibaScriptTargetoptionController "/smartor/srcriptwjx/**", // SvyLibTemplateScriptWjxController "/smartor/svyLibScriptCategory/**", // SvyLibScriptCategoryController "/smartor/svyLibScriptTag/**", // SvyLibScriptTagController "/smartor/svyLibTemplate/**", // SvyLibTemplateController "/smartor/svyLibTemplateCategory/**", // SvyLibTemplateCategoryController "/smartor/svyLibTemplateTag/**", // SvyLibTemplateTagController "/smartor/svyTaskScript/**", // SvyTaskScriptController "/smartor/svyTaskTargetOption/**", // SvyTaskTemplateTargetoptionController "/smartor/svyTaskTempScript/**", // SvyTaskTemplateScriptController "/smartor/svycategory/**", // SvyCategoryController "/smartor/svyexception/**", // SvyLibExceptionController "/smartor/svyfinish/**", // SvyFinishController "/smartor/svyfinishoption/**", // SvyFinishoptionController "/smartor/svyfinishtopic/**", // SvyFinishtopicController "/smartor/svyresult/**", // SvyLibResultController "/smartor/svyscript/**", // SvyLibScriptController "/smartor/svyscriptoption/**", // SvyTaskScriptoptionController "/smartor/svytargetoption/**", // SvyLibTemplateTargetoptionController "/smartor/svytask/**", // SvyTaskController "/smartor/svytemplateTask/**", // SvyTaskTemplateController "/smartor/svytemplatescript/**", // SvyLibTemplateScriptController "/smartor/svytscroption/**", // SvyLibScriptOptionController "/smartor/tag/**", // IvrLibaTargetTagController "/smartor/target/**", // IvrLibaTargetController "/smartor/targetoption/**", // IvrLibaTargetoptionController "/smartor/taskTemplateScript/**", // IvrTaskTemplateScriptController "/smartor/td/**", // TemplateDeptController "/smartor/template/**", // IvrLibaTemplateController "/smartor/templateassort/**", // IvrLibaTemplateAssortController "/smartor/templatescript/**", // IvrLibaTemplateScriptController "/smartor/templatetag/**", // IvrLibaTemplateTagController "/smartor/templatetargetoption/**", // IvrLibaTemplateTargetoptionController "/smartor/templatewjx/**", // SvyLibTemplateWjxController "/system/answer/**", // SvyTaskAnswerController "/system/tagcategory/**", // BaseTagcategoryController "/system/taskTemplateTargetoption/**", // IvrTaskTemplateTargetoptionController "/system/topic/**" // SvyTopicController )); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(templateAvailabilityInterceptor) .addPathPatterns(guardedPathPatterns()) // 拦截器很轻(只读一个 boolean),order 给个小值让它在业务拦截器之前执行 .order(-100); } }