diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRegionController.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRegionController.java new file mode 100644 index 00000000..f4417ef0 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRegionController.java @@ -0,0 +1,113 @@ +package org.dromara.system.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.domain.vo.SysRegionVo; +import org.dromara.system.domain.bo.SysRegionBo; +import org.dromara.system.service.ISysRegionService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 行政区划 + * + * @author zlwu + * @date 2025-07-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/SysRegion") +public class SysRegionController extends BaseController { + + private final ISysRegionService sysRegionService; + + /** + * 查询行政区划列表 + */ + @SaCheckPermission("system:SysRegion:list") + @GetMapping("/list") + public TableDataInfo list(SysRegionBo bo, PageQuery pageQuery) { + return sysRegionService.queryPageList(bo, pageQuery); + } + + /** + * 导出行政区划列表 + */ + @SaCheckPermission("system:SysRegion:export") + @Log(title = "行政区划", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysRegionBo bo, HttpServletResponse response) { + List list = sysRegionService.queryList(bo); + ExcelUtil.exportExcel(list, "行政区划", SysRegionVo.class, response); + } + + /** + * 获取行政区划详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:SysRegion:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { + return R.ok(sysRegionService.queryById(id)); + } + + /** + * 新增行政区划 + */ + @SaCheckPermission("system:SysRegion:add") + @Log(title = "行政区划", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysRegionBo bo) { + return toAjax(sysRegionService.insertByBo(bo)); + } + + /** + * 修改行政区划 + */ + @SaCheckPermission("system:SysRegion:edit") + @Log(title = "行政区划", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysRegionBo bo) { + return toAjax(sysRegionService.updateByBo(bo)); + } + + /** + * 删除行政区划 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:SysRegion:remove") + @Log(title = "行政区划", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { + return toAjax(sysRegionService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 获取省市区树形数据 + */ + // @SaCheckPermission("system:SysRegion:list") + @GetMapping("/tree") + public R> getRegionTree() { + List tree = sysRegionService.getRegionTree(); + return R.ok(tree); + } +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 8903a740..d5d37c14 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -95,7 +95,8 @@ public class SysProfileController extends BaseController { if (BCrypt.checkpw(bo.getNewPassword(), password)) { return R.fail("新密码不能与旧密码相同"); } - int rows = DataPermissionHelper.ignore(() -> userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword()))); + int rows = DataPermissionHelper + .ignore(() -> userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword()))); if (rows > 0) { return R.ok(); } @@ -118,7 +119,8 @@ public class SysProfileController extends BaseController { } SysOssVo oss = ossService.upload(avatarfile); String avatar = oss.getUrl(); - boolean updateSuccess = DataPermissionHelper.ignore(() -> userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())); + boolean updateSuccess = DataPermissionHelper + .ignore(() -> userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())); if (updateSuccess) { return R.ok(new AvatarVo(avatar)); } @@ -126,8 +128,10 @@ public class SysProfileController extends BaseController { return R.fail("上传图片异常,请联系管理员"); } - public record AvatarVo(String imgUrl) {} + public record AvatarVo(String imgUrl) { + } - public record ProfileVo(SysUserVo user, String roleGroup, String postGroup) {} + public record ProfileVo(SysUserVo user, String roleGroup, String postGroup) { + } } diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRegion.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRegion.java new file mode 100644 index 00000000..d2b0a7f0 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRegion.java @@ -0,0 +1,86 @@ +package org.dromara.system.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 行政区划对象 sys_region + * + * @author zlwu + * @date 2025-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_region") +public class SysRegion extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id") + private Long id; + + /** + * 行政区划编码 + */ + private String code; + + /** + * 行政区划名称 + */ + private String name; + + /** + * 行政区划简称 + */ + private String shortName; + + /** + * 父级行政区划编码,顶级为0 + */ + private Long parentCode; + + /** + * 层级(1:省,2:市,3:区/县,4:街道/镇) + */ + private Long level; + + /** + * 排序 + */ + private Long sort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 经度 + */ + private Long longitude; + + /** + * 纬度 + */ + private Long latitude; + + /** + * 逻辑删除标识(0未删除 1已删除) + */ + private Long deleted; + + +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java index 3712f805..9e061c85 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -70,11 +70,7 @@ public class SysUser extends TenantEntity { /** * 密码 */ - @TableField( - insertStrategy = FieldStrategy.NOT_EMPTY, - updateStrategy = FieldStrategy.NOT_EMPTY, - whereStrategy = FieldStrategy.NOT_EMPTY - ) + @TableField(insertStrategy = FieldStrategy.NOT_EMPTY, updateStrategy = FieldStrategy.NOT_EMPTY, whereStrategy = FieldStrategy.NOT_EMPTY) private String password; /** @@ -103,7 +99,6 @@ public class SysUser extends TenantEntity { */ private String remark; - public SysUser(Long userId) { this.userId = userId; } @@ -112,4 +107,9 @@ public class SysUser extends TenantEntity { return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); } + /** + * 账号类型 + */ + private String accountType; + } diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRegionBo.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRegionBo.java new file mode 100644 index 00000000..d33e9646 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRegionBo.java @@ -0,0 +1,88 @@ +package org.dromara.system.domain.bo; + +import org.dromara.system.domain.SysRegion; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 行政区划业务对象 sys_region + * + * @author zlwu + * @date 2025-07-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRegion.class, reverseConvertGenerate = false) +public class SysRegionBo extends BaseEntity { + + /** + * 主键ID + */ + @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 行政区划编码 + */ + @NotBlank(message = "行政区划编码不能为空", groups = { AddGroup.class, EditGroup.class }) + private String code; + + /** + * 行政区划名称 + */ + @NotBlank(message = "行政区划名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String name; + + /** + * 行政区划简称 + */ + private String shortName; + + /** + * 父级行政区划编码,顶级为0 + */ + private Long parentCode; + + /** + * 层级(1:省,2:市,3:区/县,4:街道/镇) + */ + @NotNull(message = "层级(1:省,2:市,3:区/县,4:街道/镇)不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long level; + + /** + * 排序 + */ + private Long sort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 经度 + */ + private Long longitude; + + /** + * 纬度 + */ + private Long latitude; + + /** + * 逻辑删除标识(0未删除 1已删除) + */ + private Long deleted; + + +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 1472d242..5516a825 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -121,4 +121,13 @@ public class SysUserBo extends BaseEntity { return SystemConstants.SUPER_ADMIN_ID.equals(this.userId); } + /** + * 账号类型 + */ + private String accountType; + + /** + * 头像 + */ + private String avatar; } diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRegionVo.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRegionVo.java new file mode 100644 index 00000000..f331bb8b --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRegionVo.java @@ -0,0 +1,110 @@ +package org.dromara.system.domain.vo; + +import org.dromara.system.domain.SysRegion; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 行政区划视图对象 sys_region + * + * @author zlwu + * @date 2025-07-26 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysRegion.class) +public class SysRegionVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ExcelProperty(value = "主键ID") + private Long id; + + /** + * 行政区划编码 + */ + @ExcelProperty(value = "行政区划编码") + private String code; + + /** + * 行政区划名称 + */ + @ExcelProperty(value = "行政区划名称") + private String name; + + /** + * 行政区划简称 + */ + @ExcelProperty(value = "行政区划简称") + private String shortName; + + /** + * 父级行政区划编码,顶级为0 + */ + @ExcelProperty(value = "父级行政区划编码,顶级为0") + private Long parentCode; + + /** + * 层级(1:省,2:市,3:区/县,4:街道/镇) + */ + @ExcelProperty(value = "层级", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=:省,2:市,3:区/县,4:街道/镇") + private Long level; + + /** + * 排序 + */ + @ExcelProperty(value = "排序") + private Long sort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 经度 + */ + @ExcelProperty(value = "经度") + private Long longitude; + + /** + * 纬度 + */ + @ExcelProperty(value = "纬度") + private Long latitude; + + /** + * 逻辑删除标识(0未删除 1已删除) + */ + @ExcelProperty(value = "逻辑删除标识", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=未删除,1=已删除") + private Long deleted; + + /** + * 子级行政区划列表(用于树形结构) + */ + private List children; + +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java index 86249d20..97f81ef1 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -15,7 +15,6 @@ import java.io.Serializable; import java.util.Date; import java.util.List; - /** * 用户信息视图对象 sys_user * @@ -139,4 +138,8 @@ public class SysUserVo implements Serializable { */ private Long roleId; + /** + * 账号类型 1 - 老师 2- 学生 + */ + private String accountType; } diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRegionMapper.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRegionMapper.java new file mode 100644 index 00000000..6a7c3e93 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRegionMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysRegion; +import org.dromara.system.domain.vo.SysRegionVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 行政区划Mapper接口 + * + * @author zlwu + * @date 2025-07-26 + */ +public interface SysRegionMapper extends BaseMapperPlus { + +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRegionService.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRegionService.java new file mode 100644 index 00000000..400d3ae9 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRegionService.java @@ -0,0 +1,75 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysRegionVo; +import org.dromara.system.domain.bo.SysRegionBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 行政区划Service接口 + * + * @author zlwu + * @date 2025-07-26 + */ +public interface ISysRegionService { + + /** + * 查询行政区划 + * + * @param id 主键 + * @return 行政区划 + */ + SysRegionVo queryById(Long id); + + /** + * 分页查询行政区划列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 行政区划分页列表 + */ + TableDataInfo queryPageList(SysRegionBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的行政区划列表 + * + * @param bo 查询条件 + * @return 行政区划列表 + */ + List queryList(SysRegionBo bo); + + /** + * 新增行政区划 + * + * @param bo 行政区划 + * @return 是否新增成功 + */ + Boolean insertByBo(SysRegionBo bo); + + /** + * 修改行政区划 + * + * @param bo 行政区划 + * @return 是否修改成功 + */ + Boolean updateByBo(SysRegionBo bo); + + /** + * 校验并批量删除行政区划信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 获取省市区树形数据 + * + * @return 省市区树形数据列表 + */ + List getRegionTree(); +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegionServiceImpl.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegionServiceImpl.java new file mode 100644 index 00000000..d90cc0fe --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegionServiceImpl.java @@ -0,0 +1,184 @@ +package org.dromara.system.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.dromara.system.domain.bo.SysRegionBo; +import org.dromara.system.domain.vo.SysRegionVo; +import org.dromara.system.domain.SysRegion; +import org.dromara.system.mapper.SysRegionMapper; +import org.dromara.system.service.ISysRegionService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.ArrayList; + +/** + * 行政区划Service业务层处理 + * + * @author zlwu + * @date 2025-07-26 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SysRegionServiceImpl implements ISysRegionService { + + private final SysRegionMapper baseMapper; + + /** + * 查询行政区划 + * + * @param id 主键 + * @return 行政区划 + */ + @Override + public SysRegionVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询行政区划列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 行政区划分页列表 + */ + @Override + public TableDataInfo queryPageList(SysRegionBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的行政区划列表 + * + * @param bo 查询条件 + * @return 行政区划列表 + */ + @Override + public List queryList(SysRegionBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysRegionBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SysRegion::getId); + lqw.eq(StringUtils.isNotBlank(bo.getCode()), SysRegion::getCode, bo.getCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), SysRegion::getName, bo.getName()); + lqw.like(StringUtils.isNotBlank(bo.getShortName()), SysRegion::getShortName, bo.getShortName()); + lqw.eq(bo.getParentCode() != null, SysRegion::getParentCode, bo.getParentCode()); + lqw.eq(bo.getLevel() != null, SysRegion::getLevel, bo.getLevel()); + lqw.eq(bo.getSort() != null, SysRegion::getSort, bo.getSort()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysRegion::getStatus, bo.getStatus()); + lqw.eq(bo.getLongitude() != null, SysRegion::getLongitude, bo.getLongitude()); + lqw.eq(bo.getLatitude() != null, SysRegion::getLatitude, bo.getLatitude()); + lqw.eq(bo.getDeleted() != null, SysRegion::getDeleted, bo.getDeleted()); + return lqw; + } + + /** + * 新增行政区划 + * + * @param bo 行政区划 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SysRegionBo bo) { + SysRegion add = MapstructUtils.convert(bo, SysRegion.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改行政区划 + * + * @param bo 行政区划 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SysRegionBo bo) { + SysRegion update = MapstructUtils.convert(bo, SysRegion.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SysRegion entity) { + // TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除行政区划信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 获取省市区树形数据 + * + * @return 省市区树形数据列表 + */ + @Override + public List getRegionTree() { + // 查询所有正常状态且未删除的行政区划数据 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysRegion::getDeleted, 0); + lqw.eq(SysRegion::getStatus, "0"); + lqw.orderByAsc(SysRegion::getLevel, SysRegion::getSort, SysRegion::getId); + + List allRegions = baseMapper.selectVoList(lqw); + + // 构建树形结构 + return buildRegionTree(allRegions, 0L); + } + + /** + * 构建树形结构 + * + * @param allRegions 所有行政区划数据 + * @param parentCode 父级编码 + * @return 树形结构数据 + */ + private List buildRegionTree(List allRegions, Long parentCode) { + List treeList = new ArrayList<>(); + + for (SysRegionVo region : allRegions) { + if (parentCode.equals(region.getParentCode())) { + // 递归查找子节点 + List children = buildRegionTree(allRegions, region.getId()); + region.setChildren(children); + treeList.add(region); + } + } + + return treeList; + } +} diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index b7c463e4..0195725b 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -24,14 +24,17 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -54,6 +57,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService { private final SysPostMapper postMapper; private final SysUserRoleMapper userRoleMapper; private final SysUserPostMapper userPostMapper; + private final SysOssMapper ossMapper; + + @Autowired + private JdbcTemplate jdbcTemplate; @Override public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { @@ -383,14 +390,41 @@ public class SysUserServiceImpl implements ISysUserService, UserService { */ @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") @Override + @Transactional(rollbackFor = Exception.class) public int updateUserProfile(SysUserBo user) { - return baseMapper.update(null, + int result = baseMapper.update(null, new LambdaUpdateWrapper() .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) .set(SysUser::getPhonenumber, user.getPhonenumber()) .set(SysUser::getEmail, user.getEmail()) .set(SysUser::getSex, user.getSex()) .eq(SysUser::getUserId, user.getUserId())); + + if (result > 0) { + SysUserVo user1 = baseMapper.selectVoById(user.getUserId()); + if (user1.getAccountType().equals("2")) { + // 判断账号类型为学生(accountType = "2")时,同步更新学生信息表 + try { + String updateSql = "UPDATE xg_student_msg SET " + + "name = ?, email = ?, gender = ?, phone = ?, update_time = NOW() " + + "WHERE id = ? AND deleted = 0"; + + jdbcTemplate.update(updateSql, + user.getNickName(), // 昵称对应学生姓名 + user.getEmail(), // 邮箱 + user.getSex(), // 性别 + user.getPhonenumber(), // 手机号 + user.getUserId() // 用户ID对应学生ID + ); + + log.info("学生用户基本信息同步更新成功,用户ID: {}", user.getUserId()); + } catch (Exception e) { + log.error("学生用户基本信息同步更新失败,用户ID: {}, 错误信息: {}", user.getUserId(), e.getMessage()); + // 这里不抛出异常,避免影响用户基本信息的更新 + } + } + } + return result; } /** @@ -401,11 +435,41 @@ public class SysUserServiceImpl implements ISysUserService, UserService { * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public boolean updateUserAvatar(Long userId, Long avatar) { - return baseMapper.update(null, + boolean result = baseMapper.update(null, new LambdaUpdateWrapper() .set(SysUser::getAvatar, avatar) .eq(SysUser::getUserId, userId)) > 0; + + // 判断账号类型为学生(accountType = "2")时,同步更新学生信息表 + if (result) { + + SysUserVo user = baseMapper.selectVoById(userId); + if (user.getAccountType().equals("2")) { + + // 通过avatar丛sys_oss表获取url信息 + SysOssVo oss = ossMapper.selectVoById(avatar); + String url = oss.getUrl(); + try { + // 更新学生信息表 xg_student_msg 的 photo_path 字段 和 photo_url 字段 + String updateSql = "UPDATE xg_student_msg SET " + + "photo_path = ?, photo_url = ? " + + "WHERE id = ? AND deleted = 0"; + + jdbcTemplate.update(updateSql, + avatar, // 头像ossid + url, // 头像url + user.getUserId() // 用户ID对应学生ID + ); + log.info("学生用户头像同步更新成功,用户ID: {}", user.getUserId()); + } catch (Exception e) { + log.error("学生用户头像同步更新失败,用户ID: {}, 错误信息: {}", user.getUserId(), e.getMessage()); + // 这里不抛出异常,避免影响用户头像的更新 + } + } + } + return result; } /** diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRegionMapper.xml b/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRegionMapper.xml new file mode 100644 index 00000000..1b957588 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRegionMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index ded6fa85..611f25e6 100644 --- a/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -18,7 +18,7 @@ u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark + u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.account_type from sys_user u ${ew.getCustomSqlSegment} @@ -31,7 +31,7 @@ u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, - u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark + u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,u.account_type from sys_user u ${ew.getCustomSqlSegment} @@ -40,7 +40,7 @@