1.完成生成简历

This commit is contained in:
sh
2026-02-03 12:39:27 +08:00
parent 30faf7f933
commit 6b7e359234
6 changed files with 187 additions and 7 deletions

12
pom.xml
View File

@@ -27,7 +27,7 @@
<fastjson.version>2.0.43</fastjson.version> <fastjson.version>2.0.43</fastjson.version>
<oshi.version>6.6.1</oshi.version> <oshi.version>6.6.1</oshi.version>
<commons.io.version>2.13.0</commons.io.version> <commons.io.version>2.13.0</commons.io.version>
<poi.version>4.1.2</poi.version> <poi.version>5.2.2</poi.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
<jwt.version>0.9.1</jwt.version> <jwt.version>0.9.1</jwt.version>
<mybatis-plus.version>3.5.1</mybatis-plus.version> <mybatis-plus.version>3.5.1</mybatis-plus.version>
@@ -121,6 +121,16 @@
<artifactId>poi-ooxml</artifactId> <artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version> <version>${poi.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- velocity代码生成使用模板 --> <!-- velocity代码生成使用模板 -->
<dependency> <dependency>

View File

@@ -111,6 +111,12 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,6 +1,13 @@
package com.ruoyi.cms.controller.app; package com.ruoyi.cms.controller.app;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import com.ruoyi.cms.domain.AppReviewJob; import com.ruoyi.cms.domain.AppReviewJob;
import com.ruoyi.cms.util.DictUtils;
import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.common.core.domain.entity.AppSkill;
import com.ruoyi.common.core.domain.entity.AppUser; import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.cms.domain.Job; import com.ruoyi.cms.domain.Job;
@@ -11,6 +18,7 @@ import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.cms.domain.vo.AppUserLky; import com.ruoyi.cms.domain.vo.AppUserLky;
import com.ruoyi.common.core.domain.entity.UserWorkExperiences;
import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
@@ -21,9 +29,13 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.OutputStream;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* app用户Controller * app用户Controller
@@ -180,4 +192,63 @@ public class AppUserController extends BaseController
appReviewJob.setUserId(SiteSecurityUtils.getUserId()); appReviewJob.setUserId(SiteSecurityUtils.getUserId());
return toAjax(appReviewJobService.insertAppReviewJob(appReviewJob)); return toAjax(appReviewJobService.insertAppReviewJob(appReviewJob));
} }
@ApiOperation("生成简历")
@GetMapping("/createResume")
public void createResume(HttpServletResponse response){
try {
Long userId=null;
if(SiteSecurityUtils.isLogin()){
userId=SiteSecurityUtils.getUserId();
}
String templatePath="/data/downloadmodel/简历.docx";
AppUser result=appUserService.selectAppUserByUserId(userId);
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("name", result.getName());
dataMap.put("sex", DictUtils.getDictLabel("app_sex",result.getSex()));
dataMap.put("birthDate", StringUtil.getBirthDateFromIdCard(result.getIdCard()));
dataMap.put("education", DictUtils.getDictLabel("education",result.getEducation()));
dataMap.put("politicalAffiliation", DictUtils.getDictLabel("political_affiliation",result.getPoliticalAffiliation()));
dataMap.put("nation", DictUtils.getDictLabel("nation",result.getNation()));
dataMap.put("domicileAddress", result.getDomicileAddress());
dataMap.put("address", result.getAddress());
String salary=result.getSalaryMin()+"-"+result.getSalaryMax();
dataMap.put("salary", salary);
dataMap.put("area", DictUtils.getDictLabel("area",result.getArea()));
dataMap.put("jobTitle", String.join(",",result.getJobTitle()));
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure builder = Configure.builder()
.bind("workExperiences",policy)
.bind("skillList",policy)
.build();
List<UserWorkExperiences> userWorkExperiences = result.getExperiencesList();
List<AppSkill> skillList=result.getAppSkillsList();
skillList.forEach(it->it.setLevels(DictUtils.getDictLabel("skill_level",it.getLevels())));
dataMap.put("workExperiences", userWorkExperiences);
dataMap.put("skillList", skillList);
String name=result.getName();
name = new String(name.getBytes("gb2312"), "ISO8859-1");
XWPFTemplate template = XWPFTemplate.compile(templatePath,builder).render(dataMap);
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename="+ name);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}catch (Exception e){
e.printStackTrace();
}
}
} }

View File

