Bladeren bron

Merge remote-tracking branch 'origin/master'

liao-sea 9 maanden geleden
bovenliggende
commit
0b5b48bf20
26 gewijzigde bestanden met toevoegingen van 619 en 169 verwijderingen
  1. 19 0
      h5app/src/utils/crypto.ts
  2. 11 0
      h5app/src/views/pages/jobUserInfo/userEdit.vue
  3. 7 2
      h5app/src/views/pages/jobhunt/detail.vue
  4. 10 0
      h5app/src/views/pages/jobhunt/edit.vue
  5. 2 0
      h5app/src/views/pages/wxMessage/jobUserInfo.vue
  6. 3 2
      src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java
  7. 9 8
      src/main/java/com/hz/employmentsite/mapper/cquery/CompanyCQuery.java
  8. 5 0
      src/main/java/com/hz/employmentsite/mapper/cquery/JobUserCQuery.java
  9. 13 12
      src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java
  10. 40 6
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java
  11. 14 2
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java
  12. 11 10
      src/main/java/com/hz/employmentsite/services/service/companyService/CompanyService.java
  13. 79 0
      src/main/java/com/hz/employmentsite/util/CalculateUtils.java
  14. 62 0
      src/main/java/com/hz/employmentsite/util/DesUtils.java
  15. 54 0
      src/main/java/com/hz/employmentsite/vo/dataMap/CompanyPostMapVo.java
  16. 3 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendCompanyPostVo.java
  17. 3 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendJobVo.java
  18. 27 32
      src/main/resources/mapping/cquery/CompanyCQuery.xml
  19. 9 3
      src/main/resources/mapping/cquery/JobUserCQuery.xml
  20. BIN
      src/main/resources/static/doc/template/岗位信息导入模板.xlsx
  21. 19 0
      vue/src/utils/crypto.ts
  22. 2 2
      vue/src/views/companyService/post/index.vue
  23. 190 87
      vue/src/views/dataMap/companyDataMap.vue
  24. 18 3
      vue/src/views/dataMap/siteDataMap.vue
  25. 5 0
      vue/src/views/jobUserManager/jobuser/edit.vue
  26. 4 0
      vue/src/views/jobUserManager/jobuser/vitae.vue

+ 19 - 0
h5app/src/utils/crypto.ts

@@ -5,6 +5,7 @@ interface DesModel {
   token: string,
   tm: string
 }
