From 2b87ee8a6c20ff5a010f246ba7d7624e85236ecb Mon Sep 17 00:00:00 2001 From: francis-fh Date: Thu, 16 Jul 2026 19:26:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/mapper/msg/HrCompanyTalentCollectMapper.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruoyi-bussiness/src/main/resources/mapper/msg/HrCompanyTalentCollectMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/msg/HrCompanyTalentCollectMapper.xml index fbf9f8e..7b73bcf 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/msg/HrCompanyTalentCollectMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/msg/HrCompanyTalentCollectMapper.xml @@ -90,13 +90,13 @@ and htc.source_type = #{sourceType} - and htc.collect_tags like concat('%',#{collectTags},'%') + and htc.collect_tags like '%' || #{collectTags} || '%' - and au.name like concat('%',#{name},'%') + and au.name like '%' || #{name} || '%' - and au.phone like concat('%',#{phone},'%') + and au.phone like '%' || #{phone} || '%' and au.education = #{education} From 36357e86b163fb504a6093c8bb761224a69bfb7c Mon Sep 17 00:00:00 2001 From: francis-fh Date: Mon, 20 Jul 2026 10:23:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AE=80=E5=8E=86=E9=9B=86=E6=88=90?= =?UTF-8?q?=E3=80=81=E7=AE=A1=E7=90=86=E5=91=98=E4=BF=AE=E6=94=B9=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E5=AF=86=E7=A0=81=E3=80=81=E4=BA=BA=E6=89=8D=E5=BA=93?= =?UTF-8?q?=E3=80=81=E6=8A=95=E9=80=92=E8=80=85=E7=AE=80=E5=8E=86=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E7=AD=89=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-local.yml | 20 +-- .../controller/cms/CmsAppUserController.java | 82 +++++++++++++ .../cms/ResumeAccessLogController.java | 93 ++++++++++++++ .../ruoyi/cms/domain/InterviewInvitation.java | 5 + .../com/ruoyi/cms/domain/ResumeAccessLog.java | 48 ++++++++ .../com/ruoyi/cms/mapper/AppUserMapper.java | 2 + .../cms/mapper/ResumeAccessLogMapper.java | 11 ++ .../ruoyi/cms/service/IAppUserService.java | 20 +++ .../cms/service/impl/AppUserServiceImpl.java | 114 ++++++++++++++++++ .../impl/InterviewInvitationServiceImpl.java | 5 +- .../resources/mapper/app/AppUserMapper.xml | 18 ++- .../common/core/domain/entity/AppUser.java | 8 ++ 12 files changed, 416 insertions(+), 10 deletions(-) create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/ResumeAccessLogController.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ResumeAccessLog.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/ResumeAccessLogMapper.java diff --git a/ruoyi-admin/src/main/resources/application-local.yml b/ruoyi-admin/src/main/resources/application-local.yml index 8456e59..dcc71f5 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml +++ b/ruoyi-admin/src/main/resources/application-local.yml @@ -25,9 +25,14 @@ spring: # #username: syssso # username: sysdba # password: ZKR2024@comzkr + # 正式环境 + # master: + # url: jdbc:highgo://39.98.44.136:6023/highgo?useUnicode=true&characterEncoding=utf8¤tSchema=shz&stringtype=unspecified + # username: sysdba + # password: Hello@2026 + # 测试环境 master: - url: jdbc:highgo://39.98.44.136:6023/highgo?useUnicode=true&characterEncoding=utf8¤tSchema=shz&stringtype=unspecified - #username: syssso + url: jdbc:highgo://47.111.103.66:5866/highgo?useUnicode=true&characterEncoding=utf8¤tSchema=shz&stringtype=unspecified username: sysdba password: Hello@2026 # 从库数据源 @@ -81,14 +86,13 @@ spring: config: multi-statement-allow: true redis: - # 地址 - host: 124.243.245.42 - # 端口,默认为6379 - port: 5379 + # 本地 + host: 127.0.0.1 + port: 6379 # 数据库索引 database: 0 - # 密码 - password: ZKR2024@@.com + # 密码(本地通常无密码) + password: # 连接超时时间 timeout: 100s lettuce: diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java index 3cd5a32..4e1e273 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java @@ -3,10 +3,14 @@ package com.ruoyi.cms.controller.cms; import java.util.Date; import java.util.List; import java.util.Objects; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.ruoyi.cms.domain.AppReviewJob; +import com.ruoyi.cms.domain.ResumeAccessLog; import com.ruoyi.cms.domain.ResumeStatusDTO; +import com.ruoyi.cms.mapper.ResumeAccessLogMapper; +import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.domain.vo.AppUserLky; import com.ruoyi.cms.service.IAppReviewJobService; import com.ruoyi.cms.util.DateValidateUtil; @@ -35,7 +39,9 @@ import com.ruoyi.common.enums.BusinessType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.cms.service.IAppUserService; +import com.ruoyi.common.utils.ip.IpUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; @@ -54,6 +60,10 @@ public class CmsAppUserController extends BaseController private IAppUserService appUserService; @Autowired private IAppReviewJobService appReviewJobService; + @Autowired + private ResumeAccessLogMapper resumeAccessLogMapper; + @Autowired + private ICompanyService companyService; /** * 查询APP用户列表 @@ -99,6 +109,35 @@ public class CmsAppUserController extends BaseController return success(appUserService.selectAppUserByUserId(userId)); } + /** + * 获取用户完整简历信息(个人信息+教育+培训+工作经历+技能) + */ + @ApiOperation("获取用户完整简历信息") + @PreAuthorize("@ss.hasPermi('cms:appUser:query') or @ss.hasPermi('cms:hrTalentCollect:list')") + @GetMapping(value = "/resume/{userId}") + public AjaxResult getResume(@PathVariable("userId") Long userId) + { + return success(appUserService.getAppUserResume(userId)); + } + + /** + * 后台保存用户完整简历(个人信息+教育+培训+工作经历+技能) + * 复用 editRegisterUser 的保存逻辑 + */ + @ApiOperation("后台保存用户完整简历") + @PostMapping("/saveResume") + @BussinessLog(title = "后台保存简历") + public AjaxResult saveResume(@RequestBody RegisterBody registerBody) + { + if (registerBody == null) { + return AjaxResult.error("入参不能为空!"); + } + if (registerBody.getAppUser() == null || registerBody.getAppUser().getUserId() == null) { + return AjaxResult.error("用户信息或用户ID为空!"); + } + return AjaxResult.success(appUserService.editRegisterUser(registerBody)); + } + /** * 新增APP用户 */ @@ -361,4 +400,47 @@ public class CmsAppUserController extends BaseController : "简历已设置成保密!"; return success(msg); } + + @ApiOperation("修改用户身份证号") + @Log(title = "APP用户", businessType = BusinessType.UPDATE) + @PostMapping("/updateIdCard") + public AjaxResult updateIdCard(@RequestBody AppUser appUser) + { + if (appUser.getUserId() == null) { + return AjaxResult.error("用户ID为空"); + } + if (StringUtils.isBlank(appUser.getIdCard())) { + return AjaxResult.error("身份证号为空"); + } + try { + appUserService.updateIdCard(appUser.getUserId(), appUser.getIdCard()); + return success("身份证号修改成功"); + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } + + @ApiOperation("重置用户密码(同步浪潮)") + @Log(title = "APP用户", businessType = BusinessType.UPDATE) + @PostMapping("/resetPassword") + public AjaxResult resetPassword(@RequestBody AppUser appUser) + { + if (appUser.getUserId() == null) { + return AjaxResult.error("用户ID为空"); + } + if (StringUtils.isBlank(appUser.getPassword())) { + return AjaxResult.error("密码为空"); + } + if (SecurityUtils.getlcUserid() == null) { + return error("门户会话失效,请重新在门户登录"); + } + try { + // 使用当前管理员的浪潮身份调用浪潮重置密码接口 + appUser.setLcUserid(SecurityUtils.getlcUserid()); + appUserService.resetPassword(appUser); + return success("密码重置成功"); + } catch (RuntimeException e) { + return AjaxResult.error(e.getMessage()); + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/ResumeAccessLogController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/ResumeAccessLogController.java new file mode 100644 index 0000000..c1995a0 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/ResumeAccessLogController.java @@ -0,0 +1,93 @@ +package com.ruoyi.cms.controller.cms; + +import java.util.List; + +import com.ruoyi.cms.domain.ResumeAccessLog; +import com.ruoyi.cms.mapper.ResumeAccessLogMapper; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.entity.Company; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ip.IpUtils; +import com.ruoyi.cms.service.ICompanyService; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 简历访问/下载记录 + */ +@RestController +@RequestMapping("/cms/resumeAccessLog") +@Api(tags = "后台:简历访问记录") +public class ResumeAccessLogController extends BaseController +{ + @Autowired + private ResumeAccessLogMapper resumeAccessLogMapper; + @Autowired + private ICompanyService companyService; + + @ApiOperation("简历访问记录列表") + @PreAuthorize("@ss.hasPermi('cms:appUser:query')") + @GetMapping("/list") + public TableDataInfo list(ResumeAccessLog resumeAccessLog) + { + startPage(); + QueryWrapper qw = new QueryWrapper<>(); + if (resumeAccessLog.getUserId() != null) { + qw.eq("user_id", resumeAccessLog.getUserId()); + } + if (resumeAccessLog.getAccessBy() != null && !resumeAccessLog.getAccessBy().isEmpty()) { + qw.like("access_by", resumeAccessLog.getAccessBy()); + } + qw.orderByDesc("access_time"); + List list = resumeAccessLogMapper.selectList(qw); + return getDataTable(list); + } + + /** + * 记录简历下载操作(由前端 iframe 点击检测触发) + */ + @ApiOperation("记录简历下载") + @PostMapping("/download") + public AjaxResult logDownload(@RequestBody Map body, HttpServletRequest request) + { + try { + ResumeAccessLog log = new ResumeAccessLog(); + Object userIdObj = body.get("userId"); + if (userIdObj != null) { + log.setUserId(Long.valueOf(userIdObj.toString())); + } + log.setAccessBy(SecurityUtils.getUsername()); + log.setAccessTime(DateUtils.getTime()); + log.setIpAddress(IpUtils.getIpAddr(request)); + log.setSourcePage("下载操作"); + if (SecurityUtils.isLogin()) { + try { + Company company = companyService.queryCodeCompany(SecurityUtils.getIdcard()); + if (company != null) { + log.setCompanyId(company.getCompanyId()); + } + } catch (Exception e) { + // ignore + } + } + resumeAccessLogMapper.insert(log); + return success(); + } catch (Exception e) { + return error("记录下载失败: " + e.getMessage()); + } + } +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvitation.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvitation.java index f40107f..dc51778 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvitation.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvitation.java @@ -57,6 +57,11 @@ public class InterviewInvitation extends BaseEntity { */ @ApiModelProperty("面试方式") private String interviewMethod; + /** + * 会议类型(shz_video/tencent_meeting),在线面试时使用 + */ + @ApiModelProperty("会议类型") + private String meetingType; /** * 腾讯会议链接 */ diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ResumeAccessLog.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ResumeAccessLog.java new file mode 100644 index 0000000..bdfcad9 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ResumeAccessLog.java @@ -0,0 +1,48 @@ +package com.ruoyi.cms.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 简历访问/下载记录 resume_access_log + * + * @date 2026-07-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel("简历访问/下载记录") +@TableName(value = "resume_access_log") +public class ResumeAccessLog extends BaseEntity +{ + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty("主键ID") + private Long id; + + @ApiModelProperty("被查看的求职者ID") + private Long userId; + + @ApiModelProperty("招聘企业ID") + private Long companyId; + + @ApiModelProperty("操作人") + private String accessBy; + + @ApiModelProperty("访问时间") + private String accessTime; + + @ApiModelProperty("来源页面") + private String sourcePage; + + @ApiModelProperty("IP地址") + private String ipAddress; +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java index e9701b8..9d0d144 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java @@ -39,5 +39,7 @@ public interface AppUserMapper extends BaseMapper int updateSysUserIdCard(@Param("userId") Long userId, @Param("idCard") String idCard); + int updateSysUserPassword(@Param("userId") Long userId, @Param("password") String password); + List selectUserApplyList(AppUser appUser); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/ResumeAccessLogMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/ResumeAccessLogMapper.java new file mode 100644 index 0000000..4fa8407 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/ResumeAccessLogMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.cms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cms.domain.ResumeAccessLog; + +/** + * 简历访问/下载记录 Mapper + */ +public interface ResumeAccessLogMapper extends BaseMapper +{ +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java index 59347a9..4f730f8 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java @@ -76,6 +76,13 @@ public interface IAppUserService public AppUser getUserInfo(); + /** + * 获取用户完整简历信息(个人信息+教育+培训+工作经历+技能) + * @param userId 用户ID + * @return 完整的用户简历数据 + */ + public AppUser getAppUserResume(Long userId); + public int editRegisterUser(RegisterBody registerBody); public List selectNoTmAppUserList(AppUser appUser); @@ -89,4 +96,17 @@ public interface IAppUserService void resetLcPsw(AppUser appUser); void changeLcCompanyStatus(AppUser appUser); + + /** + * 修改用户身份证号(同步更新 app_user 和 sys_user) + * @param userId 用户ID + * @param idCard 新身份证号 + */ + void updateIdCard(Long userId, String idCard); + + /** + * 重置用户密码(先调浪潮接口,再同步更新本地 sys_user 表) + * @param appUser 包含 userId、password、lcUserid(管理员浪潮身份) + */ + void resetPassword(AppUser appUser); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java index 0e48494..66a161d 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java @@ -550,6 +550,33 @@ public class AppUserServiceImpl extends ServiceImpl imple return lky; } + @Override + public AppUser getAppUserResume(Long userId) { + AppUser appUser = selectAppUserByUserId(userId); + if (appUser != null && appUser.getUserId() != null) { + // 查询工作经历 + UserWorkExperiences workParam = new UserWorkExperiences(); + workParam.setUserId(appUser.getUserId()); + List experiencesList = userWorkExperiencesMapper.getWorkExperiencesList(workParam); + appUser.setExperiencesList(experiencesList); + + // 查询技能 + AppSkill skillParam = new AppSkill(); + skillParam.setUserId(appUser.getUserId()); + List skillList = appSkillMapper.getList(skillParam); + appUser.setAppSkillsList(skillList); + + // 查询教育经历 + List educationsList = appUserEducationMapper.selectEducationListByUserId(appUser.getUserId()); + appUser.setEducationsList(educationsList); + + // 查询培训经历 + List trainsList = appUserTrainMapper.selectTrainListByUserId(appUser.getUserId()); + appUser.setTrainsList(trainsList); + } + return appUser; + } + @Override public AppUser getUserInfo() { //查询用户信息 @@ -760,4 +787,91 @@ public class AppUserServiceImpl extends ServiceImpl imple System.out.println(data); } + @Override + @Transactional(rollbackFor = Exception.class) + public void updateIdCard(Long userId, String idCard) { + // 1. 校验身份证格式 + if (StringUtils.isBlank(idCard)) { + throw new RuntimeException("身份证号不能为空"); + } + if (!idCard.matches(StringUtil.SFZ_VALID_REGEX)) { + throw new RuntimeException("身份证格式不正确"); + } + // 2. 检查用户是否存在 + AppUser appUser = appUserMapper.selectById(userId); + if (appUser == null) { + throw new RuntimeException("用户不存在"); + } + // 3. 检查身份证唯一性 + AppUser existing = appUserMapper.selectOne( + Wrappers.lambdaQuery() + .eq(AppUser::getIdCard, idCard) + .eq(AppUser::getDelFlag, "0") + .ne(AppUser::getUserId, userId) + .last("LIMIT 1")); + if (existing != null) { + throw new RuntimeException("该身份证号已被其他用户使用"); + } + // 4. 更新 app_user 表 + AppUser updateEntity = new AppUser(); + updateEntity.setUserId(userId); + updateEntity.setIdCard(idCard); + appUserMapper.updateById(updateEntity); + // 5. 同步更新 sys_user 表 + appUserMapper.updateSysUserIdCard(userId, idCard); + } + + @Override + public void resetPassword(AppUser appUser) { + String password = appUser.getPassword(); + // 1. 校验密码强度 + validatePasswordStrength(password); + // 2. 查询目标用户信息 + AppUser targetUser = appUserMapper.selectById(appUser.getUserId()); + if (targetUser == null) { + throw new RuntimeException("用户不存在"); + } + // 3. 获取管理员浪潮 token,调用浪潮重置密码接口 + String lcUserToken = redisCache.getCacheObject(CacheConstants.LC_JGD_TOKEN + appUser.getLcUserid()); + if (StringUtils.isBlank(lcUserToken)) { + throw new RuntimeException("token已失效"); + } + JSONObject pJson = new JSONObject(); + pJson.put("userId", appUser.getUserId()); + pJson.put("password", password); + String result = httpClientUtils.sendHttpPost(JG_RESET_PASSWORD_URL, lcUserToken, pJson.toJSONString()); + JsonUtil.parsePortalResponse(result, "调用重置密码接口"); + // 4. 同步更新本地 sys_user 表密码 + SysUser sysUser = appUserMapper.selectSysUserIdcard(targetUser.getIdCard()); + if (sysUser != null) { + String encryptedPassword = SecurityUtils.encryptPassword(password); + appUserMapper.updateSysUserPassword(sysUser.getUserId(), encryptedPassword); + } + } + + /** + * 密码强度校验:需包含大小写字母、数字和至少2个特殊字符;长度8-20位 + */ + private void validatePasswordStrength(String password) { + if (StringUtils.isBlank(password)) { + throw new RuntimeException("密码不能为空"); + } + if (password.length() < 8 || password.length() > 20) { + throw new RuntimeException("密码长度需在8-20位之间"); + } + if (!password.matches(".*[A-Z].*")) { + throw new RuntimeException("密码需包含大写字母"); + } + if (!password.matches(".*[a-z].*")) { + throw new RuntimeException("密码需包含小写字母"); + } + if (!password.matches(".*\\d.*")) { + throw new RuntimeException("密码需包含数字"); + } + // 至少2个特殊字符(非字母数字的字符) + String specialChars = password.replaceAll("[a-zA-Z0-9]", ""); + if (specialChars.length() < 2) { + throw new RuntimeException("密码需包含至少2个特殊字符"); + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInvitationServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInvitationServiceImpl.java index 51be6ea..7bdbdeb 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInvitationServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInvitationServiceImpl.java @@ -295,7 +295,10 @@ public class InterviewInvitationServiceImpl implements InterviewInvitationServic content.append("面试时间:").append(invitation.getInterviewTime() != null ? invitation.getInterviewTime() : "待定").append(","); content.append("面试方式:").append(methodText); if ("online".equals(invitation.getInterviewMethod())) { - content.append(",腾讯会议链接:").append(invitation.getMeetingLink() != null ? invitation.getMeetingLink() : ""); + String meetingLabel = "shz_video".equals(invitation.getMeetingType()) ? "石河子视频会议链接" + : "tencent_meeting".equals(invitation.getMeetingType()) ? "腾讯会议链接" + : "会议链接"; + content.append(",").append(meetingLabel).append(":").append(invitation.getMeetingLink() != null ? invitation.getMeetingLink() : ""); content.append(",会议密码:").append(invitation.getMeetingPassword() != null ? invitation.getMeetingPassword() : ""); } else { content.append(",面试地点:").append(invitation.getInterviewLocation() != null ? invitation.getInterviewLocation() : ""); diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml index b22feec..3fe3c95 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml @@ -34,10 +34,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + + + + - select user_id, name, age, sex, birth_date, education, political_affiliation, phone, avatar, salary_min, salary_max, area, status, del_flag, login_ip, login_date, create_by, create_time, update_by, update_time, remark,job_title_id,is_recommend,id_card,work_experience,is_company_user,lc_userid,email,resume_status from app_user + select user_id, name, age, sex, birth_date, education, political_affiliation, phone, avatar, salary_min, salary_max, area, status, del_flag, login_ip, login_date, create_by, create_time, update_by, update_time, remark,job_title_id,is_recommend,id_card,work_experience,is_company_user,lc_userid,email,resume_status,nation,openid,unionid,address,domicile_address,user_type,experience,ytj_password from app_user select a.user_id , a.name , a.age , a.sex , get_birth_date_from_id_card ( a.id_card ) as birth_date , a.education , a.political_affiliation , a.phone , a.avatar , c.min_salary salaryMin ,c.max_salary salaryMax,a.area ,a.id_card , diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java index eabc2b8..ad67050 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/AppUser.java @@ -153,6 +153,14 @@ public class AppUser extends BaseEntity @ApiModelProperty("技能列表") private List appSkillsList; + @TableField(exist = false) + @ApiModelProperty("教育经历列表") + private List educationsList; + + @TableField(exist = false) + @ApiModelProperty("培训经历列表") + private List trainsList; + @TableField(exist = false) @ApiModelProperty("附件列表") private List fileList;