Quellcode durchsuchen

简历管理代码提交。

zhanglfluofei vor 9 Monaten
Ursprung
Commit
51f723a0d1
51 geänderte Dateien mit 4660 neuen und 66 gelöschten Zeilen
  1. 182 9
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/dingding/DingAuthController.java
  2. 176 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/ResumeController.java
  3. 147 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/mobile/ResumeMobileController.java
  4. 1 1
      ruoyi-common/pom.xml
  5. BIN
      ruoyi-common/src/lib/hanlp-1.8.3.jar
  6. 10 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  7. 11 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dingding/config/DingAppConfig.java
  8. 12 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/dingding/config/DingUrlConstant.java
  9. 1 1
      ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
  10. 237 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/CompanyInfo.java
  11. 65 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/CompanyUser.java
  12. 6 4
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/Resume.java
  13. 136 14
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeEducation.java
  14. 25 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeFile.java
  15. 150 16
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeProject.java
  16. 177 19
      ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeWork.java
  17. 8 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
  18. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/CompanyInfoMapper.java
  19. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/CompanyUserMapper.java
  20. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeEducationMapper.java
  21. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeFileMapper.java
  22. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeMapper.java
  23. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeProjectMapper.java
  24. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeWorkMapper.java
  25. 8 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
  26. 84 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/dingding/DingTokenService.java
  27. 11 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
  28. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/ICompanyInfoService.java
  29. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/ICompanyUserService.java
  30. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeEducationService.java
  31. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeFileService.java
  32. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeProjectService.java
  33. 62 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeService.java
  34. 70 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeWorkService.java
  35. 94 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/CompanyInfoServiceImpl.java
  36. 94 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/CompanyUserServiceImpl.java
  37. 105 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeEducationServiceImpl.java
  38. 105 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeFileServiceImpl.java
  39. 105 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeProjectServiceImpl.java
  40. 207 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeServiceImpl.java
  41. 105 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeWorkServiceImpl.java
  42. 121 0
      ruoyi-system/src/main/resources/mapper/resume/CompanyInfoMapper.xml
  43. 61 0
      ruoyi-system/src/main/resources/mapper/resume/CompanyUserMapper.xml
  44. 96 0
      ruoyi-system/src/main/resources/mapper/resume/ResumeEducationMapper.xml
  45. 84 0
      ruoyi-system/src/main/resources/mapper/resume/ResumeFileMapper.xml
  46. 342 0
      ruoyi-system/src/main/resources/mapper/resume/ResumeMapper.xml
  47. 101 0
      ruoyi-system/src/main/resources/mapper/resume/ResumeProjectMapper.xml
  48. 111 0
      ruoyi-system/src/main/resources/mapper/resume/ResumeWorkMapper.xml
  49. 5 0
      ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
  50. 44 0
      ruoyi-ui/src/api/system/resume.js
  51. 502 0
      ruoyi-ui/src/views/system/resume/index.vue

+ 182 - 9
ruoyi-admin/src/main/java/com/ruoyi/web/controller/dingding/DingAuthController.java

@@ -3,37 +3,46 @@ package com.ruoyi.web.controller.dingding;
 import com.aliyun.dingtalkcontact_1_0.models.GetUserHeaders;
 import com.aliyun.dingtalkcontact_1_0.models.GetUserResponse;
 import com.aliyun.dingtalkcontact_1_0.Client;
+import com.aliyun.dingtalkoauth2_1_0.models.*;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
 import com.aliyun.teautil.models.RuntimeOptions;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
-import com.dingtalk.api.request.OapiUserGetRequest;
-import com.dingtalk.api.request.OapiUserGetuserinfoRequest;
-import com.dingtalk.api.response.OapiUserGetResponse;
-import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.dingding.config.DingUrlConstant;
 import com.ruoyi.framework.web.service.SysLoginService;
+import com.ruoyi.system.domain.resume.CompanyInfo;
+import com.ruoyi.system.domain.resume.CompanyUser;
+import com.ruoyi.system.service.ISysRoleService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.dingding.DingAuthService;
 import com.ruoyi.system.service.dingding.DingTokenService;
+import com.ruoyi.system.service.resume.ICompanyInfoService;
+import com.ruoyi.system.service.resume.ICompanyUserService;
 import com.taobao.api.ApiException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-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.ResponseBody;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 
+import static com.ruoyi.framework.datasource.DynamicDataSourceContextHolder.log;
+
 /**
  * <p>DingLoginController 此类用于:钉钉企业内部应用免登(H5微应用)</p>
  * <p>@remark:钉钉企业内部微应用DEMO, 实现了身份验证(免登)功能</p>
@@ -53,6 +62,18 @@ public class DingAuthController {
     @Autowired
     private SysLoginService loginService;
 
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ICompanyInfoService companyInfoService;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
     /**
      * 钉钉用户登录,显示当前登录用户的userId和名称
      *
@@ -84,6 +105,40 @@ public class DingAuthController {
         return userInfo;
     }
 
+    /**
+     * 钉钉用户登录,显示当前登录用户的userId和名称
+     *
+     * @param authCode 免登临时authCode
+     * @return 当前用户
+     */
+    @ApiOperation(value = "钉钉用户登录第三方企业应用,显示当前登录用户的userId和名称")
+    @PostMapping("/authLogin")
+    @ResponseBody
+    public AjaxResult authLogin(@RequestBody String authCode) {
+        String accessToken = dingTokenService.getCorpAccessToken();
+        if(StringUtils.isNotEmpty(accessToken)){
+            // 获取用户userId
+            AjaxResult userIdSr = getUserInfo(accessToken, authCode);
+            if (!userIdSr.isSuccess()) {
+                return userIdSr;
+            }
+            OapiV2UserGetResponse response = this.getAuthUser(accessToken, userIdSr.get(userIdSr.MSG_TAG).toString());
+            SysUser sysUser = dingAuthService.getUserByUsername(response.getResult().getMobile());
+            if(StringUtils.isNull(sysUser)){
+                // todo 生成用户信息进行登录
+                sysUser = addUserAndOrg(response);
+            }
+            userIdSr.put("sysUser",sysUser);
+            String token = loginService.authSingleSignIn(sysUser.getUserName());
+            if (StringUtils.isNotEmpty(token)){
+                userIdSr.put(Constants.TOKEN, token);
+            }
+            return userIdSr;
+        }else{
+            return AjaxResult.error("getAccessToken failed");
+        }
+    }
+
     /**
      * 访问/user/getuserinfo接口获取用户userId
      *
@@ -108,6 +163,27 @@ public class DingAuthController {
         return AjaxResult.success(response.getUserid());
     }
 
+    /**
+     * 访问/user/get 获取用户名称
+     *
+     * @param accessToken access_token
+     * @param userId      用户userId
+     * @return 用户名称或错误信息
+     */
+    private OapiV2UserGetResponse getAuthUser(String accessToken, String userId) {
+        DingTalkClient client = new DefaultDingTalkClient(DingUrlConstant.URL_USER_GET_V2);
+        OapiV2UserGetResponse response;
+        OapiV2UserGetRequest request = new OapiV2UserGetRequest();
+        request.setUserid(userId);
+        request.setLanguage("en_US");
+        try {
+            response = client.execute(request, accessToken);
+        } catch (ApiException e) {
+            log.error("Failed to getUserName: " + e.getErrMsg());
+            return null;
+        }
+        return response;
+    }
 
     /**
      * 访问/user/get 获取用户名称
@@ -157,6 +233,56 @@ public class DingAuthController {
     }
 
 
+
+    @RequestMapping(value = "/getAdminInfo", method = RequestMethod.GET)
+    public AjaxResult getAdminInfo(@RequestParam("authCode")String authCode) {
+            try {
+                com.aliyun.dingtalkoauth2_1_0.Client client = this.createClientNew();
+                String accessToken = dingTokenService.getAdminUserAccessToken();
+                GetSsoUserInfoHeaders getSsoUserInfoHeaders = new GetSsoUserInfoHeaders();
+                getSsoUserInfoHeaders.xAcsDingtalkAccessToken = accessToken;
+                GetSsoUserInfoRequest getSsoUserInfoRequest = new GetSsoUserInfoRequest()
+                        .setCode(authCode);
+                // 获取应用管理员的身份信息
+                GetSsoUserInfoResponse response = client.getSsoUserInfoWithOptions(getSsoUserInfoRequest, getSsoUserInfoHeaders, new RuntimeOptions());
+            } catch (TeaException err) {
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                }
+            } catch (Exception _err) {
+                TeaException err = new TeaException(_err.getMessage(), _err);
+                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                    // err 中含有 code 和 message 属性,可帮助开发定位问题
+                }
+            }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 根据保存的code值和获取的access_token,获取应用管理身份信息
+     * openapi@dingtalk
+     * @param code
+     * @param access_token
+     * @return
+     * OapiSsoGetuserinfoResponse
+     * 2020-11-3
+     */
+    public OapiSsoGetuserinfoResponse getAdminUserInfo(String code, String access_token) {
+        DingTalkClient client = new DefaultDingTalkClient(DingUrlConstant.URL_SSO_USER_INFO);
+        OapiSsoGetuserinfoRequest request = new OapiSsoGetuserinfoRequest();
+        request.setCode(code);
+        request.setHttpMethod("GET");
+        OapiSsoGetuserinfoResponse response;
+        try {
+            response = client.execute(request, access_token);
+        } catch (ApiException e) {
+            e.printStackTrace();
+            return null;
+        }
+        return response;
+    }
+
+
     /**
      * 钉钉用户登录
      *
@@ -182,7 +308,6 @@ public class DingAuthController {
 
                 if(StringUtils.isNull(sysUser) ){
                     // todo 生成用户信息进行登录
-
                 }
 
                 String token = loginService.authSingleSignIn(sysUser.getUserName());
@@ -200,6 +325,42 @@ public class DingAuthController {
         }
     }
 
+    /**
+     * 钉钉登录不存在用户自动增加用户以及组织信息
+     * @param response
+     * @return
+     */
+    private SysUser addUserAndOrg(OapiV2UserGetResponse response){
+        SysUser newUser = new SysUser();
+        newUser.setUserName(response.getResult().getMobile());
+        newUser.setAvatar(response.getResult().getAvatar());
+        newUser.setNickName(response.getResult().getName());
+        newUser.setEmail(response.getResult().getEmail());
+        newUser.setCreateBy("admin");
+        newUser.setPassword(SecurityUtils.encryptPassword("admin123"));
+        //角色自动赋值为简历管理角色
+        Long[] roleIds = new Long[1];
+        SysRole role = roleService.selectRoleByKey("resume");
+        if(role != null){
+            roleIds[0] = role.getRoleId();
+        }
+        newUser.setRoleIds(roleIds);
+        newUser.setPhonenumber(newUser.getUserName());
+        userService.insertUser(newUser);
+        //关联企业信息
+        String corpId = response.getResult().getUnionEmpExt().getCorpId();
+        CompanyInfo companyInfo = new CompanyInfo();
+        companyInfo.setCorpId(corpId);
+        List<CompanyInfo> companyInfoList = companyInfoService.selectCompanyInfoList(companyInfo);
+        if(companyInfoList != null && !companyInfoList.isEmpty()){
+            CompanyUser companyUser = new CompanyUser();
+            companyUser.setCompanyId(companyInfoList.get(0).getId());
+            companyUser.setUserId(newUser.getUserId());
+            companyUserService.insertCompanyUser(companyUser);
+        }
+        return newUser;
+    }
+
     /**
      * 使用 Token 初始化账号Client
      * @return Client
@@ -212,6 +373,18 @@ public class DingAuthController {
         return new Client(config);
     }
 
+    /**
+     * 使用 Token 初始化账号后台Client
+     * @return Client
+     * @throws Exception
+     */
+    private static com.aliyun.dingtalkoauth2_1_0.Client createClientNew() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
+    }
+
 
 
 }

+ 176 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/ResumeController.java

