diff --git a/.cursor/rules/pangu-project.mdc b/.cursor/rules/pangu-project.mdc index 4ec14fb..cccae7f 100644 --- a/.cursor/rules/pangu-project.mdc +++ b/.cursor/rules/pangu-project.mdc @@ -221,6 +221,46 @@ return dataInfo; } ``` +## 构建工具(build.sh) + +后端项目提供了快速编译打包脚本,位于 `backend/build.sh`,支持多种编译模式。 + +### 常用命令 + +| 命令 | 说明 | 耗时 | +|------|------|------| +| `./build.sh -q` | 快速编译,仅检查语法错误 | ~4秒 | +| `./build.sh -p` | 增量打包(默认) | ~4秒 | +| `./build.sh -f` | 全量编译(clean + package) | ~30秒 | +| `./build.sh -m pangu-business` | 仅编译业务模块 | 更快 | +| `./build.sh -r` | 增量打包并重启后端 | ~27秒 | +| `./build.sh -m pangu-business -r` | 编译业务模块并重启 | ~27秒 | +| `./build.sh -c` | 仅清理 target 目录 | - | +| `./build.sh -h` | 显示帮助信息 | - | + +### 开发建议 + +1. **日常开发**:修改代码后用 `-q` 快速检查语法错误 +2. **本地测试**:用 `-r` 编译并重启服务 +3. **仅改某模块**:用 `-m` 指定模块,加快编译速度 +4. **部署前**:用 `-f` 全量编译确保干净 + +### 示例 + +```bash +# 进入后端目录 +cd backend + +# 快速检查语法 +./build.sh -q + +# 修改 pangu-business 模块后编译并重启 +./build.sh -m pangu-business -r + +# 全量编译 +./build.sh -f +``` + ## 业务模块 | 模块 | 路径 | 说明 | diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/controller/H5BaseDataController.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/controller/H5BaseDataController.java index b47e33f..6df7f76 100644 --- a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/controller/H5BaseDataController.java +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/controller/H5BaseDataController.java @@ -114,11 +114,16 @@ public class H5BaseDataController { content = @Content(schema = @Schema(implementation = List.class))) }) @Parameters({ - @Parameter(name = "regionId", description = "区域ID", required = true, in = ParameterIn.QUERY, + @Parameter(name = "regionId", description = "区域ID(不传则返回空列表)", required = false, in = ParameterIn.QUERY, schema = @Schema(type = "integer", format = "int64"), example = "420100") }) @GetMapping("/schools") - public R>> getSchools(@RequestParam Long regionId) { + public R>> getSchools(@RequestParam(required = false) Long regionId) { + // 如果没传regionId,返回空列表 + if (regionId == null) { + return R.ok(new ArrayList<>()); + } + List schools = schoolMapper.selectList( new LambdaQueryWrapper() .eq(PgSchool::getRegionId, regionId) diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/domain/vo/H5EducationVo.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/domain/vo/H5EducationVo.java index 0ab7b6e..d03fb5a 100644 --- a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/domain/vo/H5EducationVo.java +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/domain/vo/H5EducationVo.java @@ -12,6 +12,24 @@ import lombok.Data; @Schema(description = "教育身份信息(教师)") public class H5EducationVo { + @Schema(description = "省份ID", example = "420000") + private Long provinceId; + + @Schema(description = "省份名称", example = "湖北省") + private String provinceName; + + @Schema(description = "城市ID", example = "420100") + private Long cityId; + + @Schema(description = "城市名称", example = "武汉市") + private String cityName; + + @Schema(description = "区县ID", example = "420102") + private Long districtId; + + @Schema(description = "区县名称", example = "江岸区") + private String districtName; + @Schema(description = "学校ID", example = "1") private Long schoolId; diff --git a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/service/impl/H5MemberServiceImpl.java b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/service/impl/H5MemberServiceImpl.java index 834da0b..6d379b7 100644 --- a/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/service/impl/H5MemberServiceImpl.java +++ b/backend/ruoyi-modules/pangu-business/src/main/java/org/dromara/pangu/h5/service/impl/H5MemberServiceImpl.java @@ -10,9 +10,11 @@ import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StringUtils; import org.dromara.pangu.base.domain.PgClass; import org.dromara.pangu.base.domain.PgGrade; +import org.dromara.pangu.base.domain.PgRegion; import org.dromara.pangu.base.domain.PgSubject; import org.dromara.pangu.base.mapper.PgClassMapper; import org.dromara.pangu.base.mapper.PgGradeMapper; +import org.dromara.pangu.base.mapper.PgRegionMapper; import org.dromara.pangu.base.mapper.PgSubjectMapper; import org.dromara.pangu.h5.domain.dto.H5EducationDto; import org.dromara.pangu.h5.domain.dto.H5MemberUpdateDto; @@ -56,6 +58,7 @@ public class H5MemberServiceImpl implements H5MemberService { private final PgGradeMapper gradeMapper; private final PgClassMapper classMapper; private final PgSubjectMapper subjectMapper; + private final PgRegionMapper regionMapper; @Override public H5MemberInfoVo getMemberInfo() { @@ -169,6 +172,10 @@ public class H5MemberServiceImpl implements H5MemberService { member.setSchoolId(dto.getSchoolId()); member.setSchoolGradeId(dto.getSchoolGradeId()); member.setSchoolClassId(dto.getSchoolClassId()); + // 从学校获取区域信息并保存 + if (school.getRegionId() != null) { + member.setRegionId(school.getRegionId()); + } // 学科信息需要在member表添加字段,这里先用remark暂存 member.setRemark("subjectId:" + dto.getSubjectId()); memberMapper.updateById(member); @@ -188,7 +195,10 @@ public class H5MemberServiceImpl implements H5MemberService { return null; } - return buildEducationVo(member); + H5EducationVo vo = buildEducationVo(member); + log.info("H5获取教育身份: memberId={}, provinceId={}, cityId={}, districtId={}, schoolId={}", + memberId, vo.getProvinceId(), vo.getCityId(), vo.getDistrictId(), vo.getSchoolId()); + return vo; } @Override @@ -344,10 +354,51 @@ public class H5MemberServiceImpl implements H5MemberService { vo.setSchoolGradeId(member.getSchoolGradeId()); vo.setSchoolClassId(member.getSchoolClassId()); - // 获取学校名称 + // 获取学校名称和区域信息 PgSchool school = schoolMapper.selectById(member.getSchoolId()); if (school != null) { vo.setSchoolName(school.getSchoolName()); + + // 根据学校的regionId获取区域信息(区县级别) + if (school.getRegionId() != null) { + PgRegion district = regionMapper.selectById(school.getRegionId()); + if (district != null) { + vo.setDistrictId(district.getRegionId()); + vo.setDistrictName(district.getRegionName()); + + // 根据ancestors获取省市信息,格式如 "0,42,4201" + if (StringUtils.isNotBlank(district.getAncestors())) { + String[] ancestorIds = district.getAncestors().split(","); + // ancestorIds[0] = "0" (根节点) + // ancestorIds[1] = 省份ID + // ancestorIds[2] = 城市ID + if (ancestorIds.length >= 2 && !"0".equals(ancestorIds[1])) { + try { + Long provinceId = Long.parseLong(ancestorIds[1].trim()); + PgRegion province = regionMapper.selectById(provinceId); + if (province != null) { + vo.setProvinceId(province.getRegionId()); + vo.setProvinceName(province.getRegionName()); + } + } catch (NumberFormatException e) { + log.warn("解析省份ID失败: {}", ancestorIds[1]); + } + } + if (ancestorIds.length >= 3) { + try { + Long cityId = Long.parseLong(ancestorIds[2].trim()); + PgRegion city = regionMapper.selectById(cityId); + if (city != null) { + vo.setCityId(city.getRegionId()); + vo.setCityName(city.getRegionName()); + } + } catch (NumberFormatException e) { + log.warn("解析城市ID失败: {}", ancestorIds[2]); + } + } + } + } + } } // 获取年级名称 diff --git a/frontend/ruoyi-ui/src/views/business/member/components/MemberDialog.vue b/frontend/ruoyi-ui/src/views/business/member/components/MemberDialog.vue index 7cae23b..8891175 100644 --- a/frontend/ruoyi-ui/src/views/business/member/components/MemberDialog.vue +++ b/frontend/ruoyi-ui/src/views/business/member/components/MemberDialog.vue @@ -161,10 +161,10 @@