+const textKey = "0448fa97-c645-444b-aeae-d26366f98f4d";
 
 const crypto = {
   encryptDes (value: string) {
@@ -28,6 +29,24 @@ const crypto = {
   },
   MD5 (value: string) {
     return cryptoJs.MD5(value)
+  },
+  encryptDesText (value: any) {
+    if(!value){
+      return "";
+    }
+
+    const option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
+    const encrypted = cryptoJs.DES.encrypt(value, cryptoJs.enc.Utf8.parse(textKey), option)
+    return encrypted.toString()
+  },
+  decryptDesText (value: any) {
+    if(!value){
+      return "";
+    }
+
+    const option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
+    const decrypted = cryptoJs.DES.decrypt(value, cryptoJs.enc.Utf8.parse(textKey), option)
+    return decrypted.toString(cryptoJs.enc.Utf8)
   }
 }
 

+ 11 - 0
h5app/src/views/pages/jobUserInfo/userEdit.vue

@@ -476,6 +476,7 @@ import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
 import dayjs from "dayjs";
 import CategorySelection from "@/components/ocCategorySelection.vue";
 import {getPosition} from "@/utils/position";
+import crtyptoHelp from "@/utils/crypto"
 
 interface SelectProps {
   name: string,
@@ -741,9 +742,16 @@ export default defineComponent({
         inputDataValidate();
         if(isAllowCommit.value){
           baseInfoData.baseData.loginUserID = curStepData.value.loginUserID;
+          const userMobile = baseInfoData.baseData.userMobile;
+          const identityNumber = baseInfoData.baseData.identityNumber;
+          baseInfoData.baseData.userMobile = crtyptoHelp.encryptDesText(baseInfoData.baseData.userMobile);
+          baseInfoData.baseData.identityNumber = crtyptoHelp.encryptDesText(baseInfoData.baseData.identityNumber);
           baseInfoSave(baseInfoData.baseData).then(result => {
             if (result) {
               router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2,loginUserId:curStepData.value.loginUserID}});
+            }else{
+              baseInfoData.baseData.userMobile = userMobile;
+              baseInfoData.baseData.identityNumber = identityNumber;
             }
           });
         }
@@ -840,6 +848,9 @@ export default defineComponent({
         const reqData = await getJobUserById(jobUserID,userId);
         baseInfoData.baseData = reqData;
         baseInfoData.baseData.openId = openId;
+
+        baseInfoData.baseData.userMobile = crtyptoHelp.decryptDesText(baseInfoData.baseData.userMobile);
+        baseInfoData.baseData.identityNumber = crtyptoHelp.decryptDesText(baseInfoData.baseData.identityNumber);
         console.log("当前baseInfoData",baseInfoData.baseData);
         await getStreetList();
       }

+ 7 - 2
h5app/src/views/pages/jobhunt/detail.vue

@@ -312,6 +312,7 @@ import {useRoute, useRouter} from "vue-router";
 import {onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline} from 'ionicons/icons';
 import dayjs from "dayjs";
+import crtyptoHelp from "@/utils/crypto";
 
 interface FormData{
   dataModel:any
@@ -375,8 +376,12 @@ export default defineComponent({
           formData.dataModel.tagName += it.labelName+" ";
         })
       }
-      const replaceStr =  formData.dataModel.identityNumber.substring(3,15);
-      formData.dataModel.identityNumberShow = String(formData.dataModel.identityNumber).replace(replaceStr,'************');
+
+
+      // const identityNumber = crtyptoHelp.decryptDesText(formData.dataModel.identityNumber);
+      // const replaceStr =  identityNumber.substring(3,15);
+      // formData.dataModel.identityNumberShow = String(identityNumber).replace(replaceStr,'************');
+      formData.dataModel.userMobile = crtyptoHelp.decryptDesText(formData.dataModel.userMobile);
       console.log("dataModel",formData.dataModel);
 
       dicHighestDegree.value = await getSysDictionaryList("HighestDegree");

+ 10 - 0
h5app/src/views/pages/jobhunt/edit.vue

@@ -492,6 +492,7 @@ import {useUserStore} from "@/store/modules/user";
 import CategorySelection from "@/components/ocCategorySelection.vue";
 import {getPosition} from "@/utils/position";
 import LabelSelection from "@/components/labelSelection.vue";
+import crtyptoHelp from "@/utils/crypto";
 
 interface SelectProps {
   name: string,
@@ -760,9 +761,16 @@ export default defineComponent({
         inputDataValidate();
         if(isAllowCommit.value){
           console.log("当前数据",baseInfoData.baseData);
+          const userMobile = baseInfoData.baseData.userMobile;
+          const identityNumber = baseInfoData.baseData.identityNumber;
+          baseInfoData.baseData.userMobile = crtyptoHelp.encryptDesText(baseInfoData.baseData.userMobile);
+          baseInfoData.baseData.identityNumber = crtyptoHelp.encryptDesText(baseInfoData.baseData.identityNumber);
           baseInfoSave(baseInfoData.baseData).then(result => {
             if (result) {
               router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2}});
+            }else{
+              baseInfoData.baseData.userMobile = userMobile;
+              baseInfoData.baseData.identityNumber = identityNumber;
             }
           });
         }
@@ -862,6 +870,8 @@ export default defineComponent({
         const reqData = await getJobUserById(jobUserID,curUserID);
         isEdit.value = jobUserID != null;
         baseInfoData.baseData = reqData;
+        baseInfoData.baseData.userMobile = crtyptoHelp.decryptDesText(baseInfoData.baseData.userMobile);
+        baseInfoData.baseData.identityNumber = crtyptoHelp.decryptDesText(baseInfoData.baseData.identityNumber);
         baseInfoData.baseData.loginUserID = curUserID;
         //console.log('baseData',baseInfoData.baseData);
         await getStreetList();

+ 2 - 0
h5app/src/views/pages/wxMessage/jobUserInfo.vue

@@ -86,6 +86,7 @@ import {getUrlParams} from "../../../utils/urlUtils";
 import {getEducationList, getExperienceList, getJobUserById} from "../../../api/jobUserInfo";
 import {alertController} from "@ionic/vue";
 import dayjs from "dayjs";
+import crtyptoHelp from "@/utils/crypto";
 
 const presentAlert = async (message) => {
   const alert = await alertController.create({
@@ -121,6 +122,7 @@ export default defineComponent({
     const getJobUserInfo = async (id) => {
       getJobUserById(id).then((data) => {
         jobUserInfo.value = data;
+        jobUserInfo.value.userMobile = crtyptoHelp.decryptDesText(jobUserInfo.value.userMobile);
       });
 
       getEducationList(id).then((data) => {

+ 3 - 2
src/main/java/com/hz/employmentsite/controller/companyService/CompanyController.java

@@ -15,6 +15,7 @@ import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.companyService.AppCompanyPostVo;
 import com.hz.employmentsite.vo.companyService.CompanyVo;
+import com.hz.employmentsite.vo.dataMap.CompanyPostMapVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -219,7 +220,7 @@ public class CompanyController {
                                        @RequestParam(required = false) Integer companyModel, @RequestParam(required = false) Integer recordStatus,
                                        @RequestParam(required = false) String regionCode, @RequestParam(required = false) String siteID,
                                        @RequestParam Double latitude, @RequestParam Double longitude) {
-        PageInfo<CompanyVo> result = companyService.getDataMapList(pageIndex, pageSize, companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        PageInfo<CompanyPostMapVo> result = companyService.getDataMapList(pageIndex, pageSize, companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
         return RespGenerstor.success(result);
     }
 
@@ -235,7 +236,7 @@ public class CompanyController {
                                                  @RequestParam(required = false) Integer companyModel, @RequestParam(required = false) Integer recordStatus,
                                                  @RequestParam(required = false) String regionCode, @RequestParam(required = false) String siteID,
                                                  @RequestParam Double latitude, @RequestParam Double longitude) {
-        PageInfo<CompanyVo> result = companyService.getDataMapListByPostName(pageIndex, pageSize, companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        PageInfo<CompanyPostMapVo> result = companyService.getDataMapListByPostName(pageIndex, pageSize, companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
         return RespGenerstor.success(result);
     }
 

+ 9 - 8
src/main/java/com/hz/employmentsite/mapper/cquery/CompanyCQuery.java

@@ -2,6 +2,7 @@ package com.hz.employmentsite.mapper.cquery;
 
 import com.hz.employmentsite.model.PcFirm;
 import com.hz.employmentsite.vo.companyService.CompanyVo;
+import com.hz.employmentsite.vo.dataMap.CompanyPostMapVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -28,10 +29,10 @@ public interface CompanyCQuery {
      * @param siteID       所属驿站
      * @return 企业VO列表
      */
-    List<CompanyVo> getDataMapList(@Param("companyName") String companyName, @Param("maxDistance") Integer maxDistance,
-                                   @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
-                                   @Param("regionCode") String regionCode, @Param("siteID") String siteID,
-                                   @Param("latitude") Double latitude, @Param("longitude") Double longitude);
+    List<CompanyPostMapVo> getDataMapList(@Param("companyName") String companyName, @Param("maxDistance") Integer maxDistance,
+                                          @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
+                                          @Param("regionCode") String regionCode, @Param("siteID") String siteID,
+                                          @Param("latitude") Double latitude, @Param("longitude") Double longitude);
 
     /**
      * 企业可视化地图查询企业-按岗位名称反向查询
@@ -46,8 +47,8 @@ public interface CompanyCQuery {
      * @param longitude    定点经度
      * @return 企业信息列表
      */
-    List<CompanyVo> getDataMapListByPostName(@Param("postName") String postName, @Param("maxDistance") Integer maxDistance,
-                                             @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
-                                             @Param("regionCode") String regionCode, @Param("siteID") String siteID,
-                                             @Param("latitude") Double latitude, @Param("longitude") Double longitude);
+    List<CompanyPostMapVo> getDataMapListByPostName(@Param("postName") String postName, @Param("maxDistance") Integer maxDistance,
+                                                    @Param("companyModel") Integer companyModel, @Param("recordStatus") Integer recordStatus,
+                                                    @Param("regionCode") String regionCode, @Param("siteID") String siteID,
+                                                    @Param("latitude") Double latitude, @Param("longitude") Double longitude);
 }

+ 5 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/JobUserCQuery.java

@@ -1,5 +1,6 @@
 package com.hz.employmentsite.mapper.cquery;
 
+import com.hz.employmentsite.model.PcJobuser;
 import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -14,4 +15,8 @@ public interface JobUserCQuery {
                                       @Param("workTime") String workTime, @Param("curLoginUserSiteID") String curLoginUserSiteID,
                                       @Param("regionCode") String regionCode, @Param("startDate") Date startDate,
                                       @Param("endDate") Date endDate);
+
+    List<PcJobuser> getJobUserIdentityNumber();
+
+    List<PcJobuser> getJobUserUserMobile();
 }

+ 13 - 12
src/main/java/com/hz/employmentsite/services/impl/companyService/CompanyServiceImpl.java

@@ -14,6 +14,7 @@ import com.hz.employmentsite.services.service.system.DictionaryService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.companyService.AppCompanyPostVo;
 import com.hz.employmentsite.vo.companyService.CompanyVo;
+import com.hz.employmentsite.vo.dataMap.CompanyPostMapVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -650,13 +651,13 @@ public class CompanyServiceImpl implements CompanyService {
      * @return 企业VO列表
      */
     @Override
-    public PageInfo<CompanyVo> getDataMapList(int pageIndex, int pageSize,
-                                              String companyName, Integer maxDistance, Integer companyModel,
-                                              Integer recordStatus, String regionCode, String siteID,
-                                              Double latitude, Double longitude) {
+    public PageInfo<CompanyPostMapVo> getDataMapList(int pageIndex, int pageSize,
+                                                     String companyName, Integer maxDistance, Integer companyModel,
+                                                     Integer recordStatus, String regionCode, String siteID,
+                                                     Double latitude, Double longitude) {
         PageHelper.startPage(pageIndex, pageSize);
-        List<CompanyVo> dataMapList = companyCQuery.getDataMapList(companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
-        PageInfo<CompanyVo> result = new PageInfo(dataMapList);
+        List<CompanyPostMapVo> dataMapList = companyCQuery.getDataMapList(companyName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        PageInfo<CompanyPostMapVo> result = new PageInfo(dataMapList);
         return result;
     }
 
@@ -676,13 +677,13 @@ public class CompanyServiceImpl implements CompanyService {
      * @return 企业VO列表
      */
     @Override
-    public PageInfo<CompanyVo> getDataMapListByPostName(int pageIndex, int pageSize, String postName,
-                                                        Integer maxDistance, Integer companyModel, Integer recordStatus,
-                                                        String regionCode, String siteID, Double latitude,
-                                                        Double longitude) {
+    public PageInfo<CompanyPostMapVo> getDataMapListByPostName(int pageIndex, int pageSize, String postName,
+                                                               Integer maxDistance, Integer companyModel, Integer recordStatus,
+                                                               String regionCode, String siteID, Double latitude,
+                                                               Double longitude) {
         PageHelper.startPage(pageIndex, pageSize);
-        List<CompanyVo> dataMapList = companyCQuery.getDataMapListByPostName(postName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
-        PageInfo<CompanyVo> result = new PageInfo(dataMapList);
+        List<CompanyPostMapVo> dataMapList = companyCQuery.getDataMapListByPostName(postName, maxDistance, companyModel, recordStatus, regionCode, siteID, latitude, longitude);
+        PageInfo<CompanyPostMapVo> result = new PageInfo(dataMapList);
         return result;
     }
 }

+ 40 - 6
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java

@@ -9,7 +9,9 @@ import com.hz.employmentsite.mapper.cquery.LabelCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
 import com.hz.employmentsite.services.service.system.DictionaryService;
+import com.hz.employmentsite.util.CalculateUtils;
 import com.hz.employmentsite.util.DateUtils;
+import com.hz.employmentsite.util.DesUtils;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +31,10 @@ public class JobUserServiceImpl implements JobUserService {
     private StringUtils stringUtils;
     @Autowired
     private DateUtils dateUtils;
+    @Autowired
+    private DesUtils desUtils;
+    @Autowired
+    private CalculateUtils calculateUtils;
 
     @Autowired
     private DictionaryService dictionaryService;
@@ -72,14 +78,17 @@ public class JobUserServiceImpl implements JobUserService {
         }
         PageHelper.startPage(pageIndex, pageSize);
         List<JobUserVo> list = jobUserCQuery.selectJobUserList(stringUtils.ListToInSql(jobUserIDList), name, siteId, jobStatus, sexId, educationTypeId, emphasisTypeId, createUserId, workTime, curLoginUserSiteID, regionCode, startDate, endDate);
-//        // 信息脱敏
-//        list.forEach(item -> {
-//            item.setAge(dateUtils.getAgeForIdCard(item.getIdentityNumber()));
-//            item.setIdentityNumber(stringUtils.desensitizeData(item.getIdentityNumber(), "************", 3, 4));
-//            item.setSocialSecurityCard(stringUtils.desensitizeData(item.getSocialSecurityCard(), "****", 3, 3));
-//        });
+        // 信息脱敏
+        list.forEach(item -> {
+            item.setUserMobile(calculateUtils.maskMobile(desUtils.decoderText(item.getUserMobile())));
+            String idNumber = desUtils.decoderText(item.getIdentityNumber());
+            item.setIdentityNumber(idNumber);
+            item.setAge(calculateUtils.calculateAge(idNumber));
+        });
         PageInfo<JobUserVo> result = new PageInfo(list);
 
+        setJobUserDes();
+
         return result;
     }
 
@@ -96,6 +105,25 @@ public class JobUserServiceImpl implements JobUserService {
         return dataResult;
     }
 
+    public void setJobUserDes() {
+
+        List<PcJobuser> list1 = jobUserCQuery.getJobUserIdentityNumber();
+        if(list1.size()>0){
+            for (var item: list1) {
+                item.setIdentityNumber(desUtils.encoderText(item.getIdentityNumber()));
+                pcJobuserMapper.updateByPrimaryKey(item);
+            }
+        }
+
+        List<PcJobuser> list2 = jobUserCQuery.getJobUserUserMobile();
+        if(list2.size()>0){
+            for (var item: list2) {
+                item.setUserMobile(desUtils.encoderText(item.getUserMobile()));
+                pcJobuserMapper.updateByPrimaryKey(item);
+            }
+        }
+    }
+
     @Override
     public JobUserVo getDataById(String id) {
 
@@ -106,6 +134,7 @@ public class JobUserServiceImpl implements JobUserService {
         JobUserVo data = jobUserCQuery.selectJobUserList(stringUtils.ListToInSql(Arrays.asList(id)), null, null, null, null, null, null, null, null,null,null,null,null).stream().findFirst().orElse(null);
         if(data!=null){
             data.listLabel = labelCQuery.getUserLabelList(id);
+            data.setAge(calculateUtils.calculateAge(desUtils.decoderText(data.getIdentityNumber())));
         }
         return data;
     }
@@ -706,6 +735,8 @@ public class JobUserServiceImpl implements JobUserService {
                             errorInfo += "性别与身份证号不匹配!";
                         }
                     }
+                    //文本加密
+                    item.setIdentityNumber(desUtils.encoderText(item.getIdentityNumber()));
                 }else{
                     errorInfo += "身份证号码不合法!";
                 }
@@ -758,6 +789,9 @@ public class JobUserServiceImpl implements JobUserService {
             else{
                 if(!userMobileIsValid(item.getUserMobile())){
                     errorInfo += "联系电话不合法!";
+                }else{
+                    //文本加密
+                    item.setUserMobile(desUtils.encoderText(item.getUserMobile()));
                 }
             }
 

+ 14 - 2
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/RecommendMgtServiceImpl.java

@@ -8,6 +8,8 @@ import com.hz.employmentsite.mapper.cquery.RecommendMgtCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.WechatService;
 import com.hz.employmentsite.services.service.jobUserManager.RecommendMgtService;
+import com.hz.employmentsite.util.CalculateUtils;
+import com.hz.employmentsite.util.DesUtils;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.jobUserManager.*;
 import lombok.extern.slf4j.Slf4j;
@@ -41,6 +43,10 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
 
     @Autowired
     private PcPostMapper pcPostMapper;
+    @Autowired
+    private DesUtils desUtils;
+    @Autowired
+    private CalculateUtils calculateUtils;
 
     @Override
     public PageInfo<RecommendMgtVo> getList(Integer page, Integer rows, String name,
@@ -78,6 +84,10 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
             list = recommendMgtCQuery.getRecommendMgtList(null, name, companyName, recommendType, entryState, pushName, qzProfessionName, zpProfessionName, siteID, regionCode, startDate, endDate, stringUtils.ListToInSql(curLoginUserSiteJobHuntIDs));
         }
 
+        list.forEach(item->{
+            item.setUserMobile(calculateUtils.maskMobile(desUtils.decoderText(item.getUserMobile())));
+        });
+
         PageInfo<RecommendMgtVo> result = new PageInfo(list);
 
         return result;
@@ -158,9 +168,11 @@ public class RecommendMgtServiceImpl implements RecommendMgtService {
         PageHelper.startPage(page, rows);
         List<RecommendJobVo> list = recommendMgtCQuery.getRecommendJobList(postID, professionID, userName, type, cultureRank, keyPersonType, parentProfessionID, workYear, minSalary, maxSalary);
         list.forEach(x -> {
-            if (stringUtils.IsNullOrEmpty(x.recommendMgtID)) {
-                x.recommendMgtID = UUID.randomUUID().toString();
+            if (stringUtils.IsNullOrEmpty(x.getRecommendMgtID())) {
+                x.setRecommendMgtID(UUID.randomUUID().toString());
             }
+
+            x.setUserMobile(calculateUtils.maskMobile(desUtils.decoderText(x.getUserMobile())));
         });
         PageInfo<RecommendJobVo> result = new PageInfo(list);
         return result;

+ 11 - 10
src/main/java/com/hz/employmentsite/services/service/companyService/CompanyService.java

@@ -6,6 +6,7 @@ import com.hz.employmentsite.model.PcFirm;
 import com.hz.employmentsite.model.PcSite;
 import com.hz.employmentsite.vo.companyService.AppCompanyPostVo;
 import com.hz.employmentsite.vo.companyService.CompanyVo;
+import com.hz.employmentsite.vo.dataMap.CompanyPostMapVo;
 
 import java.util.Date;
 import java.util.List;
@@ -48,11 +49,11 @@ public interface CompanyService {
      * @param siteID       所属驿站
      * @return 企业VO列表
      */
-    PageInfo<CompanyVo> getDataMapList(int pageIndex, int pageSize,
-                                       String companyName, Integer maxDistance,
-                                       Integer companyModel, Integer recordStatus,
-                                       String regionCode, String siteID,
-                                       Double latitude, Double longitude);
+    PageInfo<CompanyPostMapVo> getDataMapList(int pageIndex, int pageSize,
+                                              String companyName, Integer maxDistance,
+                                              Integer companyModel, Integer recordStatus,
+                                              String regionCode, String siteID,
+                                              Double latitude, Double longitude);
 
     /**
      * 企业可视化地图查询企业-按岗位名称反向查询
@@ -65,9 +66,9 @@ public interface CompanyService {
      * @param siteID       所属驿站
      * @return 企业VO列表
      */
-    PageInfo<CompanyVo> getDataMapListByPostName(int pageIndex, int pageSize,
-                                                 String postName, Integer maxDistance,
-                                                 Integer companyModel, Integer recordStatus,
-                                                 String regionCode, String siteID,
-                                                 Double latitude, Double longitude);
+    PageInfo<CompanyPostMapVo> getDataMapListByPostName(int pageIndex, int pageSize,
+                                                        String postName, Integer maxDistance,
+                                                        Integer companyModel, Integer recordStatus,
+                                                        String regionCode, String siteID,
+                                                        Double latitude, Double longitude);
 }

+ 79 - 0
src/main/java/com/hz/employmentsite/util/CalculateUtils.java

@@ -0,0 +1,79 @@
+package com.hz.employmentsite.util;
+
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+
+@Component
+public class CalculateUtils {
+
+    /**
+     *身份证脱敏
+     *
+     * @param data 身份证
+     * @return 脱敏后的身份证
+     * */
+    public String maskIdentityNumber(String data) {
+
+        if (data == null || data.length() < 9) {
+            return data;
+        }
+        int length = data.length();
+        String firstThree = data.substring(0, 6);
+        String lastFour = data.substring(length - 3);
+
+        StringBuilder maskedId = new StringBuilder(firstThree);
+        for (int i = 0; i < length - 9; i++) {
+            maskedId.append('*');
+        }
+        maskedId.append(lastFour);
+
+        return maskedId.toString();
+    }
+
+    /**
+     *手机号码脱敏
+     *
+     * @param data 手机号码
+     * @return 脱敏后的手机号码
+     * */
+    public String maskMobile(String data) {
+
+        if (data == null || data.length() < 7) {
+            return data;
+        }
+        int length = data.length();
+        String firstThree = data.substring(0, 3);
+        String lastFour = data.substring(length - 4);
+
+        StringBuilder maskedId = new StringBuilder(firstThree);
+        for (int i = 0; i < length - 7; i++) {
+            maskedId.append('*');
+        }
+        maskedId.append(lastFour);
+
+        return maskedId.toString();
+    }
+
+    public Integer calculateAge(String idNumber) {
+        // 检查身份证号码的有效性
+        if (idNumber == null || idNumber.length() != 18) {
+            return null;
+        }
+
+        // 提取出生日期信息
+        String birthDateString = idNumber.substring(6, 14);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        LocalDate birthDate = LocalDate.parse(birthDateString, formatter);
+
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+
+        // 计算年龄
+        return Period.between(birthDate, currentDate).getYears();
+    }
+
+
+}

+ 62 - 0
src/main/java/com/hz/employmentsite/util/DesUtils.java

@@ -22,6 +22,7 @@ public class DesUtils {
     private String ENCODE = "utf-8";
     private String desStr = "DES";
     private String desVi = "DES/ECB/PKCS5Padding";
+    private String desTextKey = "0448fa97-c645-444b-aeae-d26366f98f4d";
 
     /**
      * 用des加密
@@ -86,4 +87,65 @@ public class DesUtils {
 
         return result;
     }
+
+
+    /**
+     * 用des 进行文本加密
+     **/
+    public String encoderText(String data) {
+
+        try {
+            if(data == null || data.length() == 0){
+                return "";
+            }
+
+            // 创建一个DESKeySpec对象
+            DESKeySpec desKey = new DESKeySpec(desTextKey.getBytes(ENCODE));
+            // 创建一个密匙工厂
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(desStr);
+            // 将DESKeySpec对象转换成SecretKey对象
+            SecretKey securekey = keyFactory.generateSecret(desKey);
+            // Cipher对象实际完成解密操作
+            Cipher cipher = Cipher.getInstance(desVi);
+            // 用密匙初始化Cipher对象
+            cipher.init(Cipher.ENCRYPT_MODE, securekey);
+            // 真正开始解密操作
+            byte[] rBytes = cipher.doFinal(data.getBytes(ENCODE));
+            //加base64
+            return Base64.getEncoder().encodeToString(rBytes);
+        } catch (Exception ex) {
+            return "";
+        }
+    }
+
+    /**
+     * 用des 进行文本解密
+     **/
+    public String decoderText(String data) {
+        try {
+            if(data == null || data.length() == 0){
+                return "";
+            }
+
+            //解base64
+            byte[] buftoken = Base64.getDecoder().decode(data);
+            // 创建一个DESKeySpec对象
+            DESKeySpec desKey = new DESKeySpec(desTextKey.getBytes(ENCODE));
+            // 创建一个密匙工厂
+            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(desStr);
+            // 将DESKeySpec对象转换成SecretKey对象
+            SecretKey securekey = keyFactory.generateSecret(desKey);
+            // Cipher对象实际完成解密操作
+            Cipher cipher = Cipher.getInstance(desVi);
+            // 用密匙初始化Cipher对象
+            cipher.init(Cipher.DECRYPT_MODE, securekey);
+            // 真正开始解密操作
+            byte[] rBytes = cipher.doFinal(buftoken);
+            return new String(rBytes, ENCODE);
+
+        } catch (Exception ex) {
+            return "";
+        }
+    }
+
 }

+ 54 - 0
src/main/java/com/hz/employmentsite/vo/dataMap/CompanyPostMapVo.java

@@ -0,0 +1,54 @@
+package com.hz.employmentsite.vo.dataMap;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class CompanyPostMapVo {
+    private String postID;
+
+    private String professionName;
+
+    private Double minSalary;
+
+    private Double maxSalary;
+
+    private Integer recruitCount;
+
+    private String contactName;
+
+    private String contactMobile;
+
+    private String cultureLevelName;
+
+    private Date startTime;
+
+    private Date EndTime;
+
+    private String welfare;
+
+    private String postDesc;
+
+    private String companyID;
+
+    private String companyName;
+
+    private String CompanyAddress;
+
+    private String companyModelType;
+
+    private String recordStatusName;
+
+    private String Longitude;
+
+    private String Latitude;
+
+    private Double distance;
+
+    private String companyLabelList;
+
+    private String postLabelList;
+
+    private String postList;
+}

+ 3 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendCompanyPostVo.java

@@ -1,5 +1,8 @@
 package com.hz.employmentsite.vo.jobUserManager;
 
+import lombok.Data;
+
+@Data
 public class RecommendCompanyPostVo {
     public String recommendMgtID;
     public String postID;

+ 3 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/RecommendJobVo.java

@@ -1,5 +1,8 @@
 package com.hz.employmentsite.vo.jobUserManager;
 
+import lombok.Data;
+
+@Data
 public class RecommendJobVo {
     public String recommendMgtID;
     public String jobhuntID;

+ 27 - 32
src/main/resources/mapping/cquery/CompanyCQuery.xml

@@ -89,7 +89,7 @@
         LIMIT 30
     </select>
 
-    <select id="getDataMapList" resultType="com.hz.employmentsite.vo.companyService.CompanyVo">
+    <select id="getDataMapList" resultType="com.hz.employmentsite.vo.dataMap.CompanyPostMapVo">
         SELECT
         company.CompanyID,
         company.CompanyName,
@@ -121,7 +121,7 @@
         WHERE
         label_company.CompanyID = company.CompanyID
         ) AS labelTemp
-        ) AS labelList,
+        ) AS companyLabelList,
         (
         SELECT
         JSON_ARRAYAGG( JSON_OBJECT( 'postID', postTemp.PostID, 'professionName', postTemp.ProfessionName ) )
@@ -168,8 +168,20 @@
         distance
     </select>
 
-    <select id="getDataMapListByPostName" resultType="com.hz.employmentsite.vo.companyService.CompanyVo">
+    <select id="getDataMapListByPostName" resultType="com.hz.employmentsite.vo.dataMap.CompanyPostMapVo">
         SELECT
+        post.PostID,
+        prof.ProfessionName,
+        post.MinSalary,
+        post.MaxSalary,
+        post.RecruitCount,
+        post.ContactName,
+        post.ContactMobile,
+        post_culture.`Name` AS cultureLevelName,
+        post.StartTime,
+        post.EndTime,
+        post.welfare,
+        post.postDesc,
         company.CompanyID,
         company.CompanyName,
         company.CompanyAddress,
@@ -180,15 +192,16 @@
         (
         6371 * ACOS(
         COS(
-        RADIANS( 23.116236 )) * COS(
+        RADIANS( #{latitude} )) * COS(
         RADIANS( company.Latitude )) * COS(
-        RADIANS( company.Longitude ) - RADIANS( 114.420244 )) + SIN(
-        RADIANS( 23.116236 )) * SIN(
+        RADIANS( company.Longitude ) - RADIANS( #{longitude} )) + SIN(
+        RADIANS( #{latitude} )) * SIN(
         RADIANS( company.Latitude ))
         )) AS distance,
         (
         SELECT
-        JSON_ARRAYAGG( JSON_OBJECT( 'labelID', labelTemp.LabelID, 'labelName', labelTemp.LabelName ) )
+        JSON_ARRAYAGG(
+        JSON_OBJECT( 'labelID', labelTemp.LabelID, 'labelName', labelTemp.LabelName ))
         FROM
         (
         SELECT
@@ -196,30 +209,11 @@
         label.LabelName
         FROM
         pc_label label
-        LEFT JOIN pc_label_company label_company ON label.LabelID = label_company.LabelID
+        LEFT JOIN pc_label_post label_post ON label.LabelID = label_post.LabelID
         WHERE
-        label_company.CompanyID = company.CompanyID
+        label_post.PostID = post.PostID
         ) AS labelTemp
-        ) AS labelList,
-        (
-        SELECT
-        JSON_ARRAYAGG( JSON_OBJECT( 'postID', postTemp.PostID, 'professionName', postTemp.ProfessionName ) )
-        FROM
-        (
-        SELECT
-        post1.PostID,
-        profession1.ProfessionName
-        FROM
-        pc_post post1
-        LEFT JOIN pc_profession profession1 ON post1.ProfessionID = profession1.ProfessionID
-        WHERE
-        post1.CompanyID = company.CompanyID
-        <if test="postName!='' and postName!=null">
-            and profession1.ProfessionName like Concat('%',#{postName},'%')
-        </if>
-        LIMIT 4
-        ) AS postTemp
-        ) AS postList
+        ) AS postLabelList
         FROM
         pc_post post
         LEFT JOIN pc_profession prof ON post.ProfessionID = prof.ProfessionID
@@ -228,6 +222,8 @@
         AND cmodel.DictionaryCode = 'CompanyModel'
         LEFT JOIN sys_dictionary_item com_status ON company.RecordStatus = com_status.`Value`
         AND com_status.DictionaryCode = 'CompanyStatus'
+        LEFT JOIN sys_dictionary_item post_culture ON post.CultureRank = post_culture.`Value`
+        AND post_culture.DictionaryCode = 'CultureLevel'
         WHERE 1=1
         <if test="postName!='' and postName!=null">
             and prof.ProfessionName like Concat('%',#{postName},'%')
@@ -244,13 +240,12 @@
         <if test="siteID!='' and siteID!=null">
             and company.siteID = #{siteID}
         </if>
-        GROUP BY
-        company.CompanyID
         <if test="maxDistance!=null">
             HAVING
             distance <![CDATA[ <= ]]> #{maxDistance}
         </if>
         ORDER BY
-        distance
+        distance,
+        CompanyID
     </select>
 </mapper>

File diff suppressed because it is too large
+ 9 - 3
src/main/resources/mapping/cquery/JobUserCQuery.xml


BIN
src/main/resources/static/doc/template/岗位信息导入模板.xlsx


+ 19 - 0
vue/src/utils/crypto.ts

@@ -9,6 +9,7 @@ interface DesModel {
   token: string,
   tm: string
 }
+const textKey = "0448fa97-c645-444b-aeae-d26366f98f4d";
 
 const crypto = {
   encryptDes (value: string) {
@@ -32,6 +33,24 @@ const crypto = {
   },
   MD5 (value: string) {
     return cryptoJs.MD5(value)
+  },
+  encryptDesText (value: string) {
+    if(!value){
+      return "";
+    }
+
+    const option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
+    const encrypted = cryptoJs.DES.encrypt(value, cryptoJs.enc.Utf8.parse(textKey), option)
+    return encrypted.toString()
+  },
+  decryptDesText (value: string) {
+    if(!value){
+      return "";
+    }
+
+    const option = { mode: cryptoJs.mode.ECB, padding: cryptoJs.pad.Pkcs7 }
+    const decrypted = cryptoJs.DES.decrypt(value, cryptoJs.enc.Utf8.parse(textKey), option)
+    return decrypted.toString(cryptoJs.enc.Utf8)
   }
 }
 

+ 2 - 2
vue/src/views/companyService/post/index.vue

@@ -22,9 +22,9 @@
         </a-col>
         <a-col :span="6">
           <a-form-item label="招聘人数" :label-col="{span:6}" name="recruitCount">
-            <a-input type="number" v-model:value="searchParams.minCount" style="width:120px;" placeholder=""/>
+            <a-input type="number" v-model:value="searchParams.minCount" style="width:80px;" placeholder=""/>
             <label style="margin:10px;">-</label>
-            <a-input type="number" v-model:value="searchParams.maxCount" style="width:120px;" placeholder=""/>
+            <a-input type="number" v-model:value="searchParams.maxCount" style="width:80px;" placeholder=""/>
           </a-form-item>
         </a-col>
         <a-col :span="6" style="text-align: left">

+ 190 - 87
vue/src/views/dataMap/companyDataMap.vue

@@ -14,6 +14,7 @@
             <a-select
               v-model:value="searchType"
               style="width: 30%"
+              @change="searchTypeChange"
             >
               <a-select-option value="company">找企业</a-select-option>
               <a-select-option value="post">找岗位</a-select-option>
@@ -72,8 +73,10 @@
         </div>
         <!-- 企业数据列表 -->
         <div class="list-box">
+          <!--  查询类型为企业,主要展示企业数据 -->
           <div class="company-data-box" :class="{'check-company':nowCheckCompany.companyID == company.companyID}"
-               v-if="companyList.length > 0" v-for="(company,index) in companyList" :key="index"
+               v-if="companyList.length > 0 && searchType == 'company'" v-for="(company,index) in companyList"
+               :key="index"
                @click="checkCompanyChange(company)">
             <p class="company-name">
               {{ company.companyName }}
@@ -96,9 +99,9 @@
               <span v-if="company.postList.length == 0" style="width: 25px;flex: 0 0 auto">暂无</span>
             </div>
             <!-- 标签 -->
-            <div class="company-label-box" v-if="company.labelList && company.labelList.length > 0"
+            <div class="company-label-box" v-if="company.companyLabelList && company.companyLabelList.length > 0"
                  :ref="el => companyLabelBoxRef[index] = el" :class="{'label-box-max-height': company.labelExpanded}">
-              <a-tag v-for="(label, labelIndex) in company.labelList" :key="labelIndex">
+              <a-tag v-for="(label, labelIndex) in company.companyLabelList" :key="labelIndex">
                 {{ label.labelName }}
               </a-tag>
               <div v-if="showLaunchBtnBox(companyLabelBoxRef,index,50)">
@@ -108,7 +111,38 @@
               </div>
             </div>
           </div>
-          <div v-else class="empty-box">
+          <!-- 查询类型为岗位时,主要展示岗位数据 -->
+          <div v-if="companyList.length>0 && searchType == 'post'"
+               v-for="(postCompany, postCompanyIndex) in companyList" :key="postCompanyIndex"
+               class="company-data-box"
+               @click="checkCompanyChange(postCompany)">
+            <div class="post-title">
+              <span>{{ postCompany.professionName }}({{ postCompany.recruitCount }}人)</span>
+              <span>{{ showSalary(postCompany.minSalary, postCompany.maxSalary) }}</span>
+            </div>
+            <p class="label-text">
+              招聘企业:{{ postCompany.companyName }}
+            </p>
+            <p class="label-text">
+              工作地点:{{ postCompany.companyAddress }}
+            </p>
+            <!-- 标签 -->
+            <div class="company-label-box"
+                 v-if="postCompany.postLabelList && postCompany.postLabelList.length > 0"
+                 :ref="el => companyPostLabelBoxRef[postCompanyIndex] = el"
+                 :class="{'label-box-max-height': postCompany.labelExpanded}">
+              <a-tag v-for="(label, labelIndex) in postCompany.postLabelList" :key="labelIndex">
+                {{ label.labelName }}
+              </a-tag>
+              <div v-if="showLaunchBtnBox(companyPostLabelBoxRef,postCompanyIndex,50)">
+                <span class="launch-btn" v-if="postCompany.labelExpanded"
+                      @click.stop="postCompany.labelExpanded = false">展开</span>
+                <span class="launch-btn" v-else @click.stop="postCompany.labelExpanded = true">收起</span>
+              </div>
+            </div>
+          </div>
+          <!-- 空数据状态 -->
+          <div v-if="companyList.length == 0" class="empty-box">
             <a-empty/>
           </div>
         </div>
@@ -121,85 +155,136 @@
       </div>
       <!-- 岗位信息 -->
       <div class="post-box" v-if="nowCheckCompany.companyID">
-        <p class="title label-text">企业详情</p>
-        <!-- 企业信息 -->
-        <div class="post-company-box">
-          <p class="company-name">
-            {{ nowCheckCompany.companyName }}
-          </p>
-          <p class="label-text">
-            工作地点:{{ nowCheckCompany.companyAddress }}
-          </p>
-          <p class="label-text">
-            企业规模:{{ nowCheckCompany.companyModelType }}
-          </p>
-          <p class="label-text">
-            企业状态:{{ nowCheckCompany.recordStatusName }}
-          </p>
-          <!-- 标签 -->
-          <div class="company-label-box" v-if="nowCheckCompany.labelList && nowCheckCompany.labelList.length > 0"
-               :ref="el => postBoxCompanyLabelBoxRef = el"
-               :class="{'label-box-max-height': postBoxCompanyLabelExpanded}">
-            <a-tag v-for="(label, index) in nowCheckCompany.labelList" :key="index">
-              {{ label.labelName }}
-            </a-tag>
-            <div v-if="showLaunchBtnBox(postBoxCompanyLabelBoxRef, null, 50)">
+        <div v-if="searchType == 'company'" style="width: 100%; height: 100%;">
+          <p class="title label-text">企业详情</p>
+          <!-- 企业信息 -->
+          <div class="post-company-box">
+            <p class="company-name">
+              {{ nowCheckCompany.companyName }}
+            </p>
+            <p class="label-text">
+              工作地点:{{ nowCheckCompany.companyAddress }}
+            </p>
+            <p class="label-text">
+              企业规模:{{ nowCheckCompany.companyModelType }}
+            </p>
+            <p class="label-text">
+              企业状态:{{ nowCheckCompany.recordStatusName }}
+            </p>
+            <!-- 标签 -->
+            <div class="company-label-box"
+                 v-if="nowCheckCompany.companyLabelList && nowCheckCompany.companyLabelList.length > 0"
+                 :ref="el => postBoxCompanyLabelBoxRef = el"
+                 :class="{'label-box-max-height': postBoxCompanyLabelExpanded}">
+              <a-tag v-for="(label, index) in nowCheckCompany.companyLabelList" :key="index">
+                {{ label.labelName }}
+              </a-tag>
+              <div v-if="showLaunchBtnBox(postBoxCompanyLabelBoxRef, null, 50)">
               <span class="launch-btn" v-if="postBoxCompanyLabelExpanded"
                     @click.stop="postBoxCompanyLabelExpanded = false">展开</span>
-              <span class="launch-btn" v-else @click.stop="postBoxCompanyLabelExpanded = true">收起</span>
+                <span class="launch-btn" v-else @click.stop="postBoxCompanyLabelExpanded = true">收起</span>
+              </div>
+            </div>
+          </div>
+          <!-- 岗位列表 -->
+          <div class="list-box">
+            <div class="list-post-box" v-if="postList.length > 0" v-for="(post, postIndex) in postList"
+                 :key="postIndex">
+              <div class="post-title">
+                <span>{{ post.professionName }}</span>
+                <span>{{ showSalary(post.minSalary, post.maxSalary) }}</span>
+              </div>
+              <p class="label-text">
+                招聘人数:{{ post.recruitCount }}
+              </p>
+              <p class="label-text">
+                招聘日期:
+                {{ dayjs(post.startTime).format("YYYY-MM-DD") }}
+                至
+                {{ dayjs(post.endTime).format("YYYY-MM-DD") }}
+              </p>
+              <!-- 岗位要求 -->
+              <div class="post-desc-box">
+                <div class="label-text post-desc" :ref="el => postDescBoxRef[postIndex] = el"
+                     :class="{'post-desc-max-height': post.descExpanded}">
+                  岗位要求:{{ post.postDesc }}
+                </div>
+                <div v-if="showLaunchBtnBox(postDescBoxRef,postIndex,35)">
+                <span class="launch-btn" v-if="post.descExpanded"
+                      @click.stop="post.descExpanded = false">展开</span>
+                  <span class="launch-btn " v-else @click.stop="post.descExpanded = true">收起</span>
+                </div>
+              </div>
+              <!-- 标签 -->
+              <div class="company-label-box" v-if="post.labelList && post.labelList.length > 0"
+                   :ref="el => postLabelBoxRef[postIndex] = el" :class="{'label-box-max-height': post.labelExpanded}">
+                <a-tag v-for="(label, labelIndex) in post.labelList" :key="labelIndex">
+                  {{ label.labelName }}
+                </a-tag>
+                <div v-if="showLaunchBtnBox(postLabelBoxRef,postIndex,50)">
+                <span class="launch-btn" v-if="post.labelExpanded"
+                      @click.stop="post.labelExpanded = false">展开</span>
+                  <span class="launch-btn" v-else @click.stop="post.labelExpanded = true">收起</span>
+                </div>
+              </div>
             </div>
+            <div v-else class="empty-box">
+              <a-empty/>
+            </div>
+          </div>
+          <!-- 分页控件 -->
+          <div class="pagination-box">
+            <a-pagination v-model:current="postSearchParams.pageIndex" :total="postTotal"
+                          v-model:pageSize="postSearchParams.pageSize"
+                          show-less-items @change="postPaginationChange" simple :show-size-changer="false"/>
           </div>
         </div>
-        <!-- 岗位列表 -->
-        <div class="list-box">
-          <div class="list-post-box" v-if="postList.length > 0" v-for="(post, postIndex) in postList" :key="postIndex">
+        <div v-if="searchType == 'post'" style="width: 100%; height: 100%;">
+          <p class="title label-text">岗位详情</p>
+          <div class="post-company-box" style="max-height: 100%">
             <div class="post-title">
-              <span>{{ post.professionName }}</span>
-              <span>{{ showSalary(post.minSalary, post.maxSalary) }}</span>
+              <span>{{ nowCheckCompany.professionName }}</span>
+              <span>{{ showSalary(nowCheckCompany.minSalary, nowCheckCompany.maxSalary) }}</span>
             </div>
             <p class="label-text">
-              招聘人数:{{ post.recruitCount }}
+              招聘企业:{{ nowCheckCompany.companyName }}
+            </p>
+            <p class="label-text">
+              工作地点:{{ nowCheckCompany.companyAddress }}
+            </p>
+            <p class="label-text">
+              联系人:{{ nowCheckCompany.contactName }}
+            </p>
+            <p class="label-text">
+              联系电话:{{ nowCheckCompany.contactMobile }}
+            </p>
+            <p class="label-text">
+              学历要求:{{ nowCheckCompany.cultureLevelName }}
+            </p>
+            <p class="label-text">
+              招聘人数:{{ nowCheckCompany.recruitCount }}人
             </p>
             <p class="label-text">
               招聘日期:
-              {{ dayjs(post.startTime).format("YYYY-MM-DD") }}
+              {{ dayjs(nowCheckCompany.startTime).format("YYYY-MM-DD") }}
-              {{ dayjs(post.endTime).format("YYYY-MM-DD") }}
+              {{ dayjs(nowCheckCompany.EndTime).format("YYYY-MM-DD") }}
+            </p>
+            <p class="label-text">
+              福利待遇:{{ nowCheckCompany.welfare }}
+            </p>
+            <p class="label-text">
+              其他要求:{{ nowCheckCompany.postDesc }}
             </p>
-            <!-- 岗位要求 -->
-            <div class="post-desc-box">
-              <div class="label-text post-desc" :ref="el => postDescBoxRef[postIndex] = el"
-                   :class="{'post-desc-max-height': post.descExpanded}">
-                岗位要求:{{ post.postDesc }}
-              </div>
-              <div v-if="showLaunchBtnBox(postDescBoxRef,postIndex,35)">
-                <span class="launch-btn" v-if="post.descExpanded"
-                      @click.stop="post.descExpanded = false">展开</span>
-                <span class="launch-btn " v-else @click.stop="post.descExpanded = true">收起</span>
-              </div>
-            </div>
             <!-- 标签 -->
-            <div class="company-label-box" v-if="post.labelList && post.labelList.length > 0"
-                 :ref="el => postLabelBoxRef[postIndex] = el" :class="{'label-box-max-height': post.labelExpanded}">
-              <a-tag v-for="(label, labelIndex) in post.labelList" :key="labelIndex">
+            <div class="company-label-box"
+                 v-if="nowCheckCompany.postLabelList && nowCheckCompany.postLabelList.length > 0"
+            >
+              <a-tag v-for="(label, index) in nowCheckCompany.postLabelList" :key="index">
                 {{ label.labelName }}
               </a-tag>
-              <div v-if="showLaunchBtnBox(postLabelBoxRef,postIndex,50)">
-                <span class="launch-btn" v-if="post.labelExpanded"
-                      @click.stop="post.labelExpanded = false">展开</span>
-                <span class="launch-btn" v-else @click.stop="post.labelExpanded = true">收起</span>
-              </div>
             </div>
           </div>
-          <div v-else class="empty-box">
-            <a-empty/>
-          </div>
-        </div>
-        <!-- 分页控件 -->
-        <div class="pagination-box">
-          <a-pagination v-model:current="postSearchParams.pageIndex" :total="postTotal"
-                        v-model:pageSize="postSearchParams.pageSize"
-                        show-less-items @change="postPaginationChange" simple :show-size-changer="false"/>
         </div>
       </div>
     </div>
@@ -211,7 +296,6 @@ import {onMounted, reactive, ref} from "vue";
 import huiZhouGeoJSON from "./geo"
 import {getPosition, setBoundary} from "@/utils/position";
 import redThIcon from "@/assets/images/redTh.png"
-import thIcon from "@/assets/images/th.jpg"
 import {message, type SelectProps} from "ant-design-vue";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getSiteList} from "@/api/baseSettings/siteInfo";
@@ -225,14 +309,12 @@ const zoom = 9;
 let map = null;
 // 地图标记点
 let markerList = new Array<any>([]);
-// 地图标记点文本
-let labelList = new Array<any>([]);
 // 查询类型
 const searchType = ref("company")
 // 企业查询条件
 const companySearchParam = reactive({
   pageIndex: 1,
-  pageSize: 5,
+  pageSize: 50,
   companyName: "",
   maxDistance: 5,
   companyModel: undefined,
@@ -246,18 +328,11 @@ const companyList = ref<Array<any>>([])
 // 企业分页条数
 const companyTotal = ref(0);
 // 当前选中的企业
-const nowCheckCompany = ref({
-  companyID: "",
-  companyName: "",
-  companyAddress: "",
-  companyModelType: "",
-  recordStatusName: "",
-  labelList: new Array<any>()
-})
+const nowCheckCompany = ref<any>({})
 // 岗位查询条件
 const postSearchParams = reactive({
   pageIndex: 1,
-  pageSize: 5,
+  pageSize: 20,
 })
 // 当前选中的企业岗位列表
 const postList = ref<Array<any>>([]);
@@ -280,6 +355,8 @@ const regionList = ref<SelectProps['options']>();
 const searchLoading = ref(false);
 // 企业信息标签box ref
 const companyLabelBoxRef = ref<Array<any>>([]);
+// 企业信息-岗位标签box ref
+const companyPostLabelBoxRef = ref<Array<any>>([])
 // 岗位面板企业信息的标签盒子ref
 const postBoxCompanyLabelBoxRef = ref<any>(null);
 // 岗位面板企业信息的标签展开与收起开关
@@ -333,7 +410,7 @@ function searchAll() {
   companySearchParam.regionCode = undefined;
   companySearchParam.maxDistance = null;
   companySearchParam.pageIndex = 1;
-  companySearchParam.pageSize = 5;
+  companySearchParam.pageSize = 50;
   onSearch();
 }
 
@@ -342,7 +419,8 @@ function findFuncThen(result: any) {
   companyList.value = result.list;
   // 处理标签和岗位JSON数据
   companyList.value.forEach((item: any) => {
-    item.labelList = JSON.parse(item.labelList || '[]')
+    item.companyLabelList = JSON.parse(item.companyLabelList || '[]')
+    item.postLabelList = JSON.parse(item.postLabelList || '[]')
     item.postList = JSON.parse(item.postList || '[]')
     item.labelExpanded = true;
   });
@@ -416,13 +494,31 @@ function setCompanyMarker() {
       iconSize: new T.Point(30, 30),
       iconAnchor: new T.Point(15, 30)
     })
+    let uniqueCompanyList = companyList.value;
+    if (searchType.value == 'post') {
+      // 岗位查询时,会出现多个岗位相同公司,按公司的ID去重
+      const processedCompanyIDs = new Set();
+      // 过滤出唯一的公司列表
+      uniqueCompanyList = companyList.value.filter((item: any) => {
+        if (!processedCompanyIDs.has(item.companyID)) {
+          processedCompanyIDs.add(item.companyID);
+          return true;
+        }
+        return false;
+      });
+    }
+
     // 解析企业数据,在地图中标记
-    companyList.value.forEach((item: any) => {
+    uniqueCompanyList.forEach((item: any) => {
       if (item.longitude && item.latitude) {
         const point = new T.LngLat(item.longitude, item.latitude)
         const marker = new T.Marker(point, {
           icon: icon
         }); // 创建标注
+        // 给每个地图标点添加点击事件,打印item
+        marker.addEventListener('click', () => {
+          checkCompanyChange(item);
+        });
         (map as any).addOverLay(marker);// 将标注添加到地图中
         markerList.push(marker);
       }
@@ -497,6 +593,12 @@ function showLaunchBtnBox(refValue: any, index: any, scrollHeight: any) {
   }
 }
 
+// 查询类型切换事件
+function searchTypeChange() {
+  // 清空数据
+  onSearch();
+}
+
 onMounted(() => {
   initMap();
   getCompanyModelList();
@@ -606,6 +708,13 @@ export default {
     border-right: 1px solid rgba(173, 173, 173, 0.8);
   }
 
+  .post-title {
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+    margin-bottom: 3px;
+  }
+
   .company-box {
     left: 0;
     right: 300px;
@@ -668,12 +777,6 @@ export default {
         padding: 8px;
         border-bottom: 1px solid rgba(173, 173, 173, 0.8);
 
-        .post-title {
-          display: flex;
-          justify-content: space-between;
-          flex-wrap: wrap;
-        }
-
         .post-desc-box {
           position: relative;
 

+ 18 - 3
vue/src/views/dataMap/siteDataMap.vue

@@ -92,7 +92,7 @@ let markerList = new Array<any>([]);
 // 驿站查询数据
 const siteSearchParam = reactive({
   pageIndex: 1,
-  pageSize: 6,
+  pageSize: 50,
   siteName: "",
   regionCode: null,
   streetCode: null,
@@ -145,7 +145,7 @@ function onSearch() {
 // 查询全部
 function searchAll() {
   siteSearchParam.pageIndex = 1
-  siteSearchParam.pageSize = 5
+  siteSearchParam.pageSize = 50
   siteSearchParam.siteName = ""
   siteSearchParam.regionCode = null
   siteSearchParam.streetCode = null
@@ -181,11 +181,26 @@ function setSiteMarker() {
       iconSize: new T.Point(30, 30),
       iconAnchor: new T.Point(15, 30)
     })
-    // 解析企业数据,在地图中标记
+    // 解析站点数据,在地图中标记
     siteList.value.forEach((item: any) => {
       if (item.siteLongitude && item.siteLatitude) {
         const point = new T.LngLat(item.siteLongitude, item.siteLatitude)
         const marker = new T.Marker(point, {icon: icon}); // 创建标注
+
+        // 创建一个信息窗口
+        // const content = `
+        //   <div>
+        //     <p>${item.siteName}</p>
+        //     <p>${item.siteCode}</p>
+        //   </div>
+        // `;
+        // const infoWindow = new T.InfoWindow(content, {offset: new T.Point(0, -30)});
+
+        // 给每个地图标点添加点击事件,打印item
+        marker.addEventListener('click', () => {
+          checkSite(item);
+          // (map as any).openInfoWindow(infoWindow, point);
+        });
         (map as any).addOverLay(marker);// 将标注添加到地图中
         markerList.push(marker);
       }

+ 5 - 0
vue/src/views/jobUserManager/jobuser/edit.vue

@@ -549,6 +549,7 @@ import {getSiteList} from "@/api/baseSettings/siteInfo";
 import {getInfo} from "@/api/account";
 import dayjs from "dayjs";
 import SelectLabel from "@/views/baseSettings/label/selectLabel.vue";
+import crtyptoHelp from '@/utils/crypto';
 
 interface FormState {
   dataModel: any;
@@ -857,6 +858,8 @@ export default defineComponent(
         if(isAllowCommit.value){
           formState.dataModel.jobEducation = educationData.value;
           formState.dataModel.jobExperience = experienceData.value;
+          formState.dataModel.userMobile = crtyptoHelp.encryptDesText(formState.dataModel.userMobile);
+          formState.dataModel.identityNumber = crtyptoHelp.encryptDesText(formState.dataModel.identityNumber);
           save(formState.dataModel).then(result => {
             if (result) {
               onClose(1)
@@ -931,6 +934,8 @@ export default defineComponent(
         getInfo().then((loginUserInfo:any)=>{
           getDataById(id,loginUserInfo.userID,null).then(data => {
             formState.dataModel = data;
+            formState.dataModel.userMobile = crtyptoHelp.decryptDesText(formState.dataModel.userMobile);
+            formState.dataModel.identityNumber = crtyptoHelp.decryptDesText(formState.dataModel.identityNumber);
             if (formState.dataModel.regionCode) {
               changeCity();
             }

+ 4 - 0
vue/src/views/jobUserManager/jobuser/vitae.vue

@@ -120,6 +120,7 @@ import dayjs from "dayjs";
 import {getSysDictionaryList} from "@/api/system/dictionary";
 import {getJobHuntList} from "@/api/jobUserManager/jobhunt";
 import {useUserStore} from "@/store/modules/user";
+import crtyptoHelp from "@/utils/crypto";
 
 const userStore = useUserStore();
 const userInfo = ref(userStore.getUserInfo)
@@ -252,6 +253,9 @@ const loadData = (id: any) => {
     Object.keys(jobUserInfo).forEach(key => {
       jobUserInfo[key] = data[key];
     })
+
+    jobUserInfo.userMobile = crtyptoHelp.decryptDesText(jobUserInfo.userMobile);
+    jobUserInfo.identityNumber = crtyptoHelp.decryptDesText(jobUserInfo.identityNumber);
   });
 };