@@ -0,0 +1,176 @@
+package com.ruoyi.web.controller.tool;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.framework.config.ServerConfig;
+import com.ruoyi.system.domain.resume.Resume;
+import com.ruoyi.system.domain.resume.ResumeFile;
+import com.ruoyi.system.service.resume.IResumeService;
+import com.ruoyi.utils.resumeAnalysis.FileUtils;
+import com.ruoyi.utils.resumeAnalysis.ResumeAnalysisUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 简历管理Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-18
+ */
+@Api(tags = "智能简历系统")
+@RestController
+@RequestMapping("/system/resume")
+public class ResumeController extends BaseController
+{
+    @Autowired
+    private IResumeService resumeService;
+
+    @Autowired
+    private ServerConfig serverConfig;
+
+    /**
+     * 查询简历管理列表
+     */
+    //@PreAuthorize("@ss.hasPermi('system:resume:list')")
+    @ApiOperation(value = "分页查询简历管理列表")
+    @GetMapping("/list")
+    public TableDataInfo list(Resume resume)
+    {
+        startPage();
+        List<Resume> list = resumeService.selectResumeList(resume);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出简历管理列表
+     */
+    //@PreAuthorize("@ss.hasPermi('system:resume:export')")
+    //@Log(title = "简历管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, Resume resume)
+    {
+        List<Resume> list = resumeService.selectResumeList(resume);
+        ExcelUtil<Resume> util = new ExcelUtil<Resume>(Resume.class);
+        util.exportExcel(response, list, "简历管理数据");
+    }
+
+    /**
+     * 获取简历管理详细信息
+     */
+    @ApiOperation(value = "分页查询简历管理列表")
+    //@PreAuthorize("@ss.hasPermi('system:resume:query')")
+    @GetMapping(value = "/{resumeId}")
+    public AjaxResult getInfo(@PathVariable("resumeId") Long resumeId)
+    {
+        return success(resumeService.selectResumeByResumeId(resumeId));
+    }
+
+    /**
+     * 新增简历管理
+     */
+    @ApiOperation(value = "新增简历管理")
+    //@PreAuthorize("@ss.hasPermi('system:resume:add')")
+    //@Log(title = "简历管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody Resume resume)
+    {
+        return toAjax(resumeService.insertResume(resume));
+    }
+
+    /**
+     * 方法描述 上传简历并进行解析
+     * @author
+     * @date
+     */
+    @ApiOperation(value = "上传简历并进行解析")
+    @PostMapping(value = "/uploadResumeSimilarity",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public AjaxResult uploadResumeSimilarity(MultipartFile file) {
+        try{
+            if (file == null || StringUtils.isBlank(file.getOriginalFilename())) {
+                return AjaxResult.error("请上传简历");
+            }
+            String path = RuoYiConfig.getUploadPath();
+            String originalFilename = file.getOriginalFilename();
+            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
+            String fileName = FileUploadUtils.upload(path, file);
+
+            // 上传位置
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+            String ymd = sdf.format(new Date());
+            String lastPath = "/" + ymd + "/";
+            String fileUrl = path + lastPath + fileName;
+
+            if(suffix.equals(".doc")||suffix.equals(".docx")){
+                List<String> content = null;
+                try {
+                    if(suffix.equals(".doc")){
+                        content = FileUtils.readWord(fileUrl);
+                    } else if (suffix.equals(".docx")) {
+                        content = FileUtils.readWordDocx(fileUrl);
+                    }
+                } catch (Exception e) {
+                    return AjaxResult.error("文件不存在解析失败");
+                }
+                //处理标识分段,并判断内容情况
+                Resume resume = ResumeAnalysisUtil.toResumeAnalysis(content);
+                //处理文件信息
+                String url = serverConfig.getUrl() + fileName;
+                String newFileName = com.ruoyi.common.utils.file.FileUtils.getName(fileName);
+                ResumeFile resumeFile = new ResumeFile();
+                resumeFile.setUploadPath(url);
+                resumeFile.setUploadName(newFileName);
+                resumeFile.setUploadType(newFileName.split("\\.")[1]);
+                resume.setResumeFile(resumeFile);
+                return AjaxResult.success(resume);
+            }else{
+                return AjaxResult.error("文件格式不正确请上传.doc或者.docx格式文件!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error("解析失败!请手动录入");
+        }
+    }
+
+    /**
+     * 修改简历管理
+     */
+    @ApiOperation(value = "修改简历管理")
+    //@PreAuthorize("@ss.hasPermi('system:resume:edit')")
+    //@Log(title = "简历管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody Resume resume)
+    {
+        return toAjax(resumeService.updateResume(resume));
+    }
+
+    /**
+     * 删除简历管理
+     */
+    @ApiOperation(value = "删除简历管理")
+    //@PreAuthorize("@ss.hasPermi('system:resume:remove')")
+    //@Log(title = "简历管理", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{resumeIds}")
+    public AjaxResult remove(@PathVariable Long[] resumeIds)
+    {
+        return toAjax(resumeService.deleteResumeByResumeIds(resumeIds));
+    }
+}

+ 147 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/mobile/ResumeMobileController.java

@@ -0,0 +1,147 @@
+package com.ruoyi.web.controller.tool.mobile;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.config.ServerConfig;
+import com.ruoyi.system.domain.resume.Resume;
+import com.ruoyi.system.domain.resume.ResumeFile;
+import com.ruoyi.system.service.resume.IResumeService;
+import com.ruoyi.utils.resumeAnalysis.FileUtils;
+import com.ruoyi.utils.resumeAnalysis.ResumeAnalysisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 简历管理Controller
+ * 
+ * @author ruoyi
+ * @date 2024-02-18
+ */
+@RestController
+@RequestMapping("/mobile/resume")
+public class ResumeMobileController extends BaseController
+{
+    @Autowired
+    private IResumeService resumeService;
+
+    @Autowired
+    private ServerConfig serverConfig;
+
+    /**
+     * 查询简历管理列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(Resume resume)
+    {
+        startPage();
+        List<Resume> list = resumeService.selectResumeList(resume);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取简历管理详细信息
+     */
+    @GetMapping(value = "/{resumeId}")
+    public AjaxResult getInfo(@PathVariable("resumeId") Long resumeId)
+    {
+        return success(resumeService.selectResumeByResumeId(resumeId));
+    }
+
+    /**
+     * 新增简历管理
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody Resume resume)
+    {
+        return toAjax(resumeService.insertResume(resume));
+    }
+
+    /**
+     * 方法描述 上传简历并进行解析
+     * @author
+     * @date
+     */
+    @PostMapping(value = "/uploadResumeSimilarity",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @ResponseBody
+    public AjaxResult uploadResumeSimilarity(@RequestParam(value = "file") MultipartFile file) {
+        try{
+            if (file == null || StringUtils.isBlank(file.getOriginalFilename())) {
+                return AjaxResult.error("请上传简历");
+            }
+            String path = RuoYiConfig.getUploadPath();
+            String originalFilename = file.getOriginalFilename();
+            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
+            String fileName = FileUploadUtils.upload(path, file);
+
+            // 上传位置
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+            String ymd = sdf.format(new Date());
+            String lastPath = "/" + ymd + "/";
+            String fileUrl = path + lastPath + fileName;
+
+            if(suffix.equals(".doc")||suffix.equals(".docx")){
+                List<String> content = null;
+                try {
+                    if(suffix.equals(".doc")){
+                        content = FileUtils.readWord(fileUrl);
+                    } else if (suffix.equals(".docx")) {
+                        content = FileUtils.readWordDocx(fileUrl);
+                    }
+                } catch (Exception e) {
+                    return AjaxResult.error("文件不存在解析失败");
+                }
+                //处理标识分段,并判断内容情况
+                Resume resume = ResumeAnalysisUtil.toResumeAnalysis(content);
+                //处理文件信息
+                String url = serverConfig.getUrl() + fileName;
+                String newFileName = com.ruoyi.common.utils.file.FileUtils.getName(fileName);
+                ResumeFile resumeFile = new ResumeFile();
+                resumeFile.setUploadPath(url);
+                resumeFile.setUploadName(newFileName);
+                resumeFile.setUploadType(newFileName.split("\\.")[1]);
+                resume.setResumeFile(resumeFile);
+                return AjaxResult.success(resume);
+            }else{
+                return AjaxResult.error("文件格式不正确请上传.doc或者.docx格式文件!");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return AjaxResult.error("解析失败!请手动录入");
+        }
+    }
+
+    /**
+     * 修改简历管理
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody Resume resume)
+    {
+        return toAjax(resumeService.updateResume(resume));
+    }
+
+    /**
+     * 删除简历管理
+     */
+	@DeleteMapping("/{resumeIds}")
+    public AjaxResult remove(@PathVariable Long[] resumeIds)
+    {
+        return toAjax(resumeService.deleteResumeByResumeIds(resumeIds));
+    }
+}

+ 1 - 1
ruoyi-common/pom.xml

@@ -136,7 +136,7 @@
         <dependency>
             <groupId>com.aliyun</groupId>
             <artifactId>dingtalk</artifactId>
-            <version>1.4.78</version>
+            <version>2.0.14</version>
         </dependency>
 
         <!-- 钉钉SDK -->

BIN
ruoyi-common/src/lib/hanlp-1.8.3.jar


+ 10 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -150,6 +150,16 @@ public class Constants
      */
     public static final String DAILY_DING_ACCESS_TOKEN = "DAILY_DING_ACCESS_TOKEN";
 
+    /**
+     *  钉钉redis缓存第三方应用token
+     */
+    public static final String DAILY_DING_CORP_ACCESS_TOKEN = "DAILY_DING_CORP_ACCESS_TOKEN";
+
+    /**
+     *  钉钉redis缓存第三方应用suiteTicket
+     */
+    public static final String DAILY_DING_SUITE_TICKET = "DAILY_DING_SUITE_TICKET";
+
     /**
      * 钉钉redis缓存key
      */

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dingding/config/DingAppConfig.java

@@ -22,6 +22,9 @@ public class DingAppConfig {
     @Value("${dingtalk.corp_id}")
     private String corpId;
 
+    @Value("${dingtalk.sso_secret}")
+    private String ssoSecret;
+
     public String getAppKey() {
         return appKey;
     }
@@ -53,4 +56,12 @@ public class DingAppConfig {
     public void setCorpId(String corpId) {
         this.corpId = corpId;
     }
+
+    public String getSsoSecret() {
+        return ssoSecret;
+    }
+
+    public void setSsoSecret(String ssoSecret) {
+        this.ssoSecret = ssoSecret;
+    }
 }

+ 12 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/dingding/config/DingUrlConstant.java

@@ -29,6 +29,8 @@ public class DingUrlConstant {
      */
     public static final String URL_USER_GET = HOST + "/user/get";
 
+    public static final String URL_USER_GET_V2 = HOST + "/topapi/v2/user/get";
+
     /**
      * 获取部门列表 url
      */
@@ -39,4 +41,14 @@ public class DingUrlConstant {
      */
     public static final String URL_USER_SIMPLELIST = HOST + "/user/simplelist";
 
+    /**
+     * 获取登录用户企业认证信息
+     */
+    public static final String URL_ORG_INFO = HOST + "/contact/organizations/authInfos";
+
+    /**
+     * 获取应用管理后台免登的用户信息
+     */
+    public static final String URL_SSO_USER_INFO = HOST + "/oauth2/ssoUserInfo";
+
 }

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 单点登录authSingleSignIn 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login","/authSingleSignIn","/ding/**","/fg/**", "/register", "/captchaImage").permitAll()
+                .antMatchers("/login","/authSingleSignIn","/ding/**","/mobile/**","/system/resume/**","/fg/**", "/register", "/captchaImage").permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 237 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/CompanyInfo.java

@@ -0,0 +1,237 @@
+package com.ruoyi.system.domain.resume;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 公司基本信息管理对象 company_info
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public class CompanyInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** Id */
+    private Long id;
+
+    /** 公司标识 */
+    @Excel(name = "公司标识")
+    private String companyId;
+
+    /** 公司全称 */
+    @Excel(name = "公司全称")
+    private String companyFullName;
+
+    /** 显示名称 */
+    @Excel(name = "显示名称")
+    private String companyName;
+
+    /** 英文全称 */
+    @Excel(name = "英文全称")
+    private String companyFullNameEn;
+
+    /** 所在地 */
+    @Excel(name = "所在地")
+    private String address;
+
+    /** 所属行业 */
+    @Excel(name = "所属行业")
+    private String industryId;
+
+    /** Logo图片 */
+    @Excel(name = "Logo图片")
+    private String logoPath;
+
+    /** 二级域名 */
+    @Excel(name = "二级域名")
+    private String SLD;
+
+    /** 钉钉用户所属的组织的企业corpId */
+    @Excel(name = "钉钉用户所属的组织的企业corpId")
+    private String corpId;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date createDate;
+
+    /** 创建者 */
+    @Excel(name = "创建者")
+    private String createUserId;
+
+    /** 最后一次更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后一次更新时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date updateDate;
+
+    /** 是否已删除;0-未删除;1-已删除 */
+    @Excel(name = "是否已删除;0-未删除;1-已删除")
+    private String isDelete;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String adminUser;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCompanyId(String companyId) 
+    {
+        this.companyId = companyId;
+    }
+
+    public String getCompanyId() 
+    {
+        return companyId;
+    }
+    public void setCompanyFullName(String companyFullName) 
+    {
+        this.companyFullName = companyFullName;
+    }
+
+    public String getCompanyFullName() 
+    {
+        return companyFullName;
+    }
+    public void setCompanyName(String companyName) 
+    {
+        this.companyName = companyName;
+    }
+
+    public String getCompanyName() 
+    {
+        return companyName;
+    }
+    public void setCompanyFullNameEn(String companyFullNameEn) 
+    {
+        this.companyFullNameEn = companyFullNameEn;
+    }
+
+    public String getCompanyFullNameEn() 
+    {
+        return companyFullNameEn;
+    }
+    public void setAddress(String address) 
+    {
+        this.address = address;
+    }
+
+    public String getAddress() 
+    {
+        return address;
+    }
+    public void setIndustryId(String industryId) 
+    {
+        this.industryId = industryId;
+    }
+
+    public String getIndustryId() 
+    {
+        return industryId;
+    }
+    public void setLogoPath(String logoPath) 
+    {
+        this.logoPath = logoPath;
+    }
+
+    public String getLogoPath() 
+    {
+        return logoPath;
+    }
+    public void setSLD(String SLD) 
+    {
+        this.SLD = SLD;
+    }
+
+    public String getSLD() 
+    {
+        return SLD;
+    }
+    public void setCorpId(String corpId) 
+    {
+        this.corpId = corpId;
+    }
+
+    public String getCorpId() 
+    {
+        return corpId;
+    }
+    public void setCreateDate(Date createDate) 
+    {
+        this.createDate = createDate;
+    }
+
+    public Date getCreateDate() 
+    {
+        return createDate;
+    }
+    public void setCreateUserId(String createUserId) 
+    {
+        this.createUserId = createUserId;
+    }
+
+    public String getCreateUserId() 
+    {
+        return createUserId;
+    }
+    public void setUpdateDate(Date updateDate) 
+    {
+        this.updateDate = updateDate;
+    }
+
+    public Date getUpdateDate() 
+    {
+        return updateDate;
+    }
+    public void setIsDelete(String isDelete) 
+    {
+        this.isDelete = isDelete;
+    }
+
+    public String getIsDelete() 
+    {
+        return isDelete;
+    }
+    public void setAdminUser(String adminUser) 
+    {
+        this.adminUser = adminUser;
+    }
+
+    public String getAdminUser() 
+    {
+        return adminUser;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("companyId", getCompanyId())
+            .append("companyFullName", getCompanyFullName())
+            .append("companyName", getCompanyName())
+            .append("companyFullNameEn", getCompanyFullNameEn())
+            .append("address", getAddress())
+            .append("industryId", getIndustryId())
+            .append("logoPath", getLogoPath())
+            .append("SLD", getSLD())
+            .append("corpId", getCorpId())
+            .append("createDate", getCreateDate())
+            .append("createUserId", getCreateUserId())
+            .append("updateDate", getUpdateDate())
+            .append("isDelete", getIsDelete())
+            .append("adminUser", getAdminUser())
+            .toString();
+    }
+}

+ 65 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/CompanyUser.java

@@ -0,0 +1,65 @@
+package com.ruoyi.system.domain.resume;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 公司和人关联关系管理对象 company_user
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public class CompanyUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long companyId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long userId;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setCompanyId(Long companyId) 
+    {
+        this.companyId = companyId;
+    }
+
+    public Long getCompanyId() 
+    {
+        return companyId;
+    }
+    public void setUserId(Long userId) 
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId() 
+    {
+        return userId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("companyId", getCompanyId())
+            .append("userId", getUserId())
+            .toString();
+    }
+}

+ 6 - 4
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/Resume.java

@@ -9,7 +9,7 @@ import java.util.List;
 @Data
 public class Resume {
 
-	private Integer resumeId;//简历ID
+	private Long resumeId;//简历ID
 
     private String resumeName;//简历名称
 
@@ -57,7 +57,7 @@ public class Resume {
 
     private String selfIntroduce;//自我介绍
 
-    private String userId;//用户ID
+    private Long userId;//用户ID
 
     private String headUrl;//用户图片地址
 
@@ -67,7 +67,7 @@ public class Resume {
 
     private Date createDate;//创建时间
 
-    private String updateUserId;//修改人
+    private Long updateUserId;//修改人
 
     private Date updateDate;//更新时间
     
@@ -146,6 +146,8 @@ public class Resume {
 
     private Boolean isEnabled;// 是否可用
 
-    private String primaryScreeningUserId;// 简历初筛人员
+    private Long primaryScreeningUserId;// 简历初筛人员
+
+    private ResumeFile resumeFile;//简历附件
 
 }

+ 136 - 14
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeEducation.java

@@ -1,27 +1,149 @@
 package com.ruoyi.system.domain.resume;
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
 
-import lombok.Data;
+/**
+ * 简历教育信息管理对象 resume_education
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public class ResumeEducation extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
 
-@Data
-public class ResumeEducation {
+    /** 教育记录ID */
+    private Long eduId;
 
-	private Integer eduId;//教育记录ID
+    /** 学校名称 */
+    @Excel(name = "学校名称")
+    private String schoolName;
 
-    private String schoolName;//学校名称
+    /** 专业 */
+    @Excel(name = "专业")
+    private String major;
 
-    private String major;//专业
+    /** 入学时间 */
+    @Excel(name = "入学时间")
+    private String eduStartDate;
 
-    private String eduStartDate;//入学时间
+    /** 毕业时间 */
+    @Excel(name = "毕业时间")
+    private String eduEndDate;
 
-    private String eduEndDate;//毕业时间
+    /** 学历 */
+    @Excel(name = "学历")
+    private String degree;
 
-    private String degree;//学历
+    /** 简历ID(外键) */
+    @Excel(name = "简历ID(外键)")
+    private Long resumeId;
 
-    private Integer resumeId;//简历ID(外键)
+    /** 描述 */
+    @Excel(name = "描述")
+    private String detail;
 
-    private String detail;//描述
-    
-    private Integer orderBy;//排序
+    /** 排序 */
+    @Excel(name = "排序")
+    private Long orderBy;
 
-}
+    public void setEduId(Long eduId) 
+    {
+        this.eduId = eduId;
+    }
+
+    public Long getEduId() 
+    {
+        return eduId;
+    }
+    public void setSchoolName(String schoolName) 
+    {
+        this.schoolName = schoolName;
+    }
+
+    public String getSchoolName() 
+    {
+        return schoolName;
+    }
+    public void setMajor(String major) 
+    {
+        this.major = major;
+    }
+
+    public String getMajor() 
+    {
+        return major;
+    }
+    public void setEduStartDate(String eduStartDate) 
+    {
+        this.eduStartDate = eduStartDate;
+    }
+
+    public String getEduStartDate() 
+    {
+        return eduStartDate;
+    }
+    public void setEduEndDate(String eduEndDate) 
+    {
+        this.eduEndDate = eduEndDate;
+    }
+
+    public String getEduEndDate() 
+    {
+        return eduEndDate;
+    }
+    public void setDegree(String degree) 
+    {
+        this.degree = degree;
+    }
+
+    public String getDegree() 
+    {
+        return degree;
+    }
+    public void setResumeId(Long resumeId) 
+    {
+        this.resumeId = resumeId;
+    }
+
+    public Long getResumeId() 
+    {
+        return resumeId;
+    }
+    public void setDetail(String detail) 
+    {
+        this.detail = detail;
+    }
+
+    public String getDetail() 
+    {
+        return detail;
+    }
+    public void setOrderBy(Long orderBy) 
+    {
+        this.orderBy = orderBy;
+    }
+
+    public Long getOrderBy() 
+    {
+        return orderBy;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("eduId", getEduId())
+            .append("schoolName", getSchoolName())
+            .append("major", getMajor())
+            .append("eduStartDate", getEduStartDate())
+            .append("eduEndDate", getEduEndDate())
+            .append("degree", getDegree())
+            .append("resumeId", getResumeId())
+            .append("detail", getDetail())
+            .append("orderBy", getOrderBy())
+            .toString();
+    }
+}

+ 25 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeFile.java

@@ -0,0 +1,25 @@
+package com.ruoyi.system.domain.resume;
+
+import lombok.Data;
+
+/**
+ * 简历附件
+ */
+@Data
+public class ResumeFile {
+
+    private Integer id;
+
+    private String fileId;
+
+    private Long resumeId;
+
+    private String uploadName;
+
+    private String uploadType;
+
+    private String uploadPath;
+
+    private String delFlag;
+
+}

+ 150 - 16
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeProject.java

@@ -1,29 +1,163 @@
 package com.ruoyi.system.domain.resume;
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
 
-import lombok.Data;
+/**
+ * 简历项目信息管理对象 resume_project
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public class ResumeProject extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
 
-@Data
-public class ResumeProject {
+    /** 项目记录ID */
+    private Long projectId;
 
-	private Integer projectId;//项目记录ID
+    /** 项目名称 */
+    @Excel(name = "项目名称")
+    private String projectName;
 
-    private String projectName;//项目名称
+    /** 项目描述 */
+    @Excel(name = "项目描述")
+    private String projectDetail;
 
-    private String projectDetail;//项目描述
+    /** 责任描述 */
+    @Excel(name = "责任描述")
+    private String partIn;
 
-    private String partIn;//责任描述
+    /** 项目开始时间 */
+    @Excel(name = "项目开始时间")
+    private String projectStartDate;
 
-    private String projectStartDate;//项目开始时间
+    /** 项目结束时间 */
+    @Excel(name = "项目结束时间")
+    private String projectEndDate;
 
-    private String projectEndDate;//项目结束时间
+    /** 简历ID(外键) */
+    @Excel(name = "简历ID(外键)")
+    private Long resumeId;
 
-    private Integer resumeId;//简历ID(外键)
+    /** 软件环境 */
+    @Excel(name = "软件环境")
+    private String developEnvironment;
 
-    private String developEnvironment;//软件环境
+    /** 开发工具 */
+    @Excel(name = "开发工具")
+    private String developTools;
 
-    private String developTools;//开发工具
-    
-    private Integer orderBy;//排序字段
-    
-}
+    /** 排序字段 */
+    @Excel(name = "排序字段")
+    private Long orderBy;
+
+    public void setProjectId(Long projectId) 
+    {
+        this.projectId = projectId;
+    }
+
+    public Long getProjectId() 
+    {
+        return projectId;
+    }
+    public void setProjectName(String projectName) 
+    {
+        this.projectName = projectName;
+    }
+
+    public String getProjectName() 
+    {
+        return projectName;
+    }
+    public void setProjectDetail(String projectDetail) 
+    {
+        this.projectDetail = projectDetail;
+    }
+
+    public String getProjectDetail() 
+    {
+        return projectDetail;
+    }
+    public void setPartIn(String partIn) 
+    {
+        this.partIn = partIn;
+    }
+
+    public String getPartIn() 
+    {
+        return partIn;
+    }
+    public void setProjectStartDate(String projectStartDate) 
+    {
+        this.projectStartDate = projectStartDate;
+    }
+
+    public String getProjectStartDate() 
+    {
+        return projectStartDate;
+    }
+    public void setProjectEndDate(String projectEndDate) 
+    {
+        this.projectEndDate = projectEndDate;
+    }
+
+    public String getProjectEndDate() 
+    {
+        return projectEndDate;
+    }
+    public void setResumeId(Long resumeId) 
+    {
+        this.resumeId = resumeId;
+    }
+
+    public Long getResumeId() 
+    {
+        return resumeId;
+    }
+    public void setDevelopEnvironment(String developEnvironment) 
+    {
+        this.developEnvironment = developEnvironment;
+    }
+
+    public String getDevelopEnvironment() 
+    {
+        return developEnvironment;
+    }
+    public void setDevelopTools(String developTools) 
+    {
+        this.developTools = developTools;
+    }
+
+    public String getDevelopTools() 
+    {
+        return developTools;
+    }
+    public void setOrderBy(Long orderBy) 
+    {
+        this.orderBy = orderBy;
+    }
+
+    public Long getOrderBy() 
+    {
+        return orderBy;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("projectId", getProjectId())
+            .append("projectName", getProjectName())
+            .append("projectDetail", getProjectDetail())
+            .append("partIn", getPartIn())
+            .append("projectStartDate", getProjectStartDate())
+            .append("projectEndDate", getProjectEndDate())
+            .append("resumeId", getResumeId())
+            .append("developEnvironment", getDevelopEnvironment())
+            .append("developTools", getDevelopTools())
+            .append("orderBy", getOrderBy())
+            .toString();
+    }
+}

+ 177 - 19
ruoyi-system/src/main/java/com/ruoyi/system/domain/resume/ResumeWork.java

@@ -1,33 +1,191 @@
 package com.ruoyi.system.domain.resume;
 
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
 
-import lombok.Data;
+/**
+ * 简历工作经历信息管理对象 resume_work
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public class ResumeWork extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
 
-@Data
-public class ResumeWork {
- 
-	private Integer workId;//工作记录ID
+    /** 工作记录ID */
+    private Long workId;
 
-    private String iinductionStartDate;//入职时间
+    /** 公司名称 */
+    @Excel(name = "公司名称")
+    private String companyName;
 
-    private String iinductionEndDate;//离职时间
+    /** 公司地址 */
+    @Excel(name = "公司地址")
+    private String companyPosition;
 
-    private Integer resumeId;//简历ID(外键)
-    
-    private String companyName;//公司名称
+    /** 证明人 */
+    @Excel(name = "证明人")
+    private String leaderName;
 
-    private String companyPosition;//公司地址
+    /** 证明人联系方式 */
+    @Excel(name = "证明人联系方式")
+    private String leaderMobile;
 
-    private String leaderName;//证明人
+    /** 入职时间 */
+    @Excel(name = "入职时间")
+    private String iinductionStartDate;
 
-    private String leaderMobile;//证明人联系方式
+    /** 离职时间 */
+    @Excel(name = "离职时间")
+    private String iinductionEndDate;
 
-    private String postionName;//岗位
+    /** 岗位 */
+    @Excel(name = "岗位")
+    private String postionName;
 
-    private String workDetail;//工作描述
+    /** 工作描述 */
+    @Excel(name = "工作描述")
+    private String workDetail;
 
-    private String reason;//离职原因
-    
-    private Integer orderBy;//排序
+    /** 简历ID(外键) */
+    @Excel(name = "简历ID(外键)")
+    private Long resumeId;
 
-}
+    /** 排序 */
+    @Excel(name = "排序")
+    private Long orderBy;
+
+    /** 离职原因 */
+    @Excel(name = "离职原因")
+    private String reason;
+
+    public void setWorkId(Long workId) 
+    {
+        this.workId = workId;
+    }
+
+    public Long getWorkId() 
+    {
+        return workId;
+    }
+    public void setCompanyName(String companyName) 
+    {
+        this.companyName = companyName;
+    }
+
+    public String getCompanyName() 
+    {
+        return companyName;
+    }
+    public void setCompanyPosition(String companyPosition) 
+    {
+        this.companyPosition = companyPosition;
+    }
+
+    public String getCompanyPosition() 
+    {
+        return companyPosition;
+    }
+    public void setLeaderName(String leaderName) 
+    {
+        this.leaderName = leaderName;
+    }
+
+    public String getLeaderName() 
+    {
+        return leaderName;
+    }
+    public void setLeaderMobile(String leaderMobile) 
+    {
+        this.leaderMobile = leaderMobile;
+    }
+
+    public String getLeaderMobile() 
+    {
+        return leaderMobile;
+    }
+    public void setIinductionStartDate(String iinductionStartDate) 
+    {
+        this.iinductionStartDate = iinductionStartDate;
+    }
+
+    public String getIinductionStartDate() 
+    {
+        return iinductionStartDate;
+    }
+    public void setIinductionEndDate(String iinductionEndDate) 
+    {
+        this.iinductionEndDate = iinductionEndDate;
+    }
+
+    public String getIinductionEndDate() 
+    {
+        return iinductionEndDate;
+    }
+    public void setPostionName(String postionName) 
+    {
+        this.postionName = postionName;
+    }
+
+    public String getPostionName() 
+    {
+        return postionName;
+    }
+    public void setWorkDetail(String workDetail) 
+    {
+        this.workDetail = workDetail;
+    }
+
+    public String getWorkDetail() 
+    {
+        return workDetail;
+    }
+    public void setResumeId(Long resumeId) 
+    {
+        this.resumeId = resumeId;
+    }
+
+    public Long getResumeId() 
+    {
+        return resumeId;
+    }
+    public void setOrderBy(Long orderBy) 
+    {
+        this.orderBy = orderBy;
+    }
+
+    public Long getOrderBy() 
+    {
+        return orderBy;
+    }
+    public void setReason(String reason) 
+    {
+        this.reason = reason;
+    }
+
+    public String getReason() 
+    {
+        return reason;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("workId", getWorkId())
+            .append("companyName", getCompanyName())
+            .append("companyPosition", getCompanyPosition())
+            .append("leaderName", getLeaderName())
+            .append("leaderMobile", getLeaderMobile())
+            .append("iinductionStartDate", getIinductionStartDate())
+            .append("iinductionEndDate", getIinductionEndDate())
+            .append("postionName", getPostionName())
+            .append("workDetail", getWorkDetail())
+            .append("resumeId", getResumeId())
+            .append("orderBy", getOrderBy())
+            .append("reason", getReason())
+            .toString();
+    }
+}

+ 8 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java

@@ -104,4 +104,12 @@ public interface SysRoleMapper
      * @return 结果
      */
     public int deleteRoleByIds(Long[] roleIds);
+
+    /**
+     * 通过权限key查询权限数据
+     *
+     * @param roleKey
+     * @return
+     */
+    SysRole selectRoleByKey(String roleKey);
 }

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/CompanyInfoMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.CompanyInfo;
+
+import java.util.List;
+
+/**
+ * 公司基本信息管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface CompanyInfoMapper 
+{
+    /**
+     * 查询公司基本信息管理
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 公司基本信息管理
+     */
+    public CompanyInfo selectCompanyInfoById(Long id);
+
+    /**
+     * 查询公司基本信息管理列表
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 公司基本信息管理集合
+     */
+    public List<CompanyInfo> selectCompanyInfoList(CompanyInfo companyInfo);
+
+    /**
+     * 新增公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    public int insertCompanyInfo(CompanyInfo companyInfo);
+
+    /**
+     * 修改公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    public int updateCompanyInfo(CompanyInfo companyInfo);
+
+    /**
+     * 删除公司基本信息管理
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 结果
+     */
+    public int deleteCompanyInfoById(Long id);
+
+    /**
+     * 批量删除公司基本信息管理
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCompanyInfoByIds(Long[] ids);
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/CompanyUserMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.CompanyUser;
+
+import java.util.List;
+
+/**
+ * 公司和人关联关系管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface CompanyUserMapper 
+{
+    /**
+     * 查询公司和人关联关系管理
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 公司和人关联关系管理
+     */
+    public CompanyUser selectCompanyUserById(Long id);
+
+    /**
+     * 查询公司和人关联关系管理列表
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 公司和人关联关系管理集合
+     */
+    public List<CompanyUser> selectCompanyUserList(CompanyUser companyUser);
+
+    /**
+     * 新增公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    public int insertCompanyUser(CompanyUser companyUser);
+
+    /**
+     * 修改公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    public int updateCompanyUser(CompanyUser companyUser);
+
+    /**
+     * 删除公司和人关联关系管理
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 结果
+     */
+    public int deleteCompanyUserById(Long id);
+
+    /**
+     * 批量删除公司和人关联关系管理
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteCompanyUserByIds(Long[] ids);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeEducationMapper.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.ResumeEducation;
+
+import java.util.List;
+
+/**
+ * 简历教育信息管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ResumeEducationMapper 
+{
+    /**
+     * 查询简历教育信息管理
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 简历教育信息管理
+     */
+    public ResumeEducation selectResumeEducationByEduId(Long eduId);
+
+    /**
+     * 查询简历教育信息管理列表
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 简历教育信息管理集合
+     */
+    public List<ResumeEducation> selectResumeEducationList(ResumeEducation resumeEducation);
+
+    /**
+     * 新增简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    public int insertResumeEducation(ResumeEducation resumeEducation);
+
+    /**
+     * 修改简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    public int updateResumeEducation(ResumeEducation resumeEducation);
+
+    /**
+     * 删除简历教育信息管理
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeEducationByEduId(Long eduId);
+
+    /**
+     * 批量删除简历教育信息管理
+     * 
+     * @param eduIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteResumeEducationByEduIds(Long[] eduIds);
+
+    /**
+     * 根据简历ID删除简历教育信息
+     *
+     * @param resumeId
+     * @return
+     */
+    int deleteResumeEducationByResumeId(Long resumeId);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeFileMapper.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.ResumeFile;
+
+import java.util.List;
+
+/**
+ * 简历附件管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-19
+ */
+public interface ResumeFileMapper 
+{
+    /**
+     * 查询简历附件管理
+     * 
+     * @param id 简历附件管理主键
+     * @return 简历附件管理
+     */
+    public ResumeFile selectResumeFileById(Long id);
+
+    /**
+     * 查询简历附件管理列表
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 简历附件管理集合
+     */
+    public List<ResumeFile> selectResumeFileList(ResumeFile resumeFile);
+
+    /**
+     * 新增简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    public int insertResumeFile(ResumeFile resumeFile);
+
+    /**
+     * 修改简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    public int updateResumeFile(ResumeFile resumeFile);
+
+    /**
+     * 删除简历附件管理
+     * 
+     * @param id 简历附件管理主键
+     * @return 结果
+     */
+    public int deleteResumeFileById(Long id);
+
+    /**
+     * 批量删除简历附件管理
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteResumeFileByIds(Long[] ids);
+
+    /**
+     * 删除简历附件管理信息
+     *
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    int deleteResumeFileByResumeId(Long resumeId);
+}

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper.resume;
+
+import java.util.List;
+import com.ruoyi.system.domain.resume.Resume;
+
+/**
+ * 简历管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-18
+ */
+public interface ResumeMapper 
+{
+    /**
+     * 查询简历管理
+     * 
+     * @param resumeId 简历管理主键
+     * @return 简历管理
+     */
+    public Resume selectResumeByResumeId(Long resumeId);
+
+    /**
+     * 查询简历管理列表
+     * 
+     * @param resume 简历管理
+     * @return 简历管理集合
+     */
+    public List<Resume> selectResumeList(Resume resume);
+
+    /**
+     * 新增简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    public int insertResume(Resume resume);
+
+    /**
+     * 修改简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    public int updateResume(Resume resume);
+
+    /**
+     * 删除简历管理
+     * 
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    public int deleteResumeByResumeId(Long resumeId);
+
+    /**
+     * 批量删除简历管理
+     * 
+     * @param resumeIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteResumeByResumeIds(Long[] resumeIds);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeProjectMapper.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.ResumeProject;
+
+import java.util.List;
+
+/**
+ * 简历项目信息管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ResumeProjectMapper 
+{
+    /**
+     * 查询简历项目信息管理
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 简历项目信息管理
+     */
+    public ResumeProject selectResumeProjectByProjectId(Long projectId);
+
+    /**
+     * 查询简历项目信息管理列表
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 简历项目信息管理集合
+     */
+    public List<ResumeProject> selectResumeProjectList(ResumeProject resumeProject);
+
+    /**
+     * 新增简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    public int insertResumeProject(ResumeProject resumeProject);
+
+    /**
+     * 修改简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    public int updateResumeProject(ResumeProject resumeProject);
+
+    /**
+     * 删除简历项目信息管理
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeProjectByProjectId(Long projectId);
+
+    /**
+     * 批量删除简历项目信息管理
+     * 
+     * @param projectIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteResumeProjectByProjectIds(Long[] projectIds);
+
+    /**
+     * 根据简历ID删除简历项目经验信息
+     *
+     * @param resumeId
+     * @return
+     */
+    int deleteResumeProjectByResumeId(Long resumeId);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/resume/ResumeWorkMapper.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.mapper.resume;
+
+import com.ruoyi.system.domain.resume.ResumeWork;
+
+import java.util.List;
+
+/**
+ * 简历工作经历信息管理Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ResumeWorkMapper 
+{
+    /**
+     * 查询简历工作经历信息管理
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 简历工作经历信息管理
+     */
+    public ResumeWork selectResumeWorkByWorkId(Long workId);
+
+    /**
+     * 查询简历工作经历信息管理列表
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 简历工作经历信息管理集合
+     */
+    public List<ResumeWork> selectResumeWorkList(ResumeWork resumeWork);
+
+    /**
+     * 新增简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    public int insertResumeWork(ResumeWork resumeWork);
+
+    /**
+     * 修改简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    public int updateResumeWork(ResumeWork resumeWork);
+
+    /**
+     * 删除简历工作经历信息管理
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeWorkByWorkId(Long workId);
+
+    /**
+     * 批量删除简历工作经历信息管理
+     * 
+     * @param workIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteResumeWorkByWorkIds(Long[] workIds);
+
+    /**
+     * 根据简历ID删除简历工作履历信息
+     *
+     * @param resumeId
+     * @return
+     */
+    int deleteResumeWorkByResumeId(Long resumeId);
+}

+ 8 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java

@@ -170,4 +170,12 @@ public interface ISysRoleService
      * @return 结果
      */
     public int insertAuthUsers(Long roleId, Long[] userIds);
+
+    /**
+     * 通过权限key查询权限数据
+     *
+     * @param roleKey
+     * @return
+     */
+    SysRole selectRoleByKey(String roleKey);
 }

+ 84 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/dingding/DingTokenService.java

@@ -1,8 +1,8 @@
 package com.ruoyi.system.service.dingding;
 
 import com.aliyun.dingtalkoauth2_1_0.Client;
-import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenRequest;
-import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
+import com.aliyun.dingtalkoauth2_1_0.models.*;
+import com.aliyun.tea.TeaException;
 import com.aliyun.teaopenapi.models.Config;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.request.OapiGetJsapiTicketRequest;
@@ -83,6 +83,54 @@ public class DingTokenService {
         return AjaxResult.success(accessToken);
     }
 
+    /**
+     * 在此方法中,为了避免频繁获取access_token,
+     * 在距离上一次获取access_token时间在两个小时之内的情况,
+     * 将直接从持久化存储中读取access_token
+     * <p>
+     * 因为access_token和jsapi_ticket的过期时间都是7200秒
+     * 所以在获取access_token的同时也去获取了jsapi_ticket
+     * 注:jsapi_ticket是在前端页面JSAPI做权限验证配置的时候需要使用的
+     * 具体信息请查看开发者文档--权限验证配置
+     *
+     * @return accessToken 或错误信息
+     */
+    public String getCorpAccessToken() {
+        // 从持久化存储中读取
+        String corpAccessToken = redisCache.getCacheObject(Constants.DAILY_DING_CORP_ACCESS_TOKEN);
+        log.info("从Redis缓存中获取到的corpAccessToken = {}", corpAccessToken);
+        if (corpAccessToken != null) {
+            return corpAccessToken;
+        }
+        try {
+            com.aliyun.dingtalkoauth2_1_0.Client client = this.createClientNew();
+            String suiteTicket = redisCache.getCacheObject(Constants.DAILY_DING_SUITE_TICKET);
+            com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenRequest getCorpAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetCorpAccessTokenRequest()
+                    .setSuiteKey(dingAppConfig.getAppKey())
+                    .setSuiteSecret(dingAppConfig.getAppSecret())
+                    .setAuthCorpId(dingAppConfig.getCorpId())
+                    .setSuiteTicket(suiteTicket);
+            GetCorpAccessTokenResponse response = client.getCorpAccessToken(getCorpAccessTokenRequest);
+            corpAccessToken = response.getBody().getAccessToken();
+            log.info("向Redis缓存中存取corpAccessToken = {}", corpAccessToken);
+            redisCache.setCacheObject(Constants.DAILY_DING_CORP_ACCESS_TOKEN, corpAccessToken, CACHE_TTL, TimeUnit.MINUTES);
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed",err.message);
+            }
+            return corpAccessToken;
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed",err.message);
+            }
+            return corpAccessToken;
+        }
+        return corpAccessToken;
+    }
+
     /**
      * 使用 Token 初始化账号Client
      * @return Client
@@ -165,5 +213,39 @@ public class DingTokenService {
         return AjaxResult.success(ticket);
     }
 
+    private static com.aliyun.dingtalkoauth2_1_0.Client createClientNew() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
+    }
+
+
+
+    /**
+     *  获取用户toKen
+     * @return
+     */
+    public String getAdminUserAccessToken(){
+        String accessToken = null;
+        try {
+            com.aliyun.dingtalkoauth2_1_0.Client client = this.createClientNew();
+            GetSsoAccessTokenRequest getSsoAccessTokenRequest = new GetSsoAccessTokenRequest()
+                    .setCorpid(dingAppConfig.getCorpId())
+                    .setSsoSecret(dingAppConfig.getSsoSecret());
+            GetSsoAccessTokenResponse response = client.getSsoAccessToken(getSsoAccessTokenRequest);
+            // 获取企业的access_token
+            accessToken = response.getBody().getAccessToken();
+            return accessToken;
+        } catch (ApiException e) {
+            log.error("getAccessToken failed", e);
+        } catch (Exception e) {
+            log.error("getAccessToken failed", e);
+        }
+        return accessToken;
+    }
+
+
+
 
 }

