+ * education 系统,使用 1-005-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+ // ========== 通用模块 1-005-001-000 ==========
+ ErrorCode EDUCATION_DISABLED = new ErrorCode(1_005_001_000, "教育模块未启用,请联系管理员");
+
+}
diff --git a/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/config/EducationWebConfiguration.java b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/config/EducationWebConfiguration.java
new file mode 100644
index 00000000..60c9faf8
--- /dev/null
+++ b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/config/EducationWebConfiguration.java
@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.education.framework.web.config;
+
+import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
+import cn.iocoder.yudao.module.education.config.EducationProperties;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * education 模块的 web 组件的 Configuration
+ *
+ * @author 恭学教育
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableConfigurationProperties(EducationProperties.class)
+public class EducationWebConfiguration {
+
+ /**
+ * education 模块的 API 分组
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "yudao.education", name = "enabled", havingValue = "true")
+ public GroupedOpenApi educationGroupedOpenApi() {
+ return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("education");
+ }
+
+}
diff --git a/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/package-info.java b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/package-info.java
new file mode 100644
index 00000000..c18a0867
--- /dev/null
+++ b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/framework/web/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 属于 education 模块的 web 封装
+ */
+package cn.iocoder.yudao.module.education.framework.web;
diff --git a/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/package-info.java b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/package-info.java
new file mode 100644
index 00000000..e63314d3
--- /dev/null
+++ b/yudao-module-education/src/main/java/cn/iocoder/yudao/module/education/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * education 模块,我们放教育业务。
+ * 例如说:课程、练习、题库、考试等等
+ *
+ * 1. Controller URL:以 /education/ 开头,避免和其它 Module 冲突
+ * 2. DataObject 表名:以 education_ 开头,方便在数据库中区分
+ */
+package cn.iocoder.yudao.module.education;
diff --git a/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/config/EducationPropertiesTest.java b/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/config/EducationPropertiesTest.java
new file mode 100644
index 00000000..0c84f36d
--- /dev/null
+++ b/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/config/EducationPropertiesTest.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.education.config;
+
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.ActiveProfiles;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link EducationProperties} 的单元测试
+ *
+ * @author 恭学教育
+ */
+@SpringBootTest(classes = EducationPropertiesTest.Config.class,
+ properties = {
+ "yudao.education.enabled=true",
+ "yudao.education.version=2.0.0-test"
+ })
+@ActiveProfiles("unit-test")
+public class EducationPropertiesTest {
+
+ @Configuration
+ @EnableConfigurationProperties(EducationProperties.class)
+ static class Config {
+ }
+
+ @Resource
+ private EducationProperties properties;
+
+ @Test
+ public void testEnabled() {
+ assertTrue(properties.isEnabled(), "教育模块应启用");
+ }
+
+ @Test
+ public void testVersion() {
+ assertEquals("2.0.0-test", properties.getVersion(), "版本号应匹配");
+ }
+
+ @Test
+ public void testDefaults() {
+ EducationProperties defaults = new EducationProperties();
+ assertFalse(defaults.isEnabled(), "默认应禁用");
+ assertEquals("1.0.0", defaults.getVersion(), "默认版本应为 1.0.0");
+ }
+
+}
diff --git a/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/controller/admin/EducationCapabilityControllerTest.java b/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/controller/admin/EducationCapabilityControllerTest.java
new file mode 100644
index 00000000..78f07306
--- /dev/null
+++ b/yudao-module-education/src/test/java/cn/iocoder/yudao/module/education/controller/admin/EducationCapabilityControllerTest.java
@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.education.controller.admin;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.education.config.EducationProperties;
+import cn.iocoder.yudao.module.education.controller.admin.vo.EducationCapabilityRespVO;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.ActiveProfiles;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link EducationCapabilityController} 的单元测试
+ *
+ * @author 恭学教育
+ */
+@SpringBootTest(classes = EducationCapabilityControllerTest.Config.class,
+ properties = {
+ "yudao.education.enabled=true",
+ "yudao.education.version=1.0.0-test"
+ },
+ webEnvironment = SpringBootTest.WebEnvironment.NONE)
+@ActiveProfiles("unit-test")
+public class EducationCapabilityControllerTest {
+
+ @Configuration
+ @EnableConfigurationProperties(EducationProperties.class)
+ @Import(EducationCapabilityController.class)
+ static class Config {
+ }
+
+ @Resource
+ private EducationCapabilityController controller;
+
+ @Test
+ public void testGetCapability() {
+ CommonResult