@@ -1,10 +1,14 @@
package com.ruoyi.cms.controller.cms; package com.ruoyi.cms.controller.cms;
import java.util.Date; import java.io.BufferedOutputStream;
import java.util.List; import java.io.OutputStream;
import java.util.Objects; import java.util.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import com.ruoyi.cms.domain.AppReviewJob; import com.ruoyi.cms.domain.AppReviewJob;
import com.ruoyi.cms.domain.vo.AppUserLky; import com.ruoyi.cms.domain.vo.AppUserLky;
import com.ruoyi.cms.service.IAppReviewJobService; import com.ruoyi.cms.service.IAppReviewJobService;
@@ -13,11 +17,13 @@ import com.ruoyi.cms.util.RoleUtils;
import com.ruoyi.cms.util.StringUtil; import com.ruoyi.cms.util.StringUtil;
import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.BussinessLog; import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.core.domain.entity.AppSkill;
import com.ruoyi.common.core.domain.entity.AppUserShow; import com.ruoyi.common.core.domain.entity.AppUserShow;
import com.ruoyi.common.core.domain.entity.UserWorkExperiences;
import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.core.domain.model.RegisterBody;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SiteSecurityUtils; import com.ruoyi.cms.util.DictUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -297,4 +303,63 @@ public class CmsAppUserController extends BaseController
return error("查询简历失败,请稍后重试"); return error("查询简历失败,请稍后重试");
} }
} }
@ApiOperation("生成简历")
@GetMapping("/createResume")
public void createResume(HttpServletResponse response){
try {
Long userId=null;
if(SecurityUtils.isLogin()){
userId=SecurityUtils.getUserId();
}
String templatePath="/data/downloadmodel/简历.docx";
AppUser result=appUserService.selectAppUserByUserId(userId);
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("name", result.getName());
dataMap.put("sex", DictUtils.getDictLabel("app_sex",result.getSex()));
dataMap.put("birthDate", StringUtil.getBirthDateFromIdCard(result.getIdCard()));
dataMap.put("education", DictUtils.getDictLabel("education",result.getEducation()));
dataMap.put("politicalAffiliation", DictUtils.getDictLabel("political_affiliation",result.getPoliticalAffiliation()));
dataMap.put("nation", DictUtils.getDictLabel("nation",result.getNation()));
dataMap.put("domicileAddress", result.getDomicileAddress());
dataMap.put("address", result.getAddress());
String salary=result.getSalaryMin()+"-"+result.getSalaryMax();
dataMap.put("salary", salary);
dataMap.put("area", DictUtils.getDictLabel("area",result.getArea()));
dataMap.put("jobTitle", String.join(",",result.getJobTitle()));
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure builder = Configure.builder()
.bind("workExperiences",policy)
.bind("skillList",policy)
.build();
List<UserWorkExperiences> userWorkExperiences = result.getExperiencesList();
List<AppSkill> skillList=result.getAppSkillsList();
skillList.forEach(it->it.setLevels(DictUtils.getDictLabel("skill_level",it.getLevels())));
dataMap.put("workExperiences", userWorkExperiences);
dataMap.put("skillList", skillList);
String name=result.getName();
name = new String(name.getBytes("gb2312"), "ISO8859-1");
XWPFTemplate template = XWPFTemplate.compile(templatePath,builder).render(dataMap);
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename="+ name);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}catch (Exception e){
e.printStackTrace();
}
}
} }

View File

@@ -103,7 +103,7 @@ public class DictUtils
{ {
for (String value : dictValue.split(separator)) for (String value : dictValue.split(separator))
{ {
if (value.equals(dict.getDictValue())) if (value.trim().equals(dict.getDictValue().trim()))
{ {
propertyString.append(dict.getDictLabel()).append(separator); propertyString.append(dict.getDictLabel()).append(separator);
break; break;
@@ -115,7 +115,7 @@ public class DictUtils
{ {
for (BussinessDictData dict : datas) for (BussinessDictData dict : datas)
{ {
if (dictValue.equals(dict.getDictValue())) if (dictValue.trim().equals(dict.getDictValue().trim()))
{ {
return dict.getDictLabel(); return dict.getDictLabel();
} }

View File

@@ -3,6 +3,7 @@ package com.ruoyi.cms.util;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -315,4 +316,31 @@ public class StringUtil {
.filter(StringUtils::hasText) .filter(StringUtils::hasText)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/**
* 从身份证号码中提取出生日期,格式化为 YYYY-MM-DD
* @param idCard 身份证号码15位或18位
* @return 格式化后的出生日期,解析失败返回空字符串
*/
public static String getBirthDateFromIdCard(String idCard) {
if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
return "";
}
String birthDateStr = "";
try {
if (idCard.length() == 18) {
birthDateStr = idCard.substring(6, 14);
} else if (idCard.length() == 15) {
birthDateStr = "20" + idCard.substring(6, 12);
}
SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyy-MM-dd");
Date birthDate = sdfInput.parse(birthDateStr);
return sdfOutput.format(birthDate);
} catch (Exception e) {
return "";
}
}
} }