+ 11 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java

@@ -421,4 +421,15 @@ public class SysRoleServiceImpl implements ISysRoleService
         }
         return userRoleMapper.batchUserRole(list);
     }
+
+    /**
+     * 通过权限key查询权限数据
+     *
+     * @param roleKey
+     * @return
+     */
+    @Override
+    public SysRole selectRoleByKey(String roleKey) {
+        return roleMapper.selectRoleByKey(roleKey);
+    }
 }

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/ICompanyInfoService.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.CompanyInfo;
+
+import java.util.List;
+
+/**
+ * 公司基本信息管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ICompanyInfoService 
+{
+    /**
+     * 查询公司基本信息管理
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 公司基本信息管理
+     */
+    public CompanyInfo selectCompanyInfoById(Long id);
+
+    /**
+     * 查询公司基本信息管理列表
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 公司基本信息管理集合
+     */
+    public List<CompanyInfo> selectCompanyInfoList(CompanyInfo companyInfo);
+
+    /**
+     * 新增公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    public int insertCompanyInfo(CompanyInfo companyInfo);
+
+    /**
+     * 修改公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    public int updateCompanyInfo(CompanyInfo companyInfo);
+
+    /**
+     * 批量删除公司基本信息管理
+     * 
+     * @param ids 需要删除的公司基本信息管理主键集合
+     * @return 结果
+     */
+    public int deleteCompanyInfoByIds(Long[] ids);
+
+    /**
+     * 删除公司基本信息管理信息
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 结果
+     */
+    public int deleteCompanyInfoById(Long id);
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/ICompanyUserService.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.CompanyUser;
+
+import java.util.List;
+
+/**
+ * 公司和人关联关系管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface ICompanyUserService 
+{
+    /**
+     * 查询公司和人关联关系管理
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 公司和人关联关系管理
+     */
+    public CompanyUser selectCompanyUserById(Long id);
+
+    /**
+     * 查询公司和人关联关系管理列表
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 公司和人关联关系管理集合
+     */
+    public List<CompanyUser> selectCompanyUserList(CompanyUser companyUser);
+
+    /**
+     * 新增公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    public int insertCompanyUser(CompanyUser companyUser);
+
+    /**
+     * 修改公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    public int updateCompanyUser(CompanyUser companyUser);
+
+    /**
+     * 批量删除公司和人关联关系管理
+     * 
+     * @param ids 需要删除的公司和人关联关系管理主键集合
+     * @return 结果
+     */
+    public int deleteCompanyUserByIds(Long[] ids);
+
+    /**
+     * 删除公司和人关联关系管理信息
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 结果
+     */
+    public int deleteCompanyUserById(Long id);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeEducationService.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.ResumeEducation;
+
+import java.util.List;
+
+/**
+ * 简历教育信息管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface IResumeEducationService 
+{
+    /**
+     * 查询简历教育信息管理
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 简历教育信息管理
+     */
+    public ResumeEducation selectResumeEducationByEduId(Long eduId);
+
+    /**
+     * 查询简历教育信息管理列表
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 简历教育信息管理集合
+     */
+    public List<ResumeEducation> selectResumeEducationList(ResumeEducation resumeEducation);
+
+    /**
+     * 新增简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    public int insertResumeEducation(ResumeEducation resumeEducation);
+
+    /**
+     * 修改简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    public int updateResumeEducation(ResumeEducation resumeEducation);
+
+    /**
+     * 批量删除简历教育信息管理
+     * 
+     * @param eduIds 需要删除的简历教育信息管理主键集合
+     * @return 结果
+     */
+    public int deleteResumeEducationByEduIds(Long[] eduIds);
+
+    /**
+     * 删除简历教育信息管理信息
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeEducationByEduId(Long eduId);
+
+    /**
+     * 根据简历ID删除简历教育经历信息
+     *
+     * @param resumeId
+     * @return
+     */
+    public int deleteResumeEducationByResumeId(Long resumeId);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeFileService.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.ResumeFile;
+
+import java.util.List;
+
+/**
+ * 简历附件管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-19
+ */
+public interface IResumeFileService 
+{
+    /**
+     * 查询简历附件管理
+     * 
+     * @param id 简历附件管理主键
+     * @return 简历附件管理
+     */
+    public ResumeFile selectResumeFileById(Long id);
+
+    /**
+     * 查询简历附件管理列表
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 简历附件管理集合
+     */
+    public List<ResumeFile> selectResumeFileList(ResumeFile resumeFile);
+
+    /**
+     * 新增简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    public int insertResumeFile(ResumeFile resumeFile);
+
+    /**
+     * 修改简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    public int updateResumeFile(ResumeFile resumeFile);
+
+    /**
+     * 批量删除简历附件管理
+     * 
+     * @param ids 需要删除的简历附件管理主键集合
+     * @return 结果
+     */
+    public int deleteResumeFileByIds(Long[] ids);
+
+    /**
+     * 删除简历附件管理信息
+     * 
+     * @param id 简历附件管理主键
+     * @return 结果
+     */
+    public int deleteResumeFileById(Long id);
+
+    /**
+     * 删除简历附件管理信息
+     *
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    public int deleteResumeFileByResumeId(Long resumeId);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeProjectService.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.ResumeProject;
+
+import java.util.List;
+
+/**
+ * 简历项目信息管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface IResumeProjectService 
+{
+    /**
+     * 查询简历项目信息管理
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 简历项目信息管理
+     */
+    public ResumeProject selectResumeProjectByProjectId(Long projectId);
+
+    /**
+     * 查询简历项目信息管理列表
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 简历项目信息管理集合
+     */
+    public List<ResumeProject> selectResumeProjectList(ResumeProject resumeProject);
+
+    /**
+     * 新增简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    public int insertResumeProject(ResumeProject resumeProject);
+
+    /**
+     * 修改简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    public int updateResumeProject(ResumeProject resumeProject);
+
+    /**
+     * 批量删除简历项目信息管理
+     * 
+     * @param projectIds 需要删除的简历项目信息管理主键集合
+     * @return 结果
+     */
+    public int deleteResumeProjectByProjectIds(Long[] projectIds);
+
+    /**
+     * 删除简历项目信息管理信息
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeProjectByProjectId(Long projectId);
+
+    /**
+     * 根据简历ID删除简历项目经验信息
+     *
+     * @param resumeId
+     * @return
+     */
+    public int deleteResumeProjectByResumeId(Long resumeId);
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeService.java

@@ -0,0 +1,62 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.Resume;
+
+import java.util.List;
+
+/**
+ * 简历管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-18
+ */
+public interface IResumeService 
+{
+    /**
+     * 查询简历管理
+     * 
+     * @param resumeId 简历管理主键
+     * @return 简历管理
+     */
+    public Resume selectResumeByResumeId(Long resumeId);
+
+    /**
+     * 查询简历管理列表
+     * 
+     * @param resume 简历管理
+     * @return 简历管理集合
+     */
+    public List<Resume> selectResumeList(Resume resume);
+
+    /**
+     * 新增简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    public int insertResume(Resume resume);
+
+    /**
+     * 修改简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    public int updateResume(Resume resume);
+
+    /**
+     * 批量删除简历管理
+     * 
+     * @param resumeIds 需要删除的简历管理主键集合
+     * @return 结果
+     */
+    public int deleteResumeByResumeIds(Long[] resumeIds);
+
+    /**
+     * 删除简历管理信息
+     * 
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    public int deleteResumeByResumeId(Long resumeId);
+}

+ 70 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/IResumeWorkService.java

@@ -0,0 +1,70 @@
+package com.ruoyi.system.service.resume;
+
+import com.ruoyi.system.domain.resume.ResumeWork;
+
+import java.util.List;
+
+/**
+ * 简历工作经历信息管理Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+public interface IResumeWorkService 
+{
+    /**
+     * 查询简历工作经历信息管理
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 简历工作经历信息管理
+     */
+    public ResumeWork selectResumeWorkByWorkId(Long workId);
+
+    /**
+     * 查询简历工作经历信息管理列表
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 简历工作经历信息管理集合
+     */
+    public List<ResumeWork> selectResumeWorkList(ResumeWork resumeWork);
+
+    /**
+     * 新增简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    public int insertResumeWork(ResumeWork resumeWork);
+
+    /**
+     * 修改简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    public int updateResumeWork(ResumeWork resumeWork);
+
+    /**
+     * 批量删除简历工作经历信息管理
+     * 
+     * @param workIds 需要删除的简历工作经历信息管理主键集合
+     * @return 结果
+     */
+    public int deleteResumeWorkByWorkIds(Long[] workIds);
+
+    /**
+     * 删除简历工作经历信息管理信息
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 结果
+     */
+    public int deleteResumeWorkByWorkId(Long workId);
+
+    /**
+     * 根据简历ID删除简历工作履历信息
+     *
+     * @param resumeId
+     * @return
+     */
+    public int deleteResumeWorkByResumeId(Long resumeId);
+}

+ 94 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/CompanyInfoServiceImpl.java

@@ -0,0 +1,94 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.CompanyInfo;
+import com.ruoyi.system.mapper.resume.CompanyInfoMapper;
+import com.ruoyi.system.service.resume.ICompanyInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 公司基本信息管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class CompanyInfoServiceImpl implements ICompanyInfoService
+{
+    @Autowired
+    private CompanyInfoMapper companyInfoMapper;
+
+    /**
+     * 查询公司基本信息管理
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 公司基本信息管理
+     */
+    @Override
+    public CompanyInfo selectCompanyInfoById(Long id)
+    {
+        return companyInfoMapper.selectCompanyInfoById(id);
+    }
+
+    /**
+     * 查询公司基本信息管理列表
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 公司基本信息管理
+     */
+    @Override
+    public List<CompanyInfo> selectCompanyInfoList(CompanyInfo companyInfo)
+    {
+        return companyInfoMapper.selectCompanyInfoList(companyInfo);
+    }
+
+    /**
+     * 新增公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    @Override
+    public int insertCompanyInfo(CompanyInfo companyInfo)
+    {
+        return companyInfoMapper.insertCompanyInfo(companyInfo);
+    }
+
+    /**
+     * 修改公司基本信息管理
+     * 
+     * @param companyInfo 公司基本信息管理
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyInfo(CompanyInfo companyInfo)
+    {
+        return companyInfoMapper.updateCompanyInfo(companyInfo);
+    }
+
+    /**
+     * 批量删除公司基本信息管理
+     * 
+     * @param ids 需要删除的公司基本信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyInfoByIds(Long[] ids)
+    {
+        return companyInfoMapper.deleteCompanyInfoByIds(ids);
+    }
+
+    /**
+     * 删除公司基本信息管理信息
+     * 
+     * @param id 公司基本信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyInfoById(Long id)
+    {
+        return companyInfoMapper.deleteCompanyInfoById(id);
+    }
+}

+ 94 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/CompanyUserServiceImpl.java

@@ -0,0 +1,94 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.CompanyUser;
+import com.ruoyi.system.mapper.resume.CompanyUserMapper;
+import com.ruoyi.system.service.resume.ICompanyUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 公司和人关联关系管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class CompanyUserServiceImpl implements ICompanyUserService
+{
+    @Autowired
+    private CompanyUserMapper companyUserMapper;
+
+    /**
+     * 查询公司和人关联关系管理
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 公司和人关联关系管理
+     */
+    @Override
+    public CompanyUser selectCompanyUserById(Long id)
+    {
+        return companyUserMapper.selectCompanyUserById(id);
+    }
+
+    /**
+     * 查询公司和人关联关系管理列表
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 公司和人关联关系管理
+     */
+    @Override
+    public List<CompanyUser> selectCompanyUserList(CompanyUser companyUser)
+    {
+        return companyUserMapper.selectCompanyUserList(companyUser);
+    }
+
+    /**
+     * 新增公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    @Override
+    public int insertCompanyUser(CompanyUser companyUser)
+    {
+        return companyUserMapper.insertCompanyUser(companyUser);
+    }
+
+    /**
+     * 修改公司和人关联关系管理
+     * 
+     * @param companyUser 公司和人关联关系管理
+     * @return 结果
+     */
+    @Override
+    public int updateCompanyUser(CompanyUser companyUser)
+    {
+        return companyUserMapper.updateCompanyUser(companyUser);
+    }
+
+    /**
+     * 批量删除公司和人关联关系管理
+     * 
+     * @param ids 需要删除的公司和人关联关系管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyUserByIds(Long[] ids)
+    {
+        return companyUserMapper.deleteCompanyUserByIds(ids);
+    }
+
+    /**
+     * 删除公司和人关联关系管理信息
+     * 
+     * @param id 公司和人关联关系管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCompanyUserById(Long id)
+    {
+        return companyUserMapper.deleteCompanyUserById(id);
+    }
+}

+ 105 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeEducationServiceImpl.java

@@ -0,0 +1,105 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.ResumeEducation;
+import com.ruoyi.system.mapper.resume.ResumeEducationMapper;
+import com.ruoyi.system.service.resume.IResumeEducationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 简历教育信息管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class ResumeEducationServiceImpl implements IResumeEducationService
+{
+    @Autowired
+    private ResumeEducationMapper resumeEducationMapper;
+
+    /**
+     * 查询简历教育信息管理
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 简历教育信息管理
+     */
+    @Override
+    public ResumeEducation selectResumeEducationByEduId(Long eduId)
+    {
+        return resumeEducationMapper.selectResumeEducationByEduId(eduId);
+    }
+
+    /**
+     * 查询简历教育信息管理列表
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 简历教育信息管理
+     */
+    @Override
+    public List<ResumeEducation> selectResumeEducationList(ResumeEducation resumeEducation)
+    {
+        return resumeEducationMapper.selectResumeEducationList(resumeEducation);
+    }
+
+    /**
+     * 新增简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    @Override
+    public int insertResumeEducation(ResumeEducation resumeEducation)
+    {
+        return resumeEducationMapper.insertResumeEducation(resumeEducation);
+    }
+
+    /**
+     * 修改简历教育信息管理
+     * 
+     * @param resumeEducation 简历教育信息管理
+     * @return 结果
+     */
+    @Override
+    public int updateResumeEducation(ResumeEducation resumeEducation)
+    {
+        return resumeEducationMapper.updateResumeEducation(resumeEducation);
+    }
+
+    /**
+     * 批量删除简历教育信息管理
+     * 
+     * @param eduIds 需要删除的简历教育信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeEducationByEduIds(Long[] eduIds)
+    {
+        return resumeEducationMapper.deleteResumeEducationByEduIds(eduIds);
+    }
+
+    /**
+     * 删除简历教育信息管理信息
+     * 
+     * @param eduId 简历教育信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeEducationByEduId(Long eduId)
+    {
+        return resumeEducationMapper.deleteResumeEducationByEduId(eduId);
+    }
+
+    /**
+     * 根据简历ID删除简历教育信息
+     *
+     * @param resumeId
+     * @return
+     */
+    @Override
+    public int deleteResumeEducationByResumeId(Long resumeId) {
+        return resumeEducationMapper.deleteResumeEducationByResumeId(resumeId);
+    }
+}

+ 105 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeFileServiceImpl.java

@@ -0,0 +1,105 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.ResumeFile;
+import com.ruoyi.system.mapper.resume.ResumeFileMapper;
+import com.ruoyi.system.service.resume.IResumeFileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 简历附件管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-19
+ */
+@Service
+public class ResumeFileServiceImpl implements IResumeFileService
+{
+    @Autowired
+    private ResumeFileMapper resumeFileMapper;
+
+    /**
+     * 查询简历附件管理
+     * 
+     * @param id 简历附件管理主键
+     * @return 简历附件管理
+     */
+    @Override
+    public ResumeFile selectResumeFileById(Long id)
+    {
+        return resumeFileMapper.selectResumeFileById(id);
+    }
+
+    /**
+     * 查询简历附件管理列表
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 简历附件管理
+     */
+    @Override
+    public List<ResumeFile> selectResumeFileList(ResumeFile resumeFile)
+    {
+        return resumeFileMapper.selectResumeFileList(resumeFile);
+    }
+
+    /**
+     * 新增简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    @Override
+    public int insertResumeFile(ResumeFile resumeFile)
+    {
+        return resumeFileMapper.insertResumeFile(resumeFile);
+    }
+
+    /**
+     * 修改简历附件管理
+     * 
+     * @param resumeFile 简历附件管理
+     * @return 结果
+     */
+    @Override
+    public int updateResumeFile(ResumeFile resumeFile)
+    {
+        return resumeFileMapper.updateResumeFile(resumeFile);
+    }
+
+    /**
+     * 批量删除简历附件管理
+     * 
+     * @param ids 需要删除的简历附件管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeFileByIds(Long[] ids)
+    {
+        return resumeFileMapper.deleteResumeFileByIds(ids);
+    }
+
+    /**
+     * 删除简历附件管理信息
+     * 
+     * @param id 简历附件管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeFileById(Long id)
+    {
+        return resumeFileMapper.deleteResumeFileById(id);
+    }
+
+    /**
+     * 删除简历附件管理信息
+     *
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeFileByResumeId(Long resumeId) {
+        return resumeFileMapper.deleteResumeFileByResumeId(resumeId);
+    }
+}

+ 105 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeProjectServiceImpl.java

@@ -0,0 +1,105 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.ResumeProject;
+import com.ruoyi.system.mapper.resume.ResumeProjectMapper;
+import com.ruoyi.system.service.resume.IResumeProjectService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 简历项目信息管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class ResumeProjectServiceImpl implements IResumeProjectService
+{
+    @Autowired
+    private ResumeProjectMapper resumeProjectMapper;
+
+    /**
+     * 查询简历项目信息管理
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 简历项目信息管理
+     */
+    @Override
+    public ResumeProject selectResumeProjectByProjectId(Long projectId)
+    {
+        return resumeProjectMapper.selectResumeProjectByProjectId(projectId);
+    }
+
+    /**
+     * 查询简历项目信息管理列表
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 简历项目信息管理
+     */
+    @Override
+    public List<ResumeProject> selectResumeProjectList(ResumeProject resumeProject)
+    {
+        return resumeProjectMapper.selectResumeProjectList(resumeProject);
+    }
+
+    /**
+     * 新增简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    @Override
+    public int insertResumeProject(ResumeProject resumeProject)
+    {
+        return resumeProjectMapper.insertResumeProject(resumeProject);
+    }
+
+    /**
+     * 修改简历项目信息管理
+     * 
+     * @param resumeProject 简历项目信息管理
+     * @return 结果
+     */
+    @Override
+    public int updateResumeProject(ResumeProject resumeProject)
+    {
+        return resumeProjectMapper.updateResumeProject(resumeProject);
+    }
+
+    /**
+     * 批量删除简历项目信息管理
+     * 
+     * @param projectIds 需要删除的简历项目信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeProjectByProjectIds(Long[] projectIds)
+    {
+        return resumeProjectMapper.deleteResumeProjectByProjectIds(projectIds);
+    }
+
+    /**
+     * 删除简历项目信息管理信息
+     * 
+     * @param projectId 简历项目信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeProjectByProjectId(Long projectId)
+    {
+        return resumeProjectMapper.deleteResumeProjectByProjectId(projectId);
+    }
+
+    /**
+     * 根据简历ID删除简历项目经验信息
+     *
+     * @param resumeId
+     * @return
+     */
+    @Override
+    public int deleteResumeProjectByResumeId(Long resumeId) {
+        return resumeProjectMapper.deleteResumeProjectByResumeId(resumeId);
+    }
+}

+ 207 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeServiceImpl.java

@@ -0,0 +1,207 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+import com.ruoyi.system.domain.resume.*;
+import com.ruoyi.system.mapper.resume.ResumeMapper;
+import com.ruoyi.system.service.resume.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 简历管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-18
+ */
+@Service
+public class ResumeServiceImpl implements IResumeService
+{
+    @Autowired
+    private ResumeMapper resumeMapper;
+
+    @Autowired
+    private IResumeFileService resumeFileService;
+
+    @Autowired
+    private IResumeWorkService resumeWorkService;
+
+    @Autowired
+    private IResumeProjectService resumeProjectService;
+
+    @Autowired
+    private IResumeEducationService resumeEducationService;
+
+    /**
+     * 查询简历管理
+     * 
+     * @param resumeId 简历管理主键
+     * @return 简历管理
+     */
+    @Override
+    public Resume selectResumeByResumeId(Long resumeId)
+    {
+        Resume resume = resumeMapper.selectResumeByResumeId(resumeId);
+        if(!Objects.isNull(resume)){
+            //简历附件处理
+            ResumeFile resumeFile = new ResumeFile();
+            resumeFile.setResumeId(resume.getResumeId());
+            List<ResumeFile> resumeFileList = resumeFileService.selectResumeFileList(resumeFile);
+            if(resumeFileList != null && !resumeFileList.isEmpty()){
+                resume.setResumeFile(resumeFileList.get(0));
+            }
+            //简历工作履历处理
+            ResumeWork work = new ResumeWork();
+            work.setResumeId(resume.getResumeId());
+            List<ResumeWork> workList = resumeWorkService.selectResumeWorkList(work);
+            resume.setWorkList(workList);
+            //简历项目经验处理
+            ResumeProject project = new ResumeProject();
+            project.setResumeId(resume.getResumeId());
+            List<ResumeProject> projectList = resumeProjectService.selectResumeProjectList(project);
+            resume.setProjectList(projectList);
+            //简历教育经历处理
+            ResumeEducation education = new ResumeEducation();
+            education.setResumeId(resume.getResumeId());
+            List<ResumeEducation> eduList = resumeEducationService.selectResumeEducationList(education);
+            resume.setEduList(eduList);
+        }
+        return resume;
+    }
+
+    /**
+     * 查询简历管理列表
+     * 
+     * @param resume 简历管理
+     * @return 简历管理
+     */
+    @Override
+    public List<Resume> selectResumeList(Resume resume)
+    {
+        return resumeMapper.selectResumeList(resume);
+    }
+
+    /**
+     * 新增简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    @Override
+    public int insertResume(Resume resume)
+    {
+        resume.setCreateDate(new Date());
+        int row = resumeMapper.insertResume(resume);
+        if(row > 0){
+            //简历附件处理
+            if(!Objects.isNull(resume.getResumeFile())){
+                ResumeFile resumeFile = resume.getResumeFile();
+                resumeFile.setResumeId(resume.getResumeId());
+                resumeFileService.insertResumeFile(resumeFile);
+            }
+            //简历工作履历处理
+            List<ResumeWork> workList = resume.getWorkList();
+            if(workList != null && !workList.isEmpty()){
+                for(ResumeWork work : workList){
+                    work.setResumeId(resume.getResumeId());
+                    resumeWorkService.insertResumeWork(work);
+                }
+            }
+            //简历项目经验处理
+            List<ResumeProject> projectList = resume.getProjectList();
+            if(projectList != null && !projectList.isEmpty()){
+                for(ResumeProject project : projectList){
+                    project.setResumeId(resume.getResumeId());
+                    resumeProjectService.insertResumeProject(project);
+                }
+            }
+            //简历教育经历处理
+            List<ResumeEducation> eduList = resume.getEduList();
+            if(eduList != null && !eduList.isEmpty()){
+                for(ResumeEducation education : eduList){
+                    education.setResumeId(resume.getResumeId());
+                    resumeEducationService.insertResumeEducation(education);
+                }
+            }
+        }
+        return row;
+    }
+
+    /**
+     * 修改简历管理
+     * 
+     * @param resume 简历管理
+     * @return 结果
+     */
+    @Override
+    public int updateResume(Resume resume) {
+        int row = resumeMapper.updateResume(resume);
+        if(row > 0){
+            //简历附件处理
+            if(!Objects.isNull(resume.getResumeFile())){
+                resumeFileService.deleteResumeFileByResumeId(resume.getResumeId());
+                ResumeFile resumeFile = resume.getResumeFile();
+                resumeFile.setResumeId(resume.getResumeId());
+                resumeFileService.insertResumeFile(resumeFile);
+            }
+            //简历工作履历处理
+            List<ResumeWork> workList = resume.getWorkList();
+            if(workList != null && !workList.isEmpty()){
+                //删除之前的简历工作履历
+                resumeWorkService.deleteResumeWorkByResumeId(resume.getResumeId());
+                for(ResumeWork work : workList){
+                    work.setResumeId(resume.getResumeId());
+                    resumeWorkService.insertResumeWork(work);
+                }
+            }
+            //简历项目经验处理
+            List<ResumeProject> projectList = resume.getProjectList();
+            if(projectList != null && !projectList.isEmpty()){
+                //删除之前的简历项目经验
+                resumeProjectService.deleteResumeProjectByResumeId(resume.getResumeId());
+                for(ResumeProject project : projectList){
+                    project.setResumeId(resume.getResumeId());
+                    resumeProjectService.insertResumeProject(project);
+                }
+            }
+            //简历教育经历处理
+            List<ResumeEducation> eduList = resume.getEduList();
+            if(eduList != null && !eduList.isEmpty()){
+                //删除之前的简历教育经历
+                resumeEducationService.deleteResumeEducationByResumeId(resume.getResumeId());
+                for(ResumeEducation education : eduList){
+                    education.setResumeId(resume.getResumeId());
+                    resumeEducationService.insertResumeEducation(education);
+                }
+            }
+        }
+        return row;
+    }
+
+    /**
+     * 批量删除简历管理
+     * 
+     * @param resumeIds 需要删除的简历管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeByResumeIds(Long[] resumeIds)
+    {
+        return resumeMapper.deleteResumeByResumeIds(resumeIds);
+    }
+
+    /**
+     * 删除简历管理信息
+     * 
+     * @param resumeId 简历管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeByResumeId(Long resumeId)
+    {
+        return resumeMapper.deleteResumeByResumeId(resumeId);
+    }
+}

+ 105 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/resume/impl/ResumeWorkServiceImpl.java

@@ -0,0 +1,105 @@
+package com.ruoyi.system.service.resume.impl;
+
+import java.util.List;
+
+import com.ruoyi.system.domain.resume.ResumeWork;
+import com.ruoyi.system.mapper.resume.ResumeWorkMapper;
+import com.ruoyi.system.service.resume.IResumeWorkService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 简历工作经历信息管理Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-02-21
+ */
+@Service
+public class ResumeWorkServiceImpl implements IResumeWorkService
+{
+    @Autowired
+    private ResumeWorkMapper resumeWorkMapper;
+
+    /**
+     * 查询简历工作经历信息管理
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 简历工作经历信息管理
+     */
+    @Override
+    public ResumeWork selectResumeWorkByWorkId(Long workId)
+    {
+        return resumeWorkMapper.selectResumeWorkByWorkId(workId);
+    }
+
+    /**
+     * 查询简历工作经历信息管理列表
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 简历工作经历信息管理
+     */
+    @Override
+    public List<ResumeWork> selectResumeWorkList(ResumeWork resumeWork)
+    {
+        return resumeWorkMapper.selectResumeWorkList(resumeWork);
+    }
+
+    /**
+     * 新增简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    @Override
+    public int insertResumeWork(ResumeWork resumeWork)
+    {
+        return resumeWorkMapper.insertResumeWork(resumeWork);
+    }
+
+    /**
+     * 修改简历工作经历信息管理
+     * 
+     * @param resumeWork 简历工作经历信息管理
+     * @return 结果
+     */
+    @Override
+    public int updateResumeWork(ResumeWork resumeWork)
+    {
+        return resumeWorkMapper.updateResumeWork(resumeWork);
+    }
+
+    /**
+     * 批量删除简历工作经历信息管理
+     * 
+     * @param workIds 需要删除的简历工作经历信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeWorkByWorkIds(Long[] workIds)
+    {
+        return resumeWorkMapper.deleteResumeWorkByWorkIds(workIds);
+    }
+
+    /**
+     * 删除简历工作经历信息管理信息
+     * 
+     * @param workId 简历工作经历信息管理主键
+     * @return 结果
+     */
+    @Override
+    public int deleteResumeWorkByWorkId(Long workId)
+    {
+        return resumeWorkMapper.deleteResumeWorkByWorkId(workId);
+    }
+
+    /**
+     * 根据简历ID删除简历工作履历信息
+     *
+     * @param resumeId
+     * @return
+     */
+    @Override
+    public int deleteResumeWorkByResumeId(Long resumeId) {
+        return resumeWorkMapper.deleteResumeWorkByResumeId(resumeId);
+    }
+}

+ 121 - 0
ruoyi-system/src/main/resources/mapper/resume/CompanyInfoMapper.xml

@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.CompanyInfoMapper">
+    
+    <resultMap type="CompanyInfo" id="CompanyInfoResult">
+        <result property="id"    column="id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="companyFullName"    column="company_full_name"    />
+        <result property="companyName"    column="company_name"    />
+        <result property="companyFullNameEn"    column="company_full_name_en"    />
+        <result property="address"    column="address"    />
+        <result property="industryId"    column="industry_id"    />
+        <result property="logoPath"    column="logo_path"    />
+        <result property="SLD"    column="SLD"    />
+        <result property="corpId"    column="corp_id"    />
+        <result property="createDate"    column="create_date"    />
+        <result property="createUserId"    column="create_user_id"    />
+        <result property="updateDate"    column="update_date"    />
+        <result property="isDelete"    column="is_delete"    />
+        <result property="adminUser"    column="admin_user"    />
+    </resultMap>
+
+    <sql id="selectCompanyInfoVo">
+        select id, company_id, company_full_name, company_name, company_full_name_en, address, industry_id, logo_path, SLD, corp_id, create_date, create_user_id, update_date, is_delete, admin_user from company_info
+    </sql>
+
+    <select id="selectCompanyInfoList" parameterType="CompanyInfo" resultMap="CompanyInfoResult">
+        <include refid="selectCompanyInfoVo"/>
+        <where>  
+            <if test="companyId != null  and companyId != ''"> and company_id = #{companyId}</if>
+            <if test="companyFullName != null  and companyFullName != ''"> and company_full_name like concat('%', #{companyFullName}, '%')</if>
+            <if test="companyName != null  and companyName != ''"> and company_name like concat('%', #{companyName}, '%')</if>
+            <if test="companyFullNameEn != null  and companyFullNameEn != ''"> and company_full_name_en = #{companyFullNameEn}</if>
+            <if test="address != null  and address != ''"> and address = #{address}</if>
+            <if test="industryId != null  and industryId != ''"> and industry_id = #{industryId}</if>
+            <if test="logoPath != null  and logoPath != ''"> and logo_path = #{logoPath}</if>
+            <if test="SLD != null  and SLD != ''"> and SLD = #{SLD}</if>
+            <if test="corpId != null  and corpId != ''"> and corp_id = #{corpId}</if>
+            <if test="createDate != null "> and create_date = #{createDate}</if>
+            <if test="createUserId != null  and createUserId != ''"> and create_user_id = #{createUserId}</if>
+            <if test="updateDate != null "> and update_date = #{updateDate}</if>
+            <if test="isDelete != null  and isDelete != ''"> and is_delete = #{isDelete}</if>
+            <if test="adminUser != null  and adminUser != ''"> and admin_user = #{adminUser}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyInfoById" parameterType="Long" resultMap="CompanyInfoResult">
+        <include refid="selectCompanyInfoVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCompanyInfo" parameterType="CompanyInfo" useGeneratedKeys="true" keyProperty="id">
+        insert into company_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">company_id,</if>
+            <if test="companyFullName != null">company_full_name,</if>
+            <if test="companyName != null">company_name,</if>
+            <if test="companyFullNameEn != null">company_full_name_en,</if>
+            <if test="address != null">address,</if>
+            <if test="industryId != null">industry_id,</if>
+            <if test="logoPath != null">logo_path,</if>
+            <if test="SLD != null">SLD,</if>
+            <if test="corpId != null">corp_id,</if>
+            <if test="createDate != null">create_date,</if>
+            <if test="createUserId != null">create_user_id,</if>
+            <if test="updateDate != null">update_date,</if>
+            <if test="isDelete != null">is_delete,</if>
+            <if test="adminUser != null">admin_user,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">#{companyId},</if>
+            <if test="companyFullName != null">#{companyFullName},</if>
+            <if test="companyName != null">#{companyName},</if>
+            <if test="companyFullNameEn != null">#{companyFullNameEn},</if>
+            <if test="address != null">#{address},</if>
+            <if test="industryId != null">#{industryId},</if>
+            <if test="logoPath != null">#{logoPath},</if>
+            <if test="SLD != null">#{SLD},</if>
+            <if test="corpId != null">#{corpId},</if>
+            <if test="createDate != null">#{createDate},</if>
+            <if test="createUserId != null">#{createUserId},</if>
+            <if test="updateDate != null">#{updateDate},</if>
+            <if test="isDelete != null">#{isDelete},</if>
+            <if test="adminUser != null">#{adminUser},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyInfo" parameterType="CompanyInfo">
+        update company_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="companyFullName != null">company_full_name = #{companyFullName},</if>
+            <if test="companyName != null">company_name = #{companyName},</if>
+            <if test="companyFullNameEn != null">company_full_name_en = #{companyFullNameEn},</if>
+            <if test="address != null">address = #{address},</if>
+            <if test="industryId != null">industry_id = #{industryId},</if>
+            <if test="logoPath != null">logo_path = #{logoPath},</if>
+            <if test="SLD != null">SLD = #{SLD},</if>
+            <if test="corpId != null">corp_id = #{corpId},</if>
+            <if test="createDate != null">create_date = #{createDate},</if>
+            <if test="createUserId != null">create_user_id = #{createUserId},</if>
+            <if test="updateDate != null">update_date = #{updateDate},</if>
+            <if test="isDelete != null">is_delete = #{isDelete},</if>
+            <if test="adminUser != null">admin_user = #{adminUser},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCompanyInfoById" parameterType="Long">
+        delete from company_info where id = #{id}
+    </delete>
+
+    <delete id="deleteCompanyInfoByIds" parameterType="String">
+        delete from company_info where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 61 - 0
ruoyi-system/src/main/resources/mapper/resume/CompanyUserMapper.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.CompanyUserMapper">
+    
+    <resultMap type="CompanyUser" id="CompanyUserResult">
+        <result property="id"    column="id"    />
+        <result property="companyId"    column="company_id"    />
+        <result property="userId"    column="user_id"    />
+    </resultMap>
+
+    <sql id="selectCompanyUserVo">
+        select id, company_id, user_id from company_user
+    </sql>
+
+    <select id="selectCompanyUserList" parameterType="CompanyUser" resultMap="CompanyUserResult">
+        <include refid="selectCompanyUserVo"/>
+        <where>  
+            <if test="companyId != null "> and company_id = #{companyId}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+        </where>
+    </select>
+    
+    <select id="selectCompanyUserById" parameterType="Long" resultMap="CompanyUserResult">
+        <include refid="selectCompanyUserVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertCompanyUser" parameterType="CompanyUser" useGeneratedKeys="true" keyProperty="id">
+        insert into company_user
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">company_id,</if>
+            <if test="userId != null">user_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="companyId != null">#{companyId},</if>
+            <if test="userId != null">#{userId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateCompanyUser" parameterType="CompanyUser">
+        update company_user
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCompanyUserById" parameterType="Long">
+        delete from company_user where id = #{id}
+    </delete>
+
+    <delete id="deleteCompanyUserByIds" parameterType="String">
+        delete from company_user where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 96 - 0
ruoyi-system/src/main/resources/mapper/resume/ResumeEducationMapper.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.ResumeEducationMapper">
+    
+    <resultMap type="ResumeEducation" id="ResumeEducationResult">
+        <result property="eduId"    column="edu_id"    />
+        <result property="schoolName"    column="school_name"    />
+        <result property="major"    column="major"    />
+        <result property="eduStartDate"    column="edu_start_date"    />
+        <result property="eduEndDate"    column="edu_end_date"    />
+        <result property="degree"    column="degree"    />
+        <result property="resumeId"    column="resume_id"    />
+        <result property="detail"    column="detail"    />
+        <result property="orderBy"    column="order_by"    />
+    </resultMap>
+
+    <sql id="selectResumeEducationVo">
+        select edu_id, school_name, major, edu_start_date, edu_end_date, degree, resume_id, detail, order_by from resume_education
+    </sql>
+
+    <select id="selectResumeEducationList" parameterType="ResumeEducation" resultMap="ResumeEducationResult">
+        <include refid="selectResumeEducationVo"/>
+        <where>  
+            <if test="schoolName != null  and schoolName != ''"> and school_name like concat('%', #{schoolName}, '%')</if>
+            <if test="major != null  and major != ''"> and major = #{major}</if>
+            <if test="eduStartDate != null  and eduStartDate != ''"> and edu_start_date = #{eduStartDate}</if>
+            <if test="eduEndDate != null  and eduEndDate != ''"> and edu_end_date = #{eduEndDate}</if>
+            <if test="degree != null  and degree != ''"> and degree = #{degree}</if>
+            <if test="resumeId != null "> and resume_id = #{resumeId}</if>
+            <if test="detail != null  and detail != ''"> and detail = #{detail}</if>
+            <if test="orderBy != null "> and order_by = #{orderBy}</if>
+        </where>
+        order by order_by
+    </select>
+    
+    <select id="selectResumeEducationByEduId" parameterType="Long" resultMap="ResumeEducationResult">
+        <include refid="selectResumeEducationVo"/>
+        where edu_id = #{eduId}
+    </select>
+        
+    <insert id="insertResumeEducation" parameterType="ResumeEducation" useGeneratedKeys="true" keyProperty="eduId">
+        insert into resume_education
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="schoolName != null">school_name,</if>
+            <if test="major != null">major,</if>
+            <if test="eduStartDate != null">edu_start_date,</if>
+            <if test="eduEndDate != null">edu_end_date,</if>
+            <if test="degree != null">degree,</if>
+            <if test="resumeId != null">resume_id,</if>
+            <if test="detail != null">detail,</if>
+            <if test="orderBy != null">order_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="schoolName != null">#{schoolName},</if>
+            <if test="major != null">#{major},</if>
+            <if test="eduStartDate != null">#{eduStartDate},</if>
+            <if test="eduEndDate != null">#{eduEndDate},</if>
+            <if test="degree != null">#{degree},</if>
+            <if test="resumeId != null">#{resumeId},</if>
+            <if test="detail != null">#{detail},</if>
+            <if test="orderBy != null">#{orderBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateResumeEducation" parameterType="ResumeEducation">
+        update resume_education
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="schoolName != null">school_name = #{schoolName},</if>
+            <if test="major != null">major = #{major},</if>
+            <if test="eduStartDate != null">edu_start_date = #{eduStartDate},</if>
+            <if test="eduEndDate != null">edu_end_date = #{eduEndDate},</if>
+            <if test="degree != null">degree = #{degree},</if>
+            <if test="resumeId != null">resume_id = #{resumeId},</if>
+            <if test="detail != null">detail = #{detail},</if>
+            <if test="orderBy != null">order_by = #{orderBy},</if>
+        </trim>
+        where edu_id = #{eduId}
+    </update>
+
+    <delete id="deleteResumeEducationByEduId" parameterType="Long">
+        delete from resume_education where edu_id = #{eduId}
+    </delete>
+
+    <delete id="deleteResumeEducationByResumeId" parameterType="Long">
+        delete from resume_education where resume_id = #{resumeId}
+    </delete>
+
+    <delete id="deleteResumeEducationByEduIds" parameterType="String">
+        delete from resume_education where edu_id in 
+        <foreach item="eduId" collection="array" open="(" separator="," close=")">
+            #{eduId}
+        </foreach>
+    </delete>
+</mapper>

+ 84 - 0
ruoyi-system/src/main/resources/mapper/resume/ResumeFileMapper.xml

@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.ResumeFileMapper">
+    
+    <resultMap type="ResumeFile" id="ResumeFileResult">
+        <result property="id"    column="id"    />
+        <result property="fileId"    column="file_id"    />
+        <result property="resumeId"    column="resume_id"    />
+        <result property="uploadName"    column="upload_name"    />
+        <result property="uploadType"    column="upload_type"    />
+        <result property="uploadPath"    column="upload_path"    />
+        <result property="delFlag"    column="del_flag"    />
+    </resultMap>
+
+    <sql id="selectResumeFileVo">
+        select id, file_id, resume_id, upload_name, upload_type, upload_path, del_flag from resume_file
+    </sql>
+
+    <select id="selectResumeFileList" parameterType="ResumeFile" resultMap="ResumeFileResult">
+        <include refid="selectResumeFileVo"/>
+        <where>  
+            <if test="fileId != null  and fileId != ''"> and file_id = #{fileId}</if>
+            <if test="resumeId != null "> and resume_id = #{resumeId}</if>
+            <if test="uploadName != null  and uploadName != ''"> and upload_name like concat('%', #{uploadName}, '%')</if>
+            <if test="uploadType != null  and uploadType != ''"> and upload_type = #{uploadType}</if>
+            <if test="uploadPath != null  and uploadPath != ''"> and upload_path = #{uploadPath}</if>
+        </where>
+    </select>
+    
+    <select id="selectResumeFileById" parameterType="Long" resultMap="ResumeFileResult">
+        <include refid="selectResumeFileVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertResumeFile" parameterType="ResumeFile" useGeneratedKeys="true" keyProperty="id">
+        insert into resume_file
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="fileId != null and fileId != ''">file_id,</if>
+            <if test="resumeId != null">resume_id,</if>
+            <if test="uploadName != null and uploadName != ''">upload_name,</if>
+            <if test="uploadType != null and uploadType != ''">upload_type,</if>
+            <if test="uploadPath != null and uploadPath != ''">upload_path,</if>
+            <if test="delFlag != null">del_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="fileId != null and fileId != ''">#{fileId},</if>
+            <if test="resumeId != null">#{resumeId},</if>
+            <if test="uploadName != null and uploadName != ''">#{uploadName},</if>
+            <if test="uploadType != null and uploadType != ''">#{uploadType},</if>
+            <if test="uploadPath != null and uploadPath != ''">#{uploadPath},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateResumeFile" parameterType="ResumeFile">
+        update resume_file
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="fileId != null and fileId != ''">file_id = #{fileId},</if>
+            <if test="resumeId != null">resume_id = #{resumeId},</if>
+            <if test="uploadName != null and uploadName != ''">upload_name = #{uploadName},</if>
+            <if test="uploadType != null and uploadType != ''">upload_type = #{uploadType},</if>
+            <if test="uploadPath != null and uploadPath != ''">upload_path = #{uploadPath},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteResumeFileById" parameterType="Long">
+        delete from resume_file where id = #{id}
+    </delete>
+
+    <delete id="deleteResumeFileByResumeId" parameterType="Long">
+        delete from resume_file where resume_id = #{resumeId}
+    </delete>
+
+    <delete id="deleteResumeFileByIds" parameterType="String">
+        delete from resume_file where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 342 - 0
ruoyi-system/src/main/resources/mapper/resume/ResumeMapper.xml

@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.ResumeMapper">
+    
+    <resultMap type="Resume" id="ResumeResult">
+        <result property="resumeId"    column="resume_id"    />
+        <result property="resumeName"    column="resume_name"    />
+        <result property="userName"    column="user_name"    />
+        <result property="gender"    column="gender"    />
+        <result property="birthday"    column="birthday"    />
+        <result property="age"    column="age"    />
+        <result property="degree"    column="degree"    />
+        <result property="experience"    column="experience"    />
+        <result property="mobile"    column="mobile"    />
+        <result property="cardNo"    column="card_no"    />
+        <result property="email"    column="email"    />
+        <result property="isMarryed"    column="is_marryed"    />
+        <result property="residence"    column="residence"    />
+        <result property="origin"    column="origin"    />
+        <result property="nationality"    column="nationality"    />
+        <result property="graduateCollege"    column="graduate_college"    />
+        <result property="major"    column="major"    />
+        <result property="lanuage"    column="lanuage"    />
+        <result property="graduateDate"    column="graduate_date"    />
+        <result property="positionRating"    column="position_rating"    />
+        <result property="keyWords"    column="key_words"    />
+        <result property="jobObjective"    column="job_objective"    />
+        <result property="salary"    column="salary"    />
+        <result property="selfIntroduce"    column="self_introduce"    />
+        <result property="userId"    column="user_id"    />
+        <result property="headUrl"    column="head_url"    />
+        <result property="isPrivate"    column="is_private"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="createDate"    column="create_date"    />
+        <result property="updateUserId"    column="update_user_id"    />
+        <result property="updateDate"    column="update_date"    />
+        <result property="resumeDownloadUrl"    column="resume_download_url"    />
+        <result property="status"    column="status"    />
+        <result property="currentCompany"    column="current_company"    />
+        <result property="industry"    column="industry"    />
+        <result property="workingPlace"    column="working_place"    />
+        <result property="certificate"    column="certificate"    />
+        <result property="languageAbility"    column="language_ability"    />
+        <result property="industryExperience"    column="industry_experience"    />
+        <result property="workExperience"    column="work_experience"    />
+        <result property="post"    column="post"    />
+        <result property="lastCompany"    column="last_company"    />
+        <result property="lastIndustry"    column="last_industry"    />
+        <result property="lastPosition"    column="last_position"    />
+        <result property="position"    column="position"    />
+        <result property="selfEvaluation"    column="self_evaluation"    />
+        <result property="exceptedSalary"    column="excepted_salary"    />
+        <result property="isEnabled"    column="is_enabled"    />
+    </resultMap>
+
+    <sql id="selectResumeVo">
+        SELECT
+            r.resume_id,
+            r.resume_name,
+            r.user_name,
+            r.gender,
+            r.birthday,
+            r.age,
+            r.degree,
+            r.experience,
+            r.mobile,
+            r.card_no,
+            r.email,
+            r.is_marryed,
+            r.residence,
+            r.origin,
+            r.nationality,
+            r.graduate_college,
+            r.major,
+            r.lanuage,
+            r.graduate_date,
+            r.position_rating,
+            r.key_words,
+            r.job_objective,
+            r.salary,
+            r.self_introduce,
+            r.user_id,
+            r.head_url,
+            r.is_private,
+            r.is_deleted,
+            r.create_date,
+            r.update_user_id,
+            r.update_date,
+            r.resume_download_url,
+            r.STATUS,
+            r.current_company,
+            r.industry,
+            r.working_place,
+            r.certificate,
+            r.language_ability,
+            r.industry_experience,
+            r.work_experience,
+            r.post,
+            r.last_company,
+            r.last_industry,
+            r.last_position,
+            r.position,
+            r.self_evaluation,
+            r.excepted_salary,
+            r.is_enabled,
+            su.user_name AS createUserName
+        FROM
+            resume r
+                LEFT JOIN sys_user su ON su.user_id = r.user_id
+    </sql>
+
+    <select id="selectResumeList" parameterType="Resume" resultMap="ResumeResult">
+        <include refid="selectResumeVo"/>
+        <where>  
+            <if test="resumeName != null  and resumeName != ''"> and r.resume_name like concat('%', #{resumeName}, '%')</if>
+            <if test="userName != null  and userName != ''"> and r.user_name like concat('%', #{userName}, '%')</if>
+            <if test="gender != null  and gender != ''"> and r.gender = #{gender}</if>
+            <if test="birthday != null "> and r.birthday = #{birthday}</if>
+            <if test="age != null  and age != ''"> and r.age = #{age}</if>
+            <if test="degree != null  and degree != ''"> and r.degree = #{degree}</if>
+            <if test="experience != null  and experience != ''"> and r.experience = #{experience}</if>
+            <if test="mobile != null  and mobile != ''"> and r.mobile = #{mobile}</if>
+            <if test="cardNo != null  and cardNo != ''"> and r.card_no = #{cardNo}</if>
+            <if test="email != null  and email != ''"> and r.email = #{email}</if>
+            <if test="isMarryed != null "> and r.is_marryed = #{isMarryed}</if>
+            <if test="residence != null  and residence != ''"> and r.residence = #{residence}</if>
+            <if test="origin != null  and origin != ''"> and r.origin = #{origin}</if>
+            <if test="nationality != null  and nationality != ''"> and r.nationality = #{nationality}</if>
+            <if test="graduateCollege != null  and graduateCollege != ''"> and r.graduate_college = #{graduateCollege}</if>
+            <if test="major != null  and major != ''"> and r.major = #{major}</if>
+            <if test="lanuage != null  and lanuage != ''"> and r.lanuage = #{lanuage}</if>
+            <if test="graduateDate != null "> and r.graduate_date = #{graduateDate}</if>
+            <if test="positionRating != null  and positionRating != ''"> and r.position_rating = #{positionRating}</if>
+            <if test="keyWords != null  and keyWords != ''"> and r.key_words = #{keyWords}</if>
+            <if test="jobObjective != null  and jobObjective != ''"> and r.job_objective = #{jobObjective}</if>
+            <if test="salary != null  and salary != ''"> and r.salary = #{salary}</if>
+            <if test="selfIntroduce != null  and selfIntroduce != ''"> and r.self_introduce = #{selfIntroduce}</if>
+            <if test="userId != null  and userId != ''"> and r.user_id = #{userId}</if>
+            <if test="createUserName != null  and createUserName != ''"> and su.user_name = #{createUserName}</if>
+            <if test="headUrl != null  and headUrl != ''"> and r.head_url = #{headUrl}</if>
+            <if test="isPrivate != null "> and r.is_private = #{isPrivate}</if>
+            <if test="isDeleted != null "> and r.is_deleted = #{isDeleted}</if>
+            <if test="createDate != null "> and r.create_date = #{createDate}</if>
+            <if test="startTime != null and startTime != ''"> and r.create_date >= #{startTime}</if>
+            <if test="endTime != null and endTime != ''"> and #{endTime} >= r.create_date </if>
+            <if test="updateUserId != null  and updateUserId != ''"> and r.update_user_id = #{updateUserId}</if>
+            <if test="updateDate != null "> and r.update_date = #{updateDate}</if>
+            <if test="resumeDownloadUrl != null  and resumeDownloadUrl != ''"> and r.resume_download_url = #{resumeDownloadUrl}</if>
+            <if test="status != null  and status != ''"> and r.status = #{status}</if>
+            <if test="currentCompany != null  and currentCompany != ''"> and r.current_company = #{currentCompany}</if>
+            <if test="industry != null  and industry != ''"> and r.industry = #{industry}</if>
+            <if test="workingPlace != null  and workingPlace != ''"> and r.working_place = #{workingPlace}</if>
+            <if test="certificate != null  and certificate != ''"> and r.certificate = #{certificate}</if>
+            <if test="languageAbility != null  and languageAbility != ''"> and r.language_ability = #{languageAbility}</if>
+            <if test="industryExperience != null  and industryExperience != ''"> and r.industry_experience = #{industryExperience}</if>
+            <if test="workExperience != null  and workExperience != ''"> and r.work_experience = #{workExperience}</if>
+            <if test="post != null  and post != ''"> and r.post = #{post}</if>
+            <if test="lastCompany != null  and lastCompany != ''"> and r.last_company = #{lastCompany}</if>
+            <if test="lastIndustry != null  and lastIndustry != ''"> and r.last_industry = #{lastIndustry}</if>
+            <if test="lastPosition != null  and lastPosition != ''"> and r.last_position = #{lastPosition}</if>
+            <if test="position != null  and position != ''"> and r.position = #{position}</if>
+            <if test="selfEvaluation != null  and selfEvaluation != ''"> and r.self_evaluation = #{selfEvaluation}</if>
+            <if test="exceptedSalary != null  and exceptedSalary != ''"> and r.excepted_salary = #{exceptedSalary}</if>
+            <if test="isEnabled != null "> and r.is_enabled = #{isEnabled}</if>
+        </where>
+        order by r.create_date desc
+    </select>
+    
+    <select id="selectResumeByResumeId" parameterType="Long" resultMap="ResumeResult">
+        <include refid="selectResumeVo"/>
+        where r.resume_id = #{resumeId}
+    </select>
+        
+    <insert id="insertResume" parameterType="Resume" useGeneratedKeys="true" keyProperty="resumeId">
+        insert into resume
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="resumeName != null">resume_name,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="gender != null">gender,</if>
+            <if test="birthday != null">birthday,</if>
+            <if test="age != null">age,</if>
+            <if test="degree != null">degree,</if>
+            <if test="experience != null">experience,</if>
+            <if test="mobile != null">mobile,</if>
+            <if test="cardNo != null">card_no,</if>
+            <if test="email != null">email,</if>
+            <if test="isMarryed != null">is_marryed,</if>
+            <if test="residence != null">residence,</if>
+            <if test="origin != null">origin,</if>
+            <if test="nationality != null">nationality,</if>
+            <if test="graduateCollege != null">graduate_college,</if>
+            <if test="major != null">major,</if>
+            <if test="lanuage != null">lanuage,</if>
+            <if test="graduateDate != null">graduate_date,</if>
+            <if test="positionRating != null">position_rating,</if>
+            <if test="keyWords != null">key_words,</if>
+            <if test="jobObjective != null">job_objective,</if>
+            <if test="salary != null">salary,</if>
+            <if test="selfIntroduce != null">self_introduce,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="headUrl != null">head_url,</if>
+            <if test="isPrivate != null">is_private,</if>
+            <if test="isDeleted != null">is_deleted,</if>
+            <if test="createDate != null">create_date,</if>
+            <if test="updateUserId != null">update_user_id,</if>
+            <if test="updateDate != null">update_date,</if>
+            <if test="resumeDownloadUrl != null">resume_download_url,</if>
+            <if test="status != null">status,</if>
+            <if test="currentCompany != null">current_company,</if>
+            <if test="industry != null">industry,</if>
+            <if test="workingPlace != null">working_place,</if>
+            <if test="certificate != null">certificate,</if>
+            <if test="languageAbility != null">language_ability,</if>
+            <if test="industryExperience != null">industry_experience,</if>
+            <if test="workExperience != null">work_experience,</if>
+            <if test="post != null">post,</if>
+            <if test="lastCompany != null">last_company,</if>
+            <if test="lastIndustry != null">last_industry,</if>
+            <if test="lastPosition != null">last_position,</if>
+            <if test="position != null">position,</if>
+            <if test="selfEvaluation != null">self_evaluation,</if>
+            <if test="exceptedSalary != null">excepted_salary,</if>
+            <if test="isEnabled != null">is_enabled,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="resumeName != null">#{resumeName},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="gender != null">#{gender},</if>
+            <if test="birthday != null">#{birthday},</if>
+            <if test="age != null">#{age},</if>
+            <if test="degree != null">#{degree},</if>
+            <if test="experience != null">#{experience},</if>
+            <if test="mobile != null">#{mobile},</if>
+            <if test="cardNo != null">#{cardNo},</if>
+            <if test="email != null">#{email},</if>
+            <if test="isMarryed != null">#{isMarryed},</if>
+            <if test="residence != null">#{residence},</if>
+            <if test="origin != null">#{origin},</if>
+            <if test="nationality != null">#{nationality},</if>
+            <if test="graduateCollege != null">#{graduateCollege},</if>
+            <if test="major != null">#{major},</if>
+            <if test="lanuage != null">#{lanuage},</if>
+            <if test="graduateDate != null">#{graduateDate},</if>
+            <if test="positionRating != null">#{positionRating},</if>
+            <if test="keyWords != null">#{keyWords},</if>
+            <if test="jobObjective != null">#{jobObjective},</if>
+            <if test="salary != null">#{salary},</if>
+            <if test="selfIntroduce != null">#{selfIntroduce},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="headUrl != null">#{headUrl},</if>
+            <if test="isPrivate != null">#{isPrivate},</if>
+            <if test="isDeleted != null">#{isDeleted},</if>
+            <if test="createDate != null">#{createDate},</if>
+            <if test="updateUserId != null">#{updateUserId},</if>
+            <if test="updateDate != null">#{updateDate},</if>
+            <if test="resumeDownloadUrl != null">#{resumeDownloadUrl},</if>
+            <if test="status != null">#{status},</if>
+            <if test="currentCompany != null">#{currentCompany},</if>
+            <if test="industry != null">#{industry},</if>
+            <if test="workingPlace != null">#{workingPlace},</if>
+            <if test="certificate != null">#{certificate},</if>
+            <if test="languageAbility != null">#{languageAbility},</if>
+            <if test="industryExperience != null">#{industryExperience},</if>
+            <if test="workExperience != null">#{workExperience},</if>
+            <if test="post != null">#{post},</if>
+            <if test="lastCompany != null">#{lastCompany},</if>
+            <if test="lastIndustry != null">#{lastIndustry},</if>
+            <if test="lastPosition != null">#{lastPosition},</if>
+            <if test="position != null">#{position},</if>
+            <if test="selfEvaluation != null">#{selfEvaluation},</if>
+            <if test="exceptedSalary != null">#{exceptedSalary},</if>
+            <if test="isEnabled != null">#{isEnabled},</if>
+         </trim>
+    </insert>
+
+    <update id="updateResume" parameterType="Resume">
+        update resume
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="resumeName != null">resume_name = #{resumeName},</if>
+            <if test="userName != null">user_name = #{userName},</if>
+            <if test="gender != null">gender = #{gender},</if>
+            <if test="birthday != null">birthday = #{birthday},</if>
+            <if test="age != null">age = #{age},</if>
+            <if test="degree != null">degree = #{degree},</if>
+            <if test="experience != null">experience = #{experience},</if>
+            <if test="mobile != null">mobile = #{mobile},</if>
+            <if test="cardNo != null">card_no = #{cardNo},</if>
+            <if test="email != null">email = #{email},</if>
+            <if test="isMarryed != null">is_marryed = #{isMarryed},</if>
+            <if test="residence != null">residence = #{residence},</if>
+            <if test="origin != null">origin = #{origin},</if>
+            <if test="nationality != null">nationality = #{nationality},</if>
+            <if test="graduateCollege != null">graduate_college = #{graduateCollege},</if>
+            <if test="major != null">major = #{major},</if>
+            <if test="lanuage != null">lanuage = #{lanuage},</if>
+            <if test="graduateDate != null">graduate_date = #{graduateDate},</if>
+            <if test="positionRating != null">position_rating = #{positionRating},</if>
+            <if test="keyWords != null">key_words = #{keyWords},</if>
+            <if test="jobObjective != null">job_objective = #{jobObjective},</if>
+            <if test="salary != null">salary = #{salary},</if>
+            <if test="selfIntroduce != null">self_introduce = #{selfIntroduce},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="headUrl != null">head_url = #{headUrl},</if>
+            <if test="isPrivate != null">is_private = #{isPrivate},</if>
+            <if test="isDeleted != null">is_deleted = #{isDeleted},</if>
+            <if test="createDate != null">create_date = #{createDate},</if>
+            <if test="updateUserId != null">update_user_id = #{updateUserId},</if>
+            <if test="updateDate != null">update_date = #{updateDate},</if>
+            <if test="resumeDownloadUrl != null">resume_download_url = #{resumeDownloadUrl},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="currentCompany != null">current_company = #{currentCompany},</if>
+            <if test="industry != null">industry = #{industry},</if>
+            <if test="workingPlace != null">working_place = #{workingPlace},</if>
+            <if test="certificate != null">certificate = #{certificate},</if>
+            <if test="languageAbility != null">language_ability = #{languageAbility},</if>
+            <if test="industryExperience != null">industry_experience = #{industryExperience},</if>
+            <if test="workExperience != null">work_experience = #{workExperience},</if>
+            <if test="post != null">post = #{post},</if>
+            <if test="lastCompany != null">last_company = #{lastCompany},</if>
+            <if test="lastIndustry != null">last_industry = #{lastIndustry},</if>
+            <if test="lastPosition != null">last_position = #{lastPosition},</if>
+            <if test="position != null">position = #{position},</if>
+            <if test="selfEvaluation != null">self_evaluation = #{selfEvaluation},</if>
+            <if test="exceptedSalary != null">excepted_salary = #{exceptedSalary},</if>
+            <if test="isEnabled != null">is_enabled = #{isEnabled},</if>
+        </trim>
+        where resume_id = #{resumeId}
+    </update>
+
+    <delete id="deleteResumeByResumeId" parameterType="Long">
+        delete from resume where resume_id = #{resumeId}
+    </delete>
+
+    <delete id="deleteResumeByResumeIds" parameterType="String">
+        delete from resume where resume_id in 
+        <foreach item="resumeId" collection="array" open="(" separator="," close=")">
+            #{resumeId}
+        </foreach>
+    </delete>
+</mapper>

+ 101 - 0
ruoyi-system/src/main/resources/mapper/resume/ResumeProjectMapper.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.ResumeProjectMapper">
+    
+    <resultMap type="ResumeProject" id="ResumeProjectResult">
+        <result property="projectId"    column="project_id"    />
+        <result property="projectName"    column="project_name"    />
+        <result property="projectDetail"    column="project_detail"    />
+        <result property="partIn"    column="part_in"    />
+        <result property="projectStartDate"    column="project_start_date"    />
+        <result property="projectEndDate"    column="project_end_date"    />
+        <result property="resumeId"    column="resume_id"    />
+        <result property="developEnvironment"    column="develop_environment"    />
+        <result property="developTools"    column="develop_tools"    />
+        <result property="orderBy"    column="order_by"    />
+    </resultMap>
+
+    <sql id="selectResumeProjectVo">
+        select project_id, project_name, project_detail, part_in, project_start_date, project_end_date, resume_id, develop_environment, develop_tools, order_by from resume_project
+    </sql>
+
+    <select id="selectResumeProjectList" parameterType="ResumeProject" resultMap="ResumeProjectResult">
+        <include refid="selectResumeProjectVo"/>
+        <where>  
+            <if test="projectName != null  and projectName != ''"> and project_name like concat('%', #{projectName}, '%')</if>
+            <if test="projectDetail != null  and projectDetail != ''"> and project_detail = #{projectDetail}</if>
+            <if test="partIn != null  and partIn != ''"> and part_in = #{partIn}</if>
+            <if test="projectStartDate != null  and projectStartDate != ''"> and project_start_date = #{projectStartDate}</if>
+            <if test="projectEndDate != null  and projectEndDate != ''"> and project_end_date = #{projectEndDate}</if>
+            <if test="resumeId != null "> and resume_id = #{resumeId}</if>
+            <if test="developEnvironment != null  and developEnvironment != ''"> and develop_environment = #{developEnvironment}</if>
+            <if test="developTools != null  and developTools != ''"> and develop_tools = #{developTools}</if>
+            <if test="orderBy != null "> and order_by = #{orderBy}</if>
+        </where>
+        order by order_by
+    </select>
+    
+    <select id="selectResumeProjectByProjectId" parameterType="Long" resultMap="ResumeProjectResult">
+        <include refid="selectResumeProjectVo"/>
+        where project_id = #{projectId}
+    </select>
+        
+    <insert id="insertResumeProject" parameterType="ResumeProject" useGeneratedKeys="true" keyProperty="projectId">
+        insert into resume_project
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="projectName != null">project_name,</if>
+            <if test="projectDetail != null">project_detail,</if>
+            <if test="partIn != null">part_in,</if>
+            <if test="projectStartDate != null">project_start_date,</if>
+            <if test="projectEndDate != null">project_end_date,</if>
+            <if test="resumeId != null">resume_id,</if>
+            <if test="developEnvironment != null">develop_environment,</if>
+            <if test="developTools != null">develop_tools,</if>
+            <if test="orderBy != null">order_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="projectName != null">#{projectName},</if>
+            <if test="projectDetail != null">#{projectDetail},</if>
+            <if test="partIn != null">#{partIn},</if>
+            <if test="projectStartDate != null">#{projectStartDate},</if>
+            <if test="projectEndDate != null">#{projectEndDate},</if>
+            <if test="resumeId != null">#{resumeId},</if>
+            <if test="developEnvironment != null">#{developEnvironment},</if>
+            <if test="developTools != null">#{developTools},</if>
+            <if test="orderBy != null">#{orderBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateResumeProject" parameterType="ResumeProject">
+        update resume_project
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectName != null">project_name = #{projectName},</if>
+            <if test="projectDetail != null">project_detail = #{projectDetail},</if>
+            <if test="partIn != null">part_in = #{partIn},</if>
+            <if test="projectStartDate != null">project_start_date = #{projectStartDate},</if>
+            <if test="projectEndDate != null">project_end_date = #{projectEndDate},</if>
+            <if test="resumeId != null">resume_id = #{resumeId},</if>
+            <if test="developEnvironment != null">develop_environment = #{developEnvironment},</if>
+            <if test="developTools != null">develop_tools = #{developTools},</if>
+            <if test="orderBy != null">order_by = #{orderBy},</if>
+        </trim>
+        where project_id = #{projectId}
+    </update>
+
+    <delete id="deleteResumeProjectByProjectId" parameterType="Long">
+        delete from resume_project where project_id = #{projectId}
+    </delete>
+
+    <delete id="deleteResumeProjectByResumeId" parameterType="Long">
+        delete from resume_project where resume_id = #{resumeId}
+    </delete>
+
+    <delete id="deleteResumeProjectByProjectIds" parameterType="String">
+        delete from resume_project where project_id in 
+        <foreach item="projectId" collection="array" open="(" separator="," close=")">
+            #{projectId}
+        </foreach>
+    </delete>
+</mapper>

+ 111 - 0
ruoyi-system/src/main/resources/mapper/resume/ResumeWorkMapper.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.resume.ResumeWorkMapper">
+    
+    <resultMap type="ResumeWork" id="ResumeWorkResult">
+        <result property="workId"    column="work_id"    />
+        <result property="companyName"    column="company_name"    />
+        <result property="companyPosition"    column="company_position"    />
+        <result property="leaderName"    column="leader_name"    />
+        <result property="leaderMobile"    column="leader_mobile"    />
+        <result property="iinductionStartDate"    column="iinduction_start_date"    />
+        <result property="iinductionEndDate"    column="iinduction_end_date"    />
+        <result property="postionName"    column="postion_name"    />
+        <result property="workDetail"    column="work_detail"    />
+        <result property="resumeId"    column="resume_id"    />
+        <result property="orderBy"    column="order_by"    />
+        <result property="reason"    column="reason"    />
+    </resultMap>
+
+    <sql id="selectResumeWorkVo">
+        select work_id, company_name, company_position, leader_name, leader_mobile, iinduction_start_date, iinduction_end_date, postion_name, work_detail, resume_id, order_by, reason from resume_work
+    </sql>
+
+    <select id="selectResumeWorkList" parameterType="ResumeWork" resultMap="ResumeWorkResult">
+        <include refid="selectResumeWorkVo"/>
+        <where>  
+            <if test="companyName != null  and companyName != ''"> and company_name like concat('%', #{companyName}, '%')</if>
+            <if test="companyPosition != null  and companyPosition != ''"> and company_position = #{companyPosition}</if>
+            <if test="leaderName != null  and leaderName != ''"> and leader_name like concat('%', #{leaderName}, '%')</if>
+            <if test="leaderMobile != null  and leaderMobile != ''"> and leader_mobile = #{leaderMobile}</if>
+            <if test="iinductionStartDate != null  and iinductionStartDate != ''"> and iinduction_start_date = #{iinductionStartDate}</if>
+            <if test="iinductionEndDate != null  and iinductionEndDate != ''"> and iinduction_end_date = #{iinductionEndDate}</if>
+            <if test="postionName != null  and postionName != ''"> and postion_name like concat('%', #{postionName}, '%')</if>
+            <if test="workDetail != null  and workDetail != ''"> and work_detail = #{workDetail}</if>
+            <if test="resumeId != null "> and resume_id = #{resumeId}</if>
+            <if test="orderBy != null "> and order_by = #{orderBy}</if>
+            <if test="reason != null  and reason != ''"> and reason = #{reason}</if>
+        </where>
+        order by order_by
+    </select>
+    
+    <select id="selectResumeWorkByWorkId" parameterType="Long" resultMap="ResumeWorkResult">
+        <include refid="selectResumeWorkVo"/>
+        where work_id = #{workId}
+    </select>
+        
+    <insert id="insertResumeWork" parameterType="ResumeWork" useGeneratedKeys="true" keyProperty="workId">
+        insert into resume_work
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="companyName != null">company_name,</if>
+            <if test="companyPosition != null">company_position,</if>
+            <if test="leaderName != null">leader_name,</if>
+            <if test="leaderMobile != null">leader_mobile,</if>
+            <if test="iinductionStartDate != null">iinduction_start_date,</if>
+            <if test="iinductionEndDate != null">iinduction_end_date,</if>
+            <if test="postionName != null">postion_name,</if>
+            <if test="workDetail != null">work_detail,</if>
+            <if test="resumeId != null">resume_id,</if>
+            <if test="orderBy != null">order_by,</if>
+            <if test="reason != null">reason,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="companyName != null">#{companyName},</if>
+            <if test="companyPosition != null">#{companyPosition},</if>
+            <if test="leaderName != null">#{leaderName},</if>
+            <if test="leaderMobile != null">#{leaderMobile},</if>
+            <if test="iinductionStartDate != null">#{iinductionStartDate},</if>
+            <if test="iinductionEndDate != null">#{iinductionEndDate},</if>
+            <if test="postionName != null">#{postionName},</if>
+            <if test="workDetail != null">#{workDetail},</if>
+            <if test="resumeId != null">#{resumeId},</if>
+            <if test="orderBy != null">#{orderBy},</if>
+            <if test="reason != null">#{reason},</if>
+         </trim>
+    </insert>
+
+    <update id="updateResumeWork" parameterType="ResumeWork">
+        update resume_work
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="companyName != null">company_name = #{companyName},</if>
+            <if test="companyPosition != null">company_position = #{companyPosition},</if>
+            <if test="leaderName != null">leader_name = #{leaderName},</if>
+            <if test="leaderMobile != null">leader_mobile = #{leaderMobile},</if>
+            <if test="iinductionStartDate != null">iinduction_start_date = #{iinductionStartDate},</if>
+            <if test="iinductionEndDate != null">iinduction_end_date = #{iinductionEndDate},</if>
+            <if test="postionName != null">postion_name = #{postionName},</if>
+            <if test="workDetail != null">work_detail = #{workDetail},</if>
+            <if test="resumeId != null">resume_id = #{resumeId},</if>
+            <if test="orderBy != null">order_by = #{orderBy},</if>
+            <if test="reason != null">reason = #{reason},</if>
+        </trim>
+        where work_id = #{workId}
+    </update>
+
+    <delete id="deleteResumeWorkByWorkId" parameterType="Long">
+        delete from resume_work where work_id = #{workId}
+    </delete>
+
+    <delete id="deleteResumeWorkByResumeId" parameterType="Long">
+        delete from resume_work where resume_id = #{resumeId}
+    </delete>
+
+    <delete id="deleteResumeWorkByWorkIds" parameterType="String">
+        delete from resume_work where work_id in 
+        <foreach item="workId" collection="array" open="(" separator="," close=")">
+            #{workId}
+        </foreach>
+    </delete>
+</mapper>

+ 5 - 0
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -60,6 +60,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<include refid="selectRoleVo"/>
 		WHERE r.del_flag = '0' and ur.user_id = #{userId}
 	</select>
+
+	<select id="selectRoleByKey" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		WHERE r.del_flag = '0' and r.role_key = #{roleKey}
+	</select>
 	
 	<select id="selectRoleAll" resultMap="SysRoleResult">
 		<include refid="selectRoleVo"/>

+ 44 - 0
ruoyi-ui/src/api/system/resume.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询简历管理列表
+export function listResume(query) {
+  return request({
+    url: '/system/resume/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询简历管理详细
+export function getResume(resumeId) {
+  return request({
+    url: '/system/resume/' + resumeId,
+    method: 'get'
+  })
+}
+
+// 新增简历管理
+export function addResume(data) {
+  return request({
+    url: '/system/resume',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改简历管理
+export function updateResume(data) {
+  return request({
+    url: '/system/resume',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除简历管理
+export function delResume(resumeId) {
+  return request({
+    url: '/system/resume/' + resumeId,
+    method: 'delete'
+  })
+}

+ 502 - 0
ruoyi-ui/src/views/system/resume/index.vue

@@ -0,0 +1,502 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="姓名" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="请输入姓名"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="岗位" prop="position">
+        <el-input
+          v-model="queryParams.position"
+          placeholder="请输入岗位"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="学历" prop="degree">
+        <el-input
+          v-model="queryParams.degree"
+          placeholder="请输入学历"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="毕业院校" prop="graduateCollege">
+        <el-input
+          v-model="queryParams.graduateCollege"
+          placeholder="请输入毕业院校"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="专业" prop="major">
+        <el-input
+          v-model="queryParams.major"
+          placeholder="请输入专业"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="求职意向" prop="jobObjective">
+        <el-input
+          v-model="queryParams.jobObjective"
+          placeholder="请输入求职意向"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="导入人" prop="createUserName">
+        <el-input
+          v-model="queryParams.createUserName"
+          placeholder="请输入导入人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="导入开始时间" prop="startTime">
+        <el-date-picker clearable
+                        v-model="queryParams.startTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择导入开始时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="导入结束时间" prop="endTime">
+        <el-date-picker clearable
+                        v-model="queryParams.endTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="请选择导入结束时间">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:resume:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:resume:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:resume:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:resume:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="resumeList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="基本信息" width="300" align="center" prop="resumeId" >
+        <template slot-scope="scope">
+          <span>{{scope.row.userName}}|{{ parseTime(scope.row.birthday, '{y}-{m}-{d}') }}|{{scope.row.gender}}
+            |{{scope.row.experience}}|{{scope.row.degree}}|{{scope.row.graduateCollege}}
+          |{{scope.row.major}}|{{scope.row.jobObjective}}|{{scope.row.residence}}
+          |{{scope.row.mobile}}|{{scope.row.email}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="职位" align="center" prop="position" width="100" />
+      <el-table-column label="导入时间" align="center" prop="createDate" width="150">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="导入人" align="center" prop="createUserName" width="100" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:resume:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:resume:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改简历管理对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="候选人姓名" prop="userName">
+          <el-input v-model="form.userName" placeholder="请输入姓名" />
+        </el-form-item>
+        <el-form-item label="手机号码" prop="mobile">
+          <el-input v-model="form.mobile" placeholder="请输入手机号码" />
+        </el-form-item>
+        <el-form-item label="简历附件" prop="resumeFile">
+          <file-upload v-model="form.resumeFile" />
+        </el-form-item>
+        <el-form-item label="工作地" prop="workingPlace">
+          <el-input v-model="form.workingPlace" placeholder="请输入工作地" />
+        </el-form-item>
+        <el-form-item label="学历" prop="degree">
+          <el-input v-model="form.degree" placeholder="请输入学历" />
+        </el-form-item>
+        <el-form-item label="性别" prop="gender">
+          <el-input v-model="form.gender" placeholder="请输入性别" />
+        </el-form-item>
+        <el-form-item label="年龄" prop="age">
+          <el-input v-model="form.age" placeholder="请输入年龄" />
+        </el-form-item>
+        <el-form-item label="居住地" prop="residence">
+          <el-input v-model="form.residence" placeholder="请输入居住地" />
+        </el-form-item>
+        <el-form-item label="专业" prop="major">
+          <el-input v-model="form.major" placeholder="请输入专业" />
+        </el-form-item>
+        <el-form-item label="行业经验" prop="industryExperience">
+          <el-input v-model="form.industryExperience" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="毕业院校" prop="graduateCollege">
+          <el-input v-model="form.graduateCollege" placeholder="请输入毕业院校" />
+        </el-form-item>
+        <el-form-item label="岗位" prop="position">
+          <el-input v-model="form.position" placeholder="请输入岗位" />
+        </el-form-item>
+        <el-form-item label="语言能力" prop="languageAbility">
+          <el-input v-model="form.languageAbility" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="证书" prop="certificate">
+          <el-input v-model="form.certificate" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="电子邮箱" prop="email">
+          <el-input v-model="form.email" placeholder="请输入电子邮箱" />
+        </el-form-item>
+        <el-form-item label="生日" prop="birthday">
+          <el-date-picker clearable
+                          v-model="form.birthday"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="请选择生日">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="工作年限" prop="experience">
+          <el-input v-model="form.experience" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="期望薪资" prop="exceptedSalary">
+          <el-input v-model="form.exceptedSalary" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="最近工作公司" prop="lastCompany">
+          <el-input v-model="form.lastCompany" placeholder="请输入最近工作公司" />
+        </el-form-item>
+        <el-form-item label="最近工作行业" prop="lastIndustry">
+          <el-input v-model="form.lastIndustry" placeholder="请输入最近工作行业" />
+        </el-form-item>
+        <el-form-item label="最近工作职位" prop="lastPosition">
+          <el-input v-model="form.lastPosition" placeholder="请输入最近工作职位" />
+        </el-form-item>
+        <el-form-item label="专业技能" prop="keyWords">
+          <el-input v-model="form.keyWords" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="自我评价" prop="selfEvaluation">
+          <el-input v-model="form.selfEvaluation" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+
+        <el-form-item label="工作履历" prop="resumeWork">
+          <el-input v-model="form.resumeWork" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="项目经验" prop="resumeProject">
+          <el-input v-model="form.resumeProject" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="教育经历" prop="resumeEducation">
+          <el-input v-model="form.resumeEducation" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listResume, getResume, delResume, addResume, updateResume } from "@/api/system/resume";
+
+export default {
+  name: "Resume",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 简历管理表格数据
+      resumeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        resumeName: null,
+        userName: null,
+        gender: null,
+        birthday: null,
+        age: null,
+        degree: null,
+        experience: null,
+        mobile: null,
+        cardNo: null,
+        email: null,
+        isMarryed: null,
+        residence: null,
+        origin: null,
+        nationality: null,
+        graduateCollege: null,
+        major: null,
+        lanuage: null,
+        graduateDate: null,
+        positionRating: null,
+        keyWords: null,
+        jobObjective: null,
+        salary: null,
+        selfIntroduce: null,
+        userId: null,
+        headUrl: null,
+        isPrivate: null,
+        isDeleted: null,
+        createDate: null,
+        createUserName: null,
+        updateUserId: null,
+        updateDate: null,
+        resumeDownloadUrl: null,
+        status: null,
+        currentCompany: null,
+        industry: null,
+        workingPlace: null,
+        certificate: null,
+        languageAbility: null,
+        industryExperience: null,
+        workExperience: null,
+        post: null,
+        lastCompany: null,
+        lastIndustry: null,
+        lastPosition: null,
+        position: null,
+        selfEvaluation: null,
+        exceptedSalary: null,
+        isEnabled: null,
+        startTime: null,
+        endTime: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询简历管理列表 */
+    getList() {
+      this.loading = true;
+      listResume(this.queryParams).then(response => {
+        this.resumeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        resumeId: null,
+        resumeName: null,
+        userName: null,
+        gender: null,
+        birthday: null,
+        age: null,
+        degree: null,
+        experience: null,
+        mobile: null,
+        cardNo: null,
+        email: null,
+        isMarryed: null,
+        residence: null,
+        origin: null,
+        nationality: null,
+        graduateCollege: null,
+        major: null,
+        lanuage: null,
+        graduateDate: null,
+        positionRating: null,
+        keyWords: null,
+        jobObjective: null,
+        salary: null,
+        selfIntroduce: null,
+        userId: null,
+        headUrl: null,
+        isPrivate: null,
+        isDeleted: null,
+        createDate: null,
+        createUserName: null,
+        updateUserId: null,
+        updateDate: null,
+        resumeDownloadUrl: null,
+        status: null,
+        currentCompany: null,
+        industry: null,
+        workingPlace: null,
+        certificate: null,
+        languageAbility: null,
+        industryExperience: null,
+        workExperience: null,
+        post: null,
+        lastCompany: null,
+        lastIndustry: null,
+        lastPosition: null,
+        position: null,
+        selfEvaluation: null,
+        exceptedSalary: null,
+        isEnabled: null,
+        startTime: null,
+        endTime: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.resumeId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加简历管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const resumeId = row.resumeId || this.ids
+      getResume(resumeId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改简历管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.resumeId != null) {
+            updateResume(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addResume(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const resumeIds = row.resumeId || this.ids;
+      this.$modal.confirm('是否确认删除简历管理编号为"' + resumeIds + '"的数据项?').then(function() {
+        return delResume(resumeIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/resume/export', {
+        ...this.queryParams
+      }, `resume_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>