diff --git a/backend/ruoyi-admin/.flattened-pom.xml b/backend/ruoyi-admin/.flattened-pom.xml
index c4b8b09..f8eb518 100644
--- a/backend/ruoyi-admin/.flattened-pom.xml
+++ b/backend/ruoyi-admin/.flattened-pom.xml
@@ -52,6 +52,11 @@
org.dromara
ruoyi-workflow
+
+ org.dromara
+ pangu-business
+ ${revision}
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/backend/ruoyi-admin/pom.xml b/backend/ruoyi-admin/pom.xml
index 9e97804..b229c0c 100644
--- a/backend/ruoyi-admin/pom.xml
+++ b/backend/ruoyi-admin/pom.xml
@@ -93,6 +93,13 @@
ruoyi-workflow
+
+
+ org.dromara
+ pangu-business
+ ${revision}
+
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/backend/ruoyi-modules/.flattened-pom.xml b/backend/ruoyi-modules/.flattened-pom.xml
index f2c70af..25801b2 100644
--- a/backend/ruoyi-modules/.flattened-pom.xml
+++ b/backend/ruoyi-modules/.flattened-pom.xml
@@ -18,5 +18,6 @@
ruoyi-job
ruoyi-system
ruoyi-workflow
+ pangu-business
diff --git a/backend/ruoyi-modules/pangu-business/.flattened-pom.xml b/backend/ruoyi-modules/pangu-business/.flattened-pom.xml
new file mode 100644
index 0000000..28e591e
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/.flattened-pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+
+ org.dromara
+ ruoyi-modules
+ 5.5.3
+
+ org.dromara
+ pangu-business
+ 5.5.3
+ 盘古业务模块 - 包含学校、会员、学生、应用管理等业务功能
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+ org.dromara
+ ruoyi-common-excel
+
+
+ org.dromara
+ ruoyi-common-translation
+
+
+ org.dromara
+ ruoyi-system
+
+
+
diff --git a/backend/ruoyi-modules/pangu-business/pom.xml b/backend/ruoyi-modules/pangu-business/pom.xml
new file mode 100644
index 0000000..110d9de
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/pom.xml
@@ -0,0 +1,56 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+
+ 4.0.0
+
+ pangu-business
+
+
+ 盘古业务模块 - 包含学校、会员、学生、应用管理等业务功能
+
+
+
+
+
+ org.dromara
+ ruoyi-common-security
+
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+
+ org.dromara
+ ruoyi-common-excel
+
+
+
+
+ org.dromara
+ ruoyi-common-translation
+
+
+
+
+ org.dromara
+ ruoyi-system
+
+
+
+
diff --git a/backend/ruoyi-modules/pangu-business/sql/pangu_menu.sql b/backend/ruoyi-modules/pangu-business/sql/pangu_menu.sql
new file mode 100644
index 0000000..6cae5ff
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/sql/pangu_menu.sql
@@ -0,0 +1,89 @@
+-- ============================================================
+-- 盘古用户平台 - 业务菜单数据(适配 RuoYi-Vue-Plus 5.x)
+-- 作者:湖北新华业务中台研发团队
+-- 创建时间:2026-02-02
+-- ============================================================
+
+USE `pguser-db`;
+
+-- 业务管理一级菜单
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2000, '业务管理', 0, 5, 'business', NULL, '', 1, 0, 'M', '0', '0', '', 'guide', 103, 1, NOW(), NULL, NULL, '业务管理目录');
+
+-- ===================== 基础数据管理 =====================
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2100, '基础数据', 2000, 1, 'base', NULL, '', 1, 0, 'M', '0', '0', '', 'dict', 103, 1, NOW(), NULL, NULL, '基础数据管理');
+
+-- 年级管理
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2101, '年级管理', 2100, 1, 'grade', 'business/base/grade/index', '', 1, 0, 'C', '0', '0', 'business:grade:list', 'education', 103, 1, NOW(), NULL, NULL, '年级管理菜单');
+INSERT INTO `sys_menu` VALUES (2102, '年级查询', 2101, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:grade:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2103, '年级新增', 2101, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:grade:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2104, '年级修改', 2101, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:grade:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2105, '年级删除', 2101, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:grade:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2106, '年级导出', 2101, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:grade:export', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- 班级管理
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2111, '班级管理', 2100, 2, 'class', 'business/base/class/index', '', 1, 0, 'C', '0', '0', 'business:class:list', 'peoples', 103, 1, NOW(), NULL, NULL, '班级管理菜单');
+INSERT INTO `sys_menu` VALUES (2112, '班级查询', 2111, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:class:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2113, '班级新增', 2111, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:class:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2114, '班级修改', 2111, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:class:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2115, '班级删除', 2111, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:class:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2116, '班级导出', 2111, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:class:export', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- 学科管理
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2121, '学科管理', 2100, 3, 'subject', 'business/base/subject/index', '', 1, 0, 'C', '0', '0', 'business:subject:list', 'skill', 103, 1, NOW(), NULL, NULL, '学科管理菜单');
+INSERT INTO `sys_menu` VALUES (2122, '学科查询', 2121, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:subject:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2123, '学科新增', 2121, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:subject:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2124, '学科修改', 2121, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:subject:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2125, '学科删除', 2121, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:subject:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2126, '学科导出', 2121, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:subject:export', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- 区域管理
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2131, '区域管理', 2100, 4, 'region', 'business/base/region/index', '', 1, 0, 'C', '0', '0', 'business:region:list', 'tree', 103, 1, NOW(), NULL, NULL, '区域管理菜单');
+INSERT INTO `sys_menu` VALUES (2132, '区域查询', 2131, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:region:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2133, '区域新增', 2131, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:region:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2134, '区域修改', 2131, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:region:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2135, '区域删除', 2131, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:region:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2136, '区域导出', 2131, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:region:export', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- ===================== 学校管理 =====================
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2200, '学校管理', 2000, 2, 'school', 'business/school/index', '', 1, 0, 'C', '0', '0', 'business:school:list', 'education', 103, 1, NOW(), NULL, NULL, '学校管理菜单');
+INSERT INTO `sys_menu` VALUES (2201, '学校查询', 2200, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:school:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2202, '学校新增', 2200, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:school:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2203, '学校修改', 2200, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:school:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2204, '学校删除', 2200, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:school:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2205, '学校导出', 2200, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:school:export', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- ===================== 会员管理 =====================
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2300, '会员管理', 2000, 3, 'member', 'business/member/index', '', 1, 0, 'C', '0', '0', 'business:member:list', 'user', 103, 1, NOW(), NULL, NULL, '会员管理菜单');
+INSERT INTO `sys_menu` VALUES (2301, '会员查询', 2300, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:member:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2302, '会员新增', 2300, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:member:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2303, '会员修改', 2300, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:member:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2304, '会员删除', 2300, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:member:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2305, '会员导出', 2300, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:member:export', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2306, '会员导入', 2300, 6, '', '', '', 1, 0, 'F', '0', '0', 'business:member:import', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- ===================== 学生管理 =====================
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2400, '学生管理', 2000, 4, 'student', 'business/student/index', '', 1, 0, 'C', '0', '0', 'business:student:list', 'peoples', 103, 1, NOW(), NULL, NULL, '学生管理菜单');
+INSERT INTO `sys_menu` VALUES (2401, '学生查询', 2400, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:student:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2402, '学生新增', 2400, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:student:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2403, '学生修改', 2400, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:student:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2404, '学生删除', 2400, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:student:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2405, '学生导出', 2400, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:student:export', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2406, '学生导入', 2400, 6, '', '', '', 1, 0, 'F', '0', '0', 'business:student:import', '#', 103, 1, NOW(), NULL, NULL, '');
+
+-- ===================== 应用管理 =====================
+INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
+VALUES (2500, '应用管理', 2000, 5, 'application', 'business/application/index', '', 1, 0, 'C', '0', '0', 'business:application:list', 'component', 103, 1, NOW(), NULL, NULL, '应用管理菜单');
+INSERT INTO `sys_menu` VALUES (2501, '应用查询', 2500, 1, '', '', '', 1, 0, 'F', '0', '0', 'business:application:query', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2502, '应用新增', 2500, 2, '', '', '', 1, 0, 'F', '0', '0', 'business:application:add', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2503, '应用修改', 2500, 3, '', '', '', 1, 0, 'F', '0', '0', 'business:application:edit', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2504, '应用删除', 2500, 4, '', '', '', 1, 0, 'F', '0', '0', 'business:application:remove', '#', 103, 1, NOW(), NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (2505, 'API授权', 2500, 5, '', '', '', 1, 0, 'F', '0', '0', 'business:application:api', '#', 103, 1, NOW(), NULL, NULL, '');
diff --git a/backend/ruoyi-modules/pangu-business/sql/pangu_tables.sql b/backend/ruoyi-modules/pangu-business/sql/pangu_tables.sql
new file mode 100644
index 0000000..648281d
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/sql/pangu_tables.sql
@@ -0,0 +1,328 @@
+-- ============================================================
+-- 盘古用户平台 - 业务模块建表脚本(适配 RuoYi-Vue-Plus 5.x)
+-- 作者:湖北新华业务中台研发团队
+-- 创建时间:2026-02-02
+-- ============================================================
+
+USE `pguser-db`;
+
+-- ============================================================
+-- 1. 年级字典表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_grade`;
+CREATE TABLE `pg_grade` (
+ `grade_id` bigint NOT NULL COMMENT '年级ID',
+ `grade_code` varchar(32) NOT NULL COMMENT '年级编码',
+ `grade_name` varchar(50) NOT NULL COMMENT '年级名称',
+ `order_num` int DEFAULT 0 COMMENT '显示顺序',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`grade_id`),
+ UNIQUE KEY `uk_grade_code` (`grade_code`)
+) ENGINE=InnoDB COMMENT='年级字典表';
+
+-- 年级初始化数据
+INSERT INTO `pg_grade` VALUES
+(1, 'GRD001', '一年级', 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(2, 'GRD002', '二年级', 2, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(3, 'GRD003', '三年级', 3, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(4, 'GRD004', '四年级', 4, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(5, 'GRD005', '五年级', 5, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(6, 'GRD006', '六年级', 6, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(7, 'GRD007', '七年级', 7, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(8, 'GRD008', '八年级', 8, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(9, 'GRD009', '九年级', 9, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(10, 'GRD010', '高一', 10, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(11, 'GRD011', '高二', 11, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(12, 'GRD012', '高三', 12, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL);
+
+-- ============================================================
+-- 2. 班级字典表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_class`;
+CREATE TABLE `pg_class` (
+ `class_id` bigint NOT NULL COMMENT '班级ID',
+ `class_code` varchar(32) NOT NULL COMMENT '班级编码',
+ `class_name` varchar(50) NOT NULL COMMENT '班级名称',
+ `order_num` int DEFAULT 0 COMMENT '显示顺序',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`class_id`),
+ UNIQUE KEY `uk_class_code` (`class_code`)
+) ENGINE=InnoDB COMMENT='班级字典表';
+
+-- 班级初始化数据
+INSERT INTO `pg_class` VALUES
+(1, 'CLS001', '1班', 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(2, 'CLS002', '2班', 2, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(3, 'CLS003', '3班', 3, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(4, 'CLS004', '4班', 4, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(5, 'CLS005', '5班', 5, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(6, 'CLS006', '6班', 6, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(7, 'CLS007', '7班', 7, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(8, 'CLS008', '8班', 8, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(9, 'CLS009', '9班', 9, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(10, 'CLS010', '10班', 10, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL);
+
+-- ============================================================
+-- 3. 学科表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_subject`;
+CREATE TABLE `pg_subject` (
+ `subject_id` bigint NOT NULL COMMENT '学科ID',
+ `subject_code` varchar(32) NOT NULL COMMENT '学科编码',
+ `subject_name` varchar(50) NOT NULL COMMENT '学科名称',
+ `order_num` int DEFAULT 0 COMMENT '显示顺序',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`subject_id`),
+ UNIQUE KEY `uk_subject_code` (`subject_code`)
+) ENGINE=InnoDB COMMENT='学科表';
+
+-- 学科初始化数据
+INSERT INTO `pg_subject` VALUES
+(1, 'SUB001', '语文', 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(2, 'SUB002', '数学', 2, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(3, 'SUB003', '英语', 3, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(4, 'SUB004', '物理', 4, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(5, 'SUB005', '化学', 5, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(6, 'SUB006', '生物', 6, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(7, 'SUB007', '历史', 7, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(8, 'SUB008', '地理', 8, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL),
+(9, 'SUB009', '政治', 9, '0', '000000', 103, 1, NOW(), 1, NOW(), '0', NULL);
+
+-- ============================================================
+-- 4. 区域表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_region`;
+CREATE TABLE `pg_region` (
+ `region_id` bigint NOT NULL COMMENT '区域ID',
+ `parent_id` bigint DEFAULT 0 COMMENT '父区域ID',
+ `ancestors` varchar(500) DEFAULT '' COMMENT '祖级列表',
+ `region_name` varchar(100) NOT NULL COMMENT '区域名称',
+ `region_code` varchar(32) DEFAULT NULL COMMENT '区域编码',
+ `level` int DEFAULT 1 COMMENT '层级(1省 2市 3区县)',
+ `order_num` int DEFAULT 0 COMMENT '显示顺序',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ PRIMARY KEY (`region_id`)
+) ENGINE=InnoDB COMMENT='区域表';
+
+-- 区域初始化数据(湖北省示例)
+INSERT INTO `pg_region` VALUES
+(420000, 0, '0', '湖北省', '420000', 1, 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0'),
+(420100, 420000, '0,420000', '武汉市', '420100', 2, 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0'),
+(420102, 420100, '0,420000,420100', '江岸区', '420102', 3, 1, '0', '000000', 103, 1, NOW(), 1, NOW(), '0'),
+(420103, 420100, '0,420000,420100', '江汉区', '420103', 3, 2, '0', '000000', 103, 1, NOW(), 1, NOW(), '0'),
+(420104, 420100, '0,420000,420100', '硚口区', '420104', 3, 3, '0', '000000', 103, 1, NOW(), 1, NOW(), '0');
+
+-- ============================================================
+-- 5. 学校表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_school`;
+CREATE TABLE `pg_school` (
+ `school_id` bigint NOT NULL COMMENT '学校ID',
+ `school_code` varchar(32) NOT NULL COMMENT '学校编码',
+ `school_name` varchar(100) NOT NULL COMMENT '学校名称',
+ `school_type` char(1) DEFAULT '1' COMMENT '学校类型(1小学 2初中 3高中 4完全中学)',
+ `region_id` bigint DEFAULT NULL COMMENT '所属区域ID',
+ `region_path` varchar(500) DEFAULT NULL COMMENT '区域路径',
+ `address` varchar(500) DEFAULT NULL COMMENT '详细地址',
+ `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
+ `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`school_id`),
+ UNIQUE KEY `uk_school_code` (`school_code`)
+) ENGINE=InnoDB COMMENT='学校表';
+
+-- ============================================================
+-- 6. 学校年级关联表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_school_grade`;
+CREATE TABLE `pg_school_grade` (
+ `id` bigint NOT NULL COMMENT '主键',
+ `school_id` bigint NOT NULL COMMENT '学校ID',
+ `grade_id` bigint NOT NULL COMMENT '年级ID',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_school_grade` (`school_id`, `grade_id`)
+) ENGINE=InnoDB COMMENT='学校年级关联表';
+
+-- ============================================================
+-- 7. 学校班级表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_school_class`;
+CREATE TABLE `pg_school_class` (
+ `id` bigint NOT NULL COMMENT '主键',
+ `school_id` bigint NOT NULL COMMENT '学校ID',
+ `school_grade_id` bigint NOT NULL COMMENT '学校年级ID',
+ `class_id` bigint NOT NULL COMMENT '班级ID',
+ `class_alias` varchar(50) DEFAULT NULL COMMENT '班级别名',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`),
+ KEY `idx_school_grade` (`school_id`, `school_grade_id`)
+) ENGINE=InnoDB COMMENT='学校班级表';
+
+-- ============================================================
+-- 8. 会员表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_member`;
+CREATE TABLE `pg_member` (
+ `member_id` bigint NOT NULL COMMENT '会员ID',
+ `member_code` varchar(32) NOT NULL COMMENT '会员编码',
+ `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
+ `password` varchar(100) DEFAULT NULL COMMENT '密码',
+ `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
+ `avatar` varchar(500) DEFAULT NULL COMMENT '头像',
+ `gender` char(1) DEFAULT '0' COMMENT '性别(0未知 1男 2女)',
+ `birthday` date DEFAULT NULL COMMENT '生日',
+ `identity_type` char(1) DEFAULT '1' COMMENT '身份类型(1家长 2教师)',
+ `open_id` varchar(100) DEFAULT NULL COMMENT '微信OpenID',
+ `union_id` varchar(100) DEFAULT NULL COMMENT '微信UnionID',
+ `region_id` bigint DEFAULT NULL COMMENT '区域ID',
+ `school_id` bigint DEFAULT NULL COMMENT '学校ID(教师用)',
+ `school_grade_id` bigint DEFAULT NULL COMMENT '年级ID(教师用)',
+ `school_class_id` bigint DEFAULT NULL COMMENT '班级ID(教师用)',
+ `register_source` char(1) DEFAULT '1' COMMENT '注册来源(1小程序 2H5 3后台 4导入)',
+ `register_time` datetime DEFAULT NULL COMMENT '注册时间',
+ `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
+ `last_login_ip` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
+ `login_count` int DEFAULT 0 COMMENT '登录次数',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`member_id`),
+ UNIQUE KEY `uk_member_code` (`member_code`),
+ KEY `idx_phone` (`phone`),
+ KEY `idx_open_id` (`open_id`)
+) ENGINE=InnoDB COMMENT='会员表';
+
+-- ============================================================
+-- 9. 学生表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_student`;
+CREATE TABLE `pg_student` (
+ `student_id` bigint NOT NULL COMMENT '学生ID',
+ `student_name` varchar(50) NOT NULL COMMENT '学生姓名',
+ `student_no` varchar(32) DEFAULT NULL COMMENT '学号',
+ `gender` char(1) DEFAULT '0' COMMENT '性别(0未知 1男 2女)',
+ `birthday` date DEFAULT NULL COMMENT '生日',
+ `region_id` bigint DEFAULT NULL COMMENT '区域ID',
+ `region_path` varchar(500) DEFAULT NULL COMMENT '区域路径',
+ `school_id` bigint DEFAULT NULL COMMENT '学校ID',
+ `school_grade_id` bigint DEFAULT NULL COMMENT '学校年级ID',
+ `school_class_id` bigint DEFAULT NULL COMMENT '学校班级ID',
+ `subject_id` bigint DEFAULT NULL COMMENT '学科ID',
+ `member_id` bigint DEFAULT NULL COMMENT '绑定的会员ID',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`student_id`),
+ KEY `idx_student_no` (`student_no`),
+ KEY `idx_school` (`school_id`, `school_grade_id`, `school_class_id`)
+) ENGINE=InnoDB COMMENT='学生表';
+
+-- ============================================================
+-- 10. 应用表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_application`;
+CREATE TABLE `pg_application` (
+ `app_id` bigint NOT NULL COMMENT '应用ID',
+ `app_code` varchar(32) NOT NULL COMMENT '应用编码',
+ `app_name` varchar(100) NOT NULL COMMENT '应用名称',
+ `app_secret` varchar(100) NOT NULL COMMENT '应用密钥',
+ `contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
+ `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint DEFAULT NULL COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` bigint DEFAULT NULL COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0存在 1删除)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ PRIMARY KEY (`app_id`),
+ UNIQUE KEY `uk_app_code` (`app_code`)
+) ENGINE=InnoDB COMMENT='第三方应用表';
+
+-- ============================================================
+-- 11. API接口字典表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_api_dict`;
+CREATE TABLE `pg_api_dict` (
+ `api_id` bigint NOT NULL COMMENT 'API ID',
+ `api_code` varchar(50) NOT NULL COMMENT 'API编码',
+ `api_name` varchar(100) NOT NULL COMMENT 'API名称',
+ `api_path` varchar(200) NOT NULL COMMENT 'API路径',
+ `api_method` varchar(10) DEFAULT 'GET' COMMENT '请求方法',
+ `api_desc` varchar(500) DEFAULT NULL COMMENT 'API描述',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `order_num` int DEFAULT 0 COMMENT '排序',
+ PRIMARY KEY (`api_id`),
+ UNIQUE KEY `uk_api_code` (`api_code`)
+) ENGINE=InnoDB COMMENT='API接口字典表';
+
+-- ============================================================
+-- 12. 应用API授权表
+-- ============================================================
+DROP TABLE IF EXISTS `pg_app_api`;
+CREATE TABLE `pg_app_api` (
+ `id` bigint NOT NULL COMMENT '主键',
+ `app_id` bigint NOT NULL COMMENT '应用ID',
+ `api_id` bigint NOT NULL COMMENT 'API ID',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_app_api` (`app_id`, `api_id`)
+) ENGINE=InnoDB COMMENT='应用API授权表';
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java
new file mode 100644
index 0000000..0f5f475
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/controller/PgApplicationController.java
@@ -0,0 +1,61 @@
+package org.dromara.pangu.application.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.application.domain.PgApplication;
+import org.dromara.pangu.application.service.IPgApplicationService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 第三方应用管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/application")
+public class PgApplicationController extends BaseController {
+
+ private final IPgApplicationService applicationService;
+
+ @SaCheckPermission("business:application:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgApplication app, PageQuery pageQuery) {
+ return applicationService.selectPageList(app, pageQuery);
+ }
+
+ @SaCheckPermission("business:application:query")
+ @GetMapping("/{appId}")
+ public R getInfo(@PathVariable Long appId) {
+ return R.ok(applicationService.selectById(appId));
+ }
+
+ @SaCheckPermission("business:application:add")
+ @Log(title = "应用管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgApplication app) {
+ return toAjax(applicationService.insert(app));
+ }
+
+ @SaCheckPermission("business:application:edit")
+ @Log(title = "应用管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgApplication app) {
+ return toAjax(applicationService.update(app));
+ }
+
+ @SaCheckPermission("business:application:remove")
+ @Log(title = "应用管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{appIds}")
+ public R remove(@PathVariable Long[] appIds) {
+ return toAjax(applicationService.deleteByIds(appIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApiDict.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApiDict.java
new file mode 100644
index 0000000..8806d23
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApiDict.java
@@ -0,0 +1,35 @@
+package org.dromara.pangu.application.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * API接口字典表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@TableName("pg_api_dict")
+public class PgApiDict implements Serializable {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long apiId;
+
+ private String apiCode;
+
+ private String apiName;
+
+ private String apiPath;
+
+ private String apiMethod;
+
+ private String apiDesc;
+
+ private String status;
+
+ private Integer orderNum;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgAppApi.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgAppApi.java
new file mode 100644
index 0000000..3832ccb
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgAppApi.java
@@ -0,0 +1,28 @@
+package org.dromara.pangu.application.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 应用API授权表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@TableName("pg_app_api")
+public class PgAppApi implements Serializable {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ private Long appId;
+
+ private Long apiId;
+
+ private Date createTime;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java
new file mode 100644
index 0000000..d2a6ee9
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/domain/PgApplication.java
@@ -0,0 +1,42 @@
+package org.dromara.pangu.application.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 第三方应用表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_application")
+public class PgApplication extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long appId;
+
+ private String appCode;
+
+ private String appName;
+
+ private String appSecret;
+
+ private String contactPerson;
+
+ private String contactPhone;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApiDictMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApiDictMapper.java
new file mode 100644
index 0000000..4739cd0
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApiDictMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.application.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.application.domain.PgApiDict;
+
+/**
+ * API接口字典 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgApiDictMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java
new file mode 100644
index 0000000..e76de7f
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgAppApiMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.application.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.application.domain.PgAppApi;
+
+/**
+ * 应用API授权 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgAppApiMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApplicationMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApplicationMapper.java
new file mode 100644
index 0000000..38e6b71
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/mapper/PgApplicationMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.application.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.application.domain.PgApplication;
+
+/**
+ * 第三方应用 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgApplicationMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java
new file mode 100644
index 0000000..284ae5d
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/IPgApplicationService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.application.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.application.domain.PgApplication;
+
+import java.util.List;
+
+/**
+ * 第三方应用 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgApplicationService {
+ TableDataInfo selectPageList(PgApplication app, PageQuery pageQuery);
+ List selectList(PgApplication app);
+ PgApplication selectById(Long appId);
+ int insert(PgApplication app);
+ int update(PgApplication app);
+ int deleteByIds(Long[] appIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java
new file mode 100644
index 0000000..e49b785
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/application/service/impl/PgApplicationServiceImpl.java
@@ -0,0 +1,67 @@
+package org.dromara.pangu.application.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.application.domain.PgApplication;
+import org.dromara.pangu.application.mapper.PgApplicationMapper;
+import org.dromara.pangu.application.service.IPgApplicationService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 第三方应用 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgApplicationServiceImpl implements IPgApplicationService {
+
+ private final PgApplicationMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgApplication app, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(app);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgApplication app) {
+ return baseMapper.selectList(buildQueryWrapper(app));
+ }
+
+ @Override
+ public PgApplication selectById(Long appId) {
+ return baseMapper.selectById(appId);
+ }
+
+ @Override
+ public int insert(PgApplication app) {
+ return baseMapper.insert(app);
+ }
+
+ @Override
+ public int update(PgApplication app) {
+ return baseMapper.updateById(app);
+ }
+
+ @Override
+ public int deleteByIds(Long[] appIds) {
+ return baseMapper.deleteByIds(Arrays.asList(appIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgApplication app) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(app.getAppName()), PgApplication::getAppName, app.getAppName());
+ lqw.eq(StrUtil.isNotBlank(app.getStatus()), PgApplication::getStatus, app.getStatus());
+ lqw.orderByDesc(PgApplication::getCreateTime);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgClassController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgClassController.java
new file mode 100644
index 0000000..7f3b71d
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgClassController.java
@@ -0,0 +1,68 @@
+package org.dromara.pangu.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.base.domain.PgClass;
+import org.dromara.pangu.base.service.IPgClassService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 班级管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/class")
+public class PgClassController extends BaseController {
+
+ private final IPgClassService classService;
+
+ @SaCheckPermission("business:class:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgClass pgClass, PageQuery pageQuery) {
+ return classService.selectPageList(pgClass, pageQuery);
+ }
+
+ @GetMapping("/listAll")
+ public R> listAll(PgClass pgClass) {
+ return R.ok(classService.selectList(pgClass));
+ }
+
+ @SaCheckPermission("business:class:query")
+ @GetMapping("/{classId}")
+ public R getInfo(@PathVariable Long classId) {
+ return R.ok(classService.selectById(classId));
+ }
+
+ @SaCheckPermission("business:class:add")
+ @Log(title = "班级管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgClass pgClass) {
+ return toAjax(classService.insert(pgClass));
+ }
+
+ @SaCheckPermission("business:class:edit")
+ @Log(title = "班级管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgClass pgClass) {
+ return toAjax(classService.update(pgClass));
+ }
+
+ @SaCheckPermission("business:class:remove")
+ @Log(title = "班级管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{classIds}")
+ public R remove(@PathVariable Long[] classIds) {
+ return toAjax(classService.deleteByIds(classIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java
new file mode 100644
index 0000000..f65807e
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgGradeController.java
@@ -0,0 +1,86 @@
+package org.dromara.pangu.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.base.domain.PgGrade;
+import org.dromara.pangu.base.service.IPgGradeService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 年级管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/grade")
+public class PgGradeController extends BaseController {
+
+ private final IPgGradeService gradeService;
+
+ /**
+ * 查询年级列表(分页)
+ */
+ @SaCheckPermission("business:grade:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgGrade grade, PageQuery pageQuery) {
+ return gradeService.selectPageList(grade, pageQuery);
+ }
+
+ /**
+ * 查询年级列表(不分页)
+ */
+ @GetMapping("/listAll")
+ public R> listAll(PgGrade grade) {
+ return R.ok(gradeService.selectList(grade));
+ }
+
+ /**
+ * 获取年级详情
+ */
+ @SaCheckPermission("business:grade:query")
+ @GetMapping("/{gradeId}")
+ public R getInfo(@PathVariable Long gradeId) {
+ return R.ok(gradeService.selectById(gradeId));
+ }
+
+ /**
+ * 新增年级
+ */
+ @SaCheckPermission("business:grade:add")
+ @Log(title = "年级管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgGrade grade) {
+ return toAjax(gradeService.insert(grade));
+ }
+
+ /**
+ * 修改年级
+ */
+ @SaCheckPermission("business:grade:edit")
+ @Log(title = "年级管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgGrade grade) {
+ return toAjax(gradeService.update(grade));
+ }
+
+ /**
+ * 删除年级
+ */
+ @SaCheckPermission("business:grade:remove")
+ @Log(title = "年级管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{gradeIds}")
+ public R remove(@PathVariable Long[] gradeIds) {
+ return toAjax(gradeService.deleteByIds(gradeIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgRegionController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgRegionController.java
new file mode 100644
index 0000000..aa0b72c
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgRegionController.java
@@ -0,0 +1,66 @@
+package org.dromara.pangu.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.base.domain.PgRegion;
+import org.dromara.pangu.base.service.IPgRegionService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 区域管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/region")
+public class PgRegionController extends BaseController {
+
+ private final IPgRegionService regionService;
+
+ @SaCheckPermission("business:region:list")
+ @GetMapping("/list")
+ public R> list(PgRegion region) {
+ return R.ok(regionService.selectList(region));
+ }
+
+ @GetMapping("/children/{parentId}")
+ public R> children(@PathVariable Long parentId) {
+ return R.ok(regionService.selectByParentId(parentId));
+ }
+
+ @SaCheckPermission("business:region:query")
+ @GetMapping("/{regionId}")
+ public R getInfo(@PathVariable Long regionId) {
+ return R.ok(regionService.selectById(regionId));
+ }
+
+ @SaCheckPermission("business:region:add")
+ @Log(title = "区域管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgRegion region) {
+ return toAjax(regionService.insert(region));
+ }
+
+ @SaCheckPermission("business:region:edit")
+ @Log(title = "区域管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgRegion region) {
+ return toAjax(regionService.update(region));
+ }
+
+ @SaCheckPermission("business:region:remove")
+ @Log(title = "区域管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{regionIds}")
+ public R remove(@PathVariable Long[] regionIds) {
+ return toAjax(regionService.deleteByIds(regionIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgSubjectController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgSubjectController.java
new file mode 100644
index 0000000..95ab9de
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/controller/PgSubjectController.java
@@ -0,0 +1,68 @@
+package org.dromara.pangu.base.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.base.domain.PgSubject;
+import org.dromara.pangu.base.service.IPgSubjectService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 学科管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/subject")
+public class PgSubjectController extends BaseController {
+
+ private final IPgSubjectService subjectService;
+
+ @SaCheckPermission("business:subject:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgSubject subject, PageQuery pageQuery) {
+ return subjectService.selectPageList(subject, pageQuery);
+ }
+
+ @GetMapping("/listAll")
+ public R> listAll(PgSubject subject) {
+ return R.ok(subjectService.selectList(subject));
+ }
+
+ @SaCheckPermission("business:subject:query")
+ @GetMapping("/{subjectId}")
+ public R getInfo(@PathVariable Long subjectId) {
+ return R.ok(subjectService.selectById(subjectId));
+ }
+
+ @SaCheckPermission("business:subject:add")
+ @Log(title = "学科管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgSubject subject) {
+ return toAjax(subjectService.insert(subject));
+ }
+
+ @SaCheckPermission("business:subject:edit")
+ @Log(title = "学科管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgSubject subject) {
+ return toAjax(subjectService.update(subject));
+ }
+
+ @SaCheckPermission("business:subject:remove")
+ @Log(title = "学科管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{subjectIds}")
+ public R remove(@PathVariable Long[] subjectIds) {
+ return toAjax(subjectService.deleteByIds(subjectIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgClass.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgClass.java
new file mode 100644
index 0000000..bdedf64
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgClass.java
@@ -0,0 +1,38 @@
+package org.dromara.pangu.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 班级字典表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_class")
+public class PgClass extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long classId;
+
+ private String classCode;
+
+ private String className;
+
+ private Integer orderNum;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java
new file mode 100644
index 0000000..01371c0
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgGrade.java
@@ -0,0 +1,62 @@
+package org.dromara.pangu.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 年级字典表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_grade")
+public class PgGrade extends BaseEntity {
+
+ /**
+ * 年级ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long gradeId;
+
+ /**
+ * 年级编码
+ */
+ private String gradeCode;
+
+ /**
+ * 年级名称
+ */
+ private String gradeName;
+
+ /**
+ * 显示顺序
+ */
+ private Integer orderNum;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ private String status;
+
+ /**
+ * 租户编号
+ */
+ private String tenantId;
+
+ /**
+ * 删除标志(0存在 1删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * 备注
+ */
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgRegion.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgRegion.java
new file mode 100644
index 0000000..d2fcb56
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgRegion.java
@@ -0,0 +1,42 @@
+package org.dromara.pangu.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 区域表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_region")
+public class PgRegion extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long regionId;
+
+ private Long parentId;
+
+ private String ancestors;
+
+ private String regionName;
+
+ private String regionCode;
+
+ private Integer level;
+
+ private Integer orderNum;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgSubject.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgSubject.java
new file mode 100644
index 0000000..37350db
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/domain/PgSubject.java
@@ -0,0 +1,38 @@
+package org.dromara.pangu.base.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 学科表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_subject")
+public class PgSubject extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long subjectId;
+
+ private String subjectCode;
+
+ private String subjectName;
+
+ private Integer orderNum;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgClassMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgClassMapper.java
new file mode 100644
index 0000000..717ece8
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgClassMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.base.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.base.domain.PgClass;
+
+/**
+ * 班级 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgClassMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgGradeMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgGradeMapper.java
new file mode 100644
index 0000000..fbb4633
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgGradeMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.base.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.base.domain.PgGrade;
+
+/**
+ * 年级 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgGradeMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgRegionMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgRegionMapper.java
new file mode 100644
index 0000000..11fd933
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgRegionMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.base.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.base.domain.PgRegion;
+
+/**
+ * 区域 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgRegionMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgSubjectMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgSubjectMapper.java
new file mode 100644
index 0000000..69d617c
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/mapper/PgSubjectMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.base.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.base.domain.PgSubject;
+
+/**
+ * 学科 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgSubjectMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgClassService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgClassService.java
new file mode 100644
index 0000000..1b67d00
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgClassService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.base.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgClass;
+
+import java.util.List;
+
+/**
+ * 班级 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgClassService {
+ TableDataInfo selectPageList(PgClass pgClass, PageQuery pageQuery);
+ List selectList(PgClass pgClass);
+ PgClass selectById(Long classId);
+ int insert(PgClass pgClass);
+ int update(PgClass pgClass);
+ int deleteByIds(Long[] classIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java
new file mode 100644
index 0000000..0a790fc
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgGradeService.java
@@ -0,0 +1,45 @@
+package org.dromara.pangu.base.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgGrade;
+
+import java.util.List;
+
+/**
+ * 年级 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgGradeService {
+
+ /**
+ * 分页查询年级列表
+ */
+ TableDataInfo selectPageList(PgGrade grade, PageQuery pageQuery);
+
+ /**
+ * 查询年级列表
+ */
+ List selectList(PgGrade grade);
+
+ /**
+ * 根据ID查询年级
+ */
+ PgGrade selectById(Long gradeId);
+
+ /**
+ * 新增年级
+ */
+ int insert(PgGrade grade);
+
+ /**
+ * 修改年级
+ */
+ int update(PgGrade grade);
+
+ /**
+ * 批量删除年级
+ */
+ int deleteByIds(Long[] gradeIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgRegionService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgRegionService.java
new file mode 100644
index 0000000..94b3ec2
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgRegionService.java
@@ -0,0 +1,19 @@
+package org.dromara.pangu.base.service;
+
+import org.dromara.pangu.base.domain.PgRegion;
+
+import java.util.List;
+
+/**
+ * 区域 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgRegionService {
+ List selectList(PgRegion region);
+ PgRegion selectById(Long regionId);
+ List selectByParentId(Long parentId);
+ int insert(PgRegion region);
+ int update(PgRegion region);
+ int deleteByIds(Long[] regionIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgSubjectService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgSubjectService.java
new file mode 100644
index 0000000..82130f5
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/IPgSubjectService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.base.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgSubject;
+
+import java.util.List;
+
+/**
+ * 学科 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgSubjectService {
+ TableDataInfo selectPageList(PgSubject subject, PageQuery pageQuery);
+ List selectList(PgSubject subject);
+ PgSubject selectById(Long subjectId);
+ int insert(PgSubject subject);
+ int update(PgSubject subject);
+ int deleteByIds(Long[] subjectIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgClassServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgClassServiceImpl.java
new file mode 100644
index 0000000..142e9ee
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgClassServiceImpl.java
@@ -0,0 +1,67 @@
+package org.dromara.pangu.base.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgClass;
+import org.dromara.pangu.base.mapper.PgClassMapper;
+import org.dromara.pangu.base.service.IPgClassService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 班级 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgClassServiceImpl implements IPgClassService {
+
+ private final PgClassMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgClass pgClass, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(pgClass);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgClass pgClass) {
+ return baseMapper.selectList(buildQueryWrapper(pgClass));
+ }
+
+ @Override
+ public PgClass selectById(Long classId) {
+ return baseMapper.selectById(classId);
+ }
+
+ @Override
+ public int insert(PgClass pgClass) {
+ return baseMapper.insert(pgClass);
+ }
+
+ @Override
+ public int update(PgClass pgClass) {
+ return baseMapper.updateById(pgClass);
+ }
+
+ @Override
+ public int deleteByIds(Long[] classIds) {
+ return baseMapper.deleteByIds(Arrays.asList(classIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgClass pgClass) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(pgClass.getClassName()), PgClass::getClassName, pgClass.getClassName());
+ lqw.eq(StrUtil.isNotBlank(pgClass.getStatus()), PgClass::getStatus, pgClass.getStatus());
+ lqw.orderByAsc(PgClass::getOrderNum);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java
new file mode 100644
index 0000000..57e8c36
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgGradeServiceImpl.java
@@ -0,0 +1,67 @@
+package org.dromara.pangu.base.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgGrade;
+import org.dromara.pangu.base.mapper.PgGradeMapper;
+import org.dromara.pangu.base.service.IPgGradeService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 年级 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgGradeServiceImpl implements IPgGradeService {
+
+ private final PgGradeMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgGrade grade, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(grade);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgGrade grade) {
+ return baseMapper.selectList(buildQueryWrapper(grade));
+ }
+
+ @Override
+ public PgGrade selectById(Long gradeId) {
+ return baseMapper.selectById(gradeId);
+ }
+
+ @Override
+ public int insert(PgGrade grade) {
+ return baseMapper.insert(grade);
+ }
+
+ @Override
+ public int update(PgGrade grade) {
+ return baseMapper.updateById(grade);
+ }
+
+ @Override
+ public int deleteByIds(Long[] gradeIds) {
+ return baseMapper.deleteByIds(Arrays.asList(gradeIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgGrade grade) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(grade.getGradeName()), PgGrade::getGradeName, grade.getGradeName());
+ lqw.eq(StrUtil.isNotBlank(grade.getStatus()), PgGrade::getStatus, grade.getStatus());
+ lqw.orderByAsc(PgGrade::getOrderNum);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgRegionServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgRegionServiceImpl.java
new file mode 100644
index 0000000..a19286c
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgRegionServiceImpl.java
@@ -0,0 +1,61 @@
+package org.dromara.pangu.base.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.pangu.base.domain.PgRegion;
+import org.dromara.pangu.base.mapper.PgRegionMapper;
+import org.dromara.pangu.base.service.IPgRegionService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 区域 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgRegionServiceImpl implements IPgRegionService {
+
+ private final PgRegionMapper baseMapper;
+
+ @Override
+ public List selectList(PgRegion region) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(region.getRegionName()), PgRegion::getRegionName, region.getRegionName());
+ lqw.eq(StrUtil.isNotBlank(region.getStatus()), PgRegion::getStatus, region.getStatus());
+ lqw.eq(region.getLevel() != null, PgRegion::getLevel, region.getLevel());
+ lqw.orderByAsc(PgRegion::getOrderNum);
+ return baseMapper.selectList(lqw);
+ }
+
+ @Override
+ public PgRegion selectById(Long regionId) {
+ return baseMapper.selectById(regionId);
+ }
+
+ @Override
+ public List selectByParentId(Long parentId) {
+ return baseMapper.selectList(new LambdaQueryWrapper()
+ .eq(PgRegion::getParentId, parentId)
+ .orderByAsc(PgRegion::getOrderNum));
+ }
+
+ @Override
+ public int insert(PgRegion region) {
+ return baseMapper.insert(region);
+ }
+
+ @Override
+ public int update(PgRegion region) {
+ return baseMapper.updateById(region);
+ }
+
+ @Override
+ public int deleteByIds(Long[] regionIds) {
+ return baseMapper.deleteByIds(Arrays.asList(regionIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgSubjectServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgSubjectServiceImpl.java
new file mode 100644
index 0000000..869c509
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/base/service/impl/PgSubjectServiceImpl.java
@@ -0,0 +1,67 @@
+package org.dromara.pangu.base.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.base.domain.PgSubject;
+import org.dromara.pangu.base.mapper.PgSubjectMapper;
+import org.dromara.pangu.base.service.IPgSubjectService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 学科 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgSubjectServiceImpl implements IPgSubjectService {
+
+ private final PgSubjectMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgSubject subject, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(subject);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgSubject subject) {
+ return baseMapper.selectList(buildQueryWrapper(subject));
+ }
+
+ @Override
+ public PgSubject selectById(Long subjectId) {
+ return baseMapper.selectById(subjectId);
+ }
+
+ @Override
+ public int insert(PgSubject subject) {
+ return baseMapper.insert(subject);
+ }
+
+ @Override
+ public int update(PgSubject subject) {
+ return baseMapper.updateById(subject);
+ }
+
+ @Override
+ public int deleteByIds(Long[] subjectIds) {
+ return baseMapper.deleteByIds(Arrays.asList(subjectIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgSubject subject) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(subject.getSubjectName()), PgSubject::getSubjectName, subject.getSubjectName());
+ lqw.eq(StrUtil.isNotBlank(subject.getStatus()), PgSubject::getStatus, subject.getStatus());
+ lqw.orderByAsc(PgSubject::getOrderNum);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/controller/PgMemberController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/controller/PgMemberController.java
new file mode 100644
index 0000000..381a948
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/controller/PgMemberController.java
@@ -0,0 +1,61 @@
+package org.dromara.pangu.member.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.member.domain.PgMember;
+import org.dromara.pangu.member.service.IPgMemberService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 会员管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/member")
+public class PgMemberController extends BaseController {
+
+ private final IPgMemberService memberService;
+
+ @SaCheckPermission("business:member:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgMember member, PageQuery pageQuery) {
+ return memberService.selectPageList(member, pageQuery);
+ }
+
+ @SaCheckPermission("business:member:query")
+ @GetMapping("/{memberId}")
+ public R getInfo(@PathVariable Long memberId) {
+ return R.ok(memberService.selectById(memberId));
+ }
+
+ @SaCheckPermission("business:member:add")
+ @Log(title = "会员管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgMember member) {
+ return toAjax(memberService.insert(member));
+ }
+
+ @SaCheckPermission("business:member:edit")
+ @Log(title = "会员管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgMember member) {
+ return toAjax(memberService.update(member));
+ }
+
+ @SaCheckPermission("business:member:remove")
+ @Log(title = "会员管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{memberIds}")
+ public R remove(@PathVariable Long[] memberIds) {
+ return toAjax(memberService.deleteByIds(memberIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/domain/PgMember.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/domain/PgMember.java
new file mode 100644
index 0000000..4dcdce2
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/domain/PgMember.java
@@ -0,0 +1,81 @@
+package org.dromara.pangu.member.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 会员表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_member")
+public class PgMember extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long memberId;
+
+ private String memberCode;
+
+ private String phone;
+
+ private String password;
+
+ private String nickname;
+
+ private String avatar;
+
+ /**
+ * 性别(0未知 1男 2女)
+ */
+ private String gender;
+
+ private Date birthday;
+
+ /**
+ * 身份类型(1家长 2教师)
+ */
+ private String identityType;
+
+ private String openId;
+
+ private String unionId;
+
+ private Long regionId;
+
+ private Long schoolId;
+
+ private Long schoolGradeId;
+
+ private Long schoolClassId;
+
+ /**
+ * 注册来源(1小程序 2H5 3后台 4导入)
+ */
+ private String registerSource;
+
+ private Date registerTime;
+
+ private Date lastLoginTime;
+
+ private String lastLoginIp;
+
+ private Integer loginCount;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/mapper/PgMemberMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/mapper/PgMemberMapper.java
new file mode 100644
index 0000000..2707ed0
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/mapper/PgMemberMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.member.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.member.domain.PgMember;
+
+/**
+ * 会员 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgMemberMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/IPgMemberService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/IPgMemberService.java
new file mode 100644
index 0000000..e0b3a57
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/IPgMemberService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.member.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.member.domain.PgMember;
+
+import java.util.List;
+
+/**
+ * 会员 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgMemberService {
+ TableDataInfo selectPageList(PgMember member, PageQuery pageQuery);
+ List selectList(PgMember member);
+ PgMember selectById(Long memberId);
+ int insert(PgMember member);
+ int update(PgMember member);
+ int deleteByIds(Long[] memberIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/impl/PgMemberServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/impl/PgMemberServiceImpl.java
new file mode 100644
index 0000000..3ecc0cc
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/member/service/impl/PgMemberServiceImpl.java
@@ -0,0 +1,69 @@
+package org.dromara.pangu.member.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.member.domain.PgMember;
+import org.dromara.pangu.member.mapper.PgMemberMapper;
+import org.dromara.pangu.member.service.IPgMemberService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 会员 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgMemberServiceImpl implements IPgMemberService {
+
+ private final PgMemberMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgMember member, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(member);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgMember member) {
+ return baseMapper.selectList(buildQueryWrapper(member));
+ }
+
+ @Override
+ public PgMember selectById(Long memberId) {
+ return baseMapper.selectById(memberId);
+ }
+
+ @Override
+ public int insert(PgMember member) {
+ return baseMapper.insert(member);
+ }
+
+ @Override
+ public int update(PgMember member) {
+ return baseMapper.updateById(member);
+ }
+
+ @Override
+ public int deleteByIds(Long[] memberIds) {
+ return baseMapper.deleteByIds(Arrays.asList(memberIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgMember member) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(member.getNickname()), PgMember::getNickname, member.getNickname());
+ lqw.like(StrUtil.isNotBlank(member.getPhone()), PgMember::getPhone, member.getPhone());
+ lqw.eq(StrUtil.isNotBlank(member.getIdentityType()), PgMember::getIdentityType, member.getIdentityType());
+ lqw.eq(StrUtil.isNotBlank(member.getStatus()), PgMember::getStatus, member.getStatus());
+ lqw.orderByDesc(PgMember::getCreateTime);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/controller/PgSchoolController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/controller/PgSchoolController.java
new file mode 100644
index 0000000..f4e8c88
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/controller/PgSchoolController.java
@@ -0,0 +1,68 @@
+package org.dromara.pangu.school.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.school.domain.PgSchool;
+import org.dromara.pangu.school.service.IPgSchoolService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 学校管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/school")
+public class PgSchoolController extends BaseController {
+
+ private final IPgSchoolService schoolService;
+
+ @SaCheckPermission("business:school:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgSchool school, PageQuery pageQuery) {
+ return schoolService.selectPageList(school, pageQuery);
+ }
+
+ @GetMapping("/listAll")
+ public R> listAll(PgSchool school) {
+ return R.ok(schoolService.selectList(school));
+ }
+
+ @SaCheckPermission("business:school:query")
+ @GetMapping("/{schoolId}")
+ public R getInfo(@PathVariable Long schoolId) {
+ return R.ok(schoolService.selectById(schoolId));
+ }
+
+ @SaCheckPermission("business:school:add")
+ @Log(title = "学校管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgSchool school) {
+ return toAjax(schoolService.insert(school));
+ }
+
+ @SaCheckPermission("business:school:edit")
+ @Log(title = "学校管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgSchool school) {
+ return toAjax(schoolService.update(school));
+ }
+
+ @SaCheckPermission("business:school:remove")
+ @Log(title = "学校管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{schoolIds}")
+ public R remove(@PathVariable Long[] schoolIds) {
+ return toAjax(schoolService.deleteByIds(schoolIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java
new file mode 100644
index 0000000..221a4a9
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchool.java
@@ -0,0 +1,51 @@
+package org.dromara.pangu.school.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+/**
+ * 学校表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_school")
+public class PgSchool extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long schoolId;
+
+ private String schoolCode;
+
+ private String schoolName;
+
+ /**
+ * 学校类型(1小学 2初中 3高中 4完全中学)
+ */
+ private String schoolType;
+
+ private Long regionId;
+
+ private String regionPath;
+
+ private String address;
+
+ private String contactPerson;
+
+ private String contactPhone;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java
new file mode 100644
index 0000000..80c154e
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolClass.java
@@ -0,0 +1,36 @@
+package org.dromara.pangu.school.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 学校班级表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@TableName("pg_school_class")
+public class PgSchoolClass implements Serializable {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ private Long schoolId;
+
+ private Long schoolGradeId;
+
+ private Long classId;
+
+ private String classAlias;
+
+ private String tenantId;
+
+ private Long createBy;
+
+ private Date createTime;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java
new file mode 100644
index 0000000..babb07c
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/domain/PgSchoolGrade.java
@@ -0,0 +1,32 @@
+package org.dromara.pangu.school.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 学校年级关联表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@TableName("pg_school_grade")
+public class PgSchoolGrade implements Serializable {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ private Long schoolId;
+
+ private Long gradeId;
+
+ private String tenantId;
+
+ private Long createBy;
+
+ private Date createTime;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java
new file mode 100644
index 0000000..a5910d9
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolClassMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.school.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.school.domain.PgSchoolClass;
+
+/**
+ * 学校班级 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgSchoolClassMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java
new file mode 100644
index 0000000..9e61efd
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolGradeMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.school.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.school.domain.PgSchoolGrade;
+
+/**
+ * 学校年级关联 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgSchoolGradeMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java
new file mode 100644
index 0000000..453b227
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/mapper/PgSchoolMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.school.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.school.domain.PgSchool;
+
+/**
+ * 学校 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgSchoolMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/IPgSchoolService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/IPgSchoolService.java
new file mode 100644
index 0000000..6b56b48
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/IPgSchoolService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.school.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.school.domain.PgSchool;
+
+import java.util.List;
+
+/**
+ * 学校 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgSchoolService {
+ TableDataInfo selectPageList(PgSchool school, PageQuery pageQuery);
+ List selectList(PgSchool school);
+ PgSchool selectById(Long schoolId);
+ int insert(PgSchool school);
+ int update(PgSchool school);
+ int deleteByIds(Long[] schoolIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java
new file mode 100644
index 0000000..56643e8
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/school/service/impl/PgSchoolServiceImpl.java
@@ -0,0 +1,68 @@
+package org.dromara.pangu.school.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.school.domain.PgSchool;
+import org.dromara.pangu.school.mapper.PgSchoolMapper;
+import org.dromara.pangu.school.service.IPgSchoolService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 学校 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgSchoolServiceImpl implements IPgSchoolService {
+
+ private final PgSchoolMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgSchool school, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(school);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgSchool school) {
+ return baseMapper.selectList(buildQueryWrapper(school));
+ }
+
+ @Override
+ public PgSchool selectById(Long schoolId) {
+ return baseMapper.selectById(schoolId);
+ }
+
+ @Override
+ public int insert(PgSchool school) {
+ return baseMapper.insert(school);
+ }
+
+ @Override
+ public int update(PgSchool school) {
+ return baseMapper.updateById(school);
+ }
+
+ @Override
+ public int deleteByIds(Long[] schoolIds) {
+ return baseMapper.deleteByIds(Arrays.asList(schoolIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgSchool school) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(school.getSchoolName()), PgSchool::getSchoolName, school.getSchoolName());
+ lqw.eq(StrUtil.isNotBlank(school.getSchoolType()), PgSchool::getSchoolType, school.getSchoolType());
+ lqw.eq(school.getRegionId() != null, PgSchool::getRegionId, school.getRegionId());
+ lqw.eq(StrUtil.isNotBlank(school.getStatus()), PgSchool::getStatus, school.getStatus());
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/controller/PgStudentController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/controller/PgStudentController.java
new file mode 100644
index 0000000..a9715d0
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/controller/PgStudentController.java
@@ -0,0 +1,61 @@
+package org.dromara.pangu.student.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.pangu.student.domain.PgStudent;
+import org.dromara.pangu.student.service.IPgStudentService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 学生管理
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/business/student")
+public class PgStudentController extends BaseController {
+
+ private final IPgStudentService studentService;
+
+ @SaCheckPermission("business:student:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PgStudent student, PageQuery pageQuery) {
+ return studentService.selectPageList(student, pageQuery);
+ }
+
+ @SaCheckPermission("business:student:query")
+ @GetMapping("/{studentId}")
+ public R getInfo(@PathVariable Long studentId) {
+ return R.ok(studentService.selectById(studentId));
+ }
+
+ @SaCheckPermission("business:student:add")
+ @Log(title = "学生管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public R add(@Validated @RequestBody PgStudent student) {
+ return toAjax(studentService.insert(student));
+ }
+
+ @SaCheckPermission("business:student:edit")
+ @Log(title = "学生管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public R edit(@Validated @RequestBody PgStudent student) {
+ return toAjax(studentService.update(student));
+ }
+
+ @SaCheckPermission("business:student:remove")
+ @Log(title = "学生管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{studentIds}")
+ public R remove(@PathVariable Long[] studentIds) {
+ return toAjax(studentService.deleteByIds(studentIds));
+ }
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java
new file mode 100644
index 0000000..9d8bcdb
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/domain/PgStudent.java
@@ -0,0 +1,59 @@
+package org.dromara.pangu.student.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 学生表
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("pg_student")
+public class PgStudent extends BaseEntity {
+
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long studentId;
+
+ private String studentName;
+
+ private String studentNo;
+
+ /**
+ * 性别(0未知 1男 2女)
+ */
+ private String gender;
+
+ private Date birthday;
+
+ private Long regionId;
+
+ private String regionPath;
+
+ private Long schoolId;
+
+ private Long schoolGradeId;
+
+ private Long schoolClassId;
+
+ private Long subjectId;
+
+ private Long memberId;
+
+ private String status;
+
+ private String tenantId;
+
+ @TableLogic
+ private String delFlag;
+
+ private String remark;
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java
new file mode 100644
index 0000000..9f7862c
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/mapper/PgStudentMapper.java
@@ -0,0 +1,12 @@
+package org.dromara.pangu.student.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.pangu.student.domain.PgStudent;
+
+/**
+ * 学生 Mapper 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface PgStudentMapper extends BaseMapperPlus {
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/IPgStudentService.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/IPgStudentService.java
new file mode 100644
index 0000000..298a8be
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/IPgStudentService.java
@@ -0,0 +1,21 @@
+package org.dromara.pangu.student.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.student.domain.PgStudent;
+
+import java.util.List;
+
+/**
+ * 学生 Service 接口
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+public interface IPgStudentService {
+ TableDataInfo selectPageList(PgStudent student, PageQuery pageQuery);
+ List selectList(PgStudent student);
+ PgStudent selectById(Long studentId);
+ int insert(PgStudent student);
+ int update(PgStudent student);
+ int deleteByIds(Long[] studentIds);
+}
diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java
new file mode 100644
index 0000000..9d1b0a6
--- /dev/null
+++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/student/service/impl/PgStudentServiceImpl.java
@@ -0,0 +1,71 @@
+package org.dromara.pangu.student.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.pangu.student.domain.PgStudent;
+import org.dromara.pangu.student.mapper.PgStudentMapper;
+import org.dromara.pangu.student.service.IPgStudentService;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 学生 Service 实现
+ *
+ * @author 湖北新华业务中台研发团队
+ */
+@RequiredArgsConstructor
+@Service
+public class PgStudentServiceImpl implements IPgStudentService {
+
+ private final PgStudentMapper baseMapper;
+
+ @Override
+ public TableDataInfo selectPageList(PgStudent student, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(student);
+ Page page = baseMapper.selectPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(page);
+ }
+
+ @Override
+ public List selectList(PgStudent student) {
+ return baseMapper.selectList(buildQueryWrapper(student));
+ }
+
+ @Override
+ public PgStudent selectById(Long studentId) {
+ return baseMapper.selectById(studentId);
+ }
+
+ @Override
+ public int insert(PgStudent student) {
+ return baseMapper.insert(student);
+ }
+
+ @Override
+ public int update(PgStudent student) {
+ return baseMapper.updateById(student);
+ }
+
+ @Override
+ public int deleteByIds(Long[] studentIds) {
+ return baseMapper.deleteByIds(Arrays.asList(studentIds));
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PgStudent student) {
+ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>();
+ lqw.like(StrUtil.isNotBlank(student.getStudentName()), PgStudent::getStudentName, student.getStudentName());
+ lqw.like(StrUtil.isNotBlank(student.getStudentNo()), PgStudent::getStudentNo, student.getStudentNo());
+ lqw.eq(student.getSchoolId() != null, PgStudent::getSchoolId, student.getSchoolId());
+ lqw.eq(student.getSchoolGradeId() != null, PgStudent::getSchoolGradeId, student.getSchoolGradeId());
+ lqw.eq(student.getSchoolClassId() != null, PgStudent::getSchoolClassId, student.getSchoolClassId());
+ lqw.eq(StrUtil.isNotBlank(student.getStatus()), PgStudent::getStatus, student.getStatus());
+ lqw.orderByDesc(PgStudent::getCreateTime);
+ return lqw;
+ }
+}
diff --git a/backend/ruoyi-modules/pom.xml b/backend/ruoyi-modules/pom.xml
index daff497..c47ff63 100644
--- a/backend/ruoyi-modules/pom.xml
+++ b/backend/ruoyi-modules/pom.xml
@@ -15,6 +15,7 @@
ruoyi-job
ruoyi-system
ruoyi-workflow
+ pangu-business
ruoyi-modules