Browse Source

feat: 求职人员增加个人荣誉信息

zhangying 9 months ago
parent
commit
496e1f415d
29 changed files with 2391 additions and 48 deletions
  1. 14 1
      doc/待更新脚本.txt
  2. 36 0
      h5app/src/api/honor/honor.ts
  3. 9 0
      h5app/src/router/index.ts
  4. 1 0
      h5app/src/views/pages/jobUserInfo/educationEdit.vue
  5. 1 0
      h5app/src/views/pages/jobUserInfo/experienceEdit.vue
  6. 292 0
      h5app/src/views/pages/jobUserInfo/honorEdit.vue
  7. 11 2
      h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue
  8. 71 12
      h5app/src/views/pages/jobUserInfo/userEdit.vue
  9. 54 8
      h5app/src/views/pages/jobhunt/detail.vue
  10. 68 12
      h5app/src/views/pages/jobhunt/edit.vue
  11. 1 0
      h5app/src/views/pages/jobhunt/educationEdit.vue
  12. 1 0
      h5app/src/views/pages/jobhunt/experienceEdit.vue
  13. 274 0
      h5app/src/views/pages/jobhunt/honorEdit.vue
  14. 2 1
      h5app/src/views/pages/jobhunt/jobHuntEdit.vue
  15. 77 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/HonorController.java
  16. 30 0
      src/main/java/com/hz/employmentsite/mapper/PcHonorMapper.java
  17. 13 0
      src/main/java/com/hz/employmentsite/mapper/cquery/HonorCQuery.java
  18. 85 0
      src/main/java/com/hz/employmentsite/model/PcHonor.java
  19. 730 0
      src/main/java/com/hz/employmentsite/model/PcHonorExample.java
  20. 101 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/HonorServiceImpl.java
  21. 11 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java
  22. 23 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/HonorService.java
  23. 2 0
      src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java
  24. 258 0
      src/main/resources/mapping/PcHonorMapper.xml
  25. 17 0
      src/main/resources/mapping/cquery/HonorCQuery.xml
  26. 13 0
      vue/src/api/jobUserManager/jobuser/index.ts
  27. 50 1
      vue/src/views/companyService/post/jobUserDetail.vue
  28. 94 7
      vue/src/views/jobUserManager/jobuser/edit.vue
  29. 52 4
      vue/src/views/jobUserManager/jobuser/vitae.vue

+ 14 - 1
doc/待更新脚本.txt

@@ -13,4 +13,17 @@ ALTER TABLE `pc_jobfairs` ADD COLUMN `SiteID` varchar(50) NULL COMMENT '所属
 
 -- 2024-7-9 求职人员认领按钮权限
 INSERT INTO sys_function_code VALUES ('T01030109', '求职人员认领', 'T010301', 9);
-insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('10a12f77-0958-4220-b9ce-07b9215046f2','T01030109');
+insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('10a12f77-0958-4220-b9ce-07b9215046f2','T01030109');
+
+-- 2024-7-10 求职人员个人荣誉表
+CREATE TABLE `pc_honor`  (
+  `HonorID` varchar(50) NOT NULL,
+  `JobUserID` varchar(50) NULL,
+  `HonorName` varchar(255) NULL,
+  `GetTime` datetime NULL,
+  `CreateUserID` varchar(50) NULL,
+  `CreateTime` datetime NULL,
+  `ModifyUserID` varchar(50) NULL,
+  `ModifyTime` datetime NULL,
+  PRIMARY KEY (`HonorID`)
+);

+ 36 - 0
h5app/src/api/honor/honor.ts

@@ -0,0 +1,36 @@
+import {request} from "@/utils/request";
+
+export function getHonorByID(honorID: any) {
+    return request(
+        {
+            url: 'jobUserService/honor/getById',
+            method: 'get',
+            params: {honorID},
+        },
+        {isNew: true},
+    );
+}
+
+export function getHonorListByJobUserID(jobUserID: any) {
+    return request<any>(
+        {
+            url: 'jobUserService/honor/getList',
+            method: 'get',
+            params: {jobUserID},
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function saveHonor(data: any) {
+    return request(
+        {
+            url: 'jobUserService/honor/save',
+            method: 'post',
+            data: data,
+        },
+        {isNew: true},
+    );
+}

+ 9 - 0
h5app/src/router/index.ts

@@ -54,6 +54,10 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/jobhunt/jobHuntEdit',
                 component: () => import('@/views/pages/jobhunt/jobHuntEdit.vue')
             },
+            {
+                path: 'tabMain/jobhunt/honorEdit',
+                component: () => import('@/views/pages/jobhunt/honorEdit.vue')
+            },
             {
                 path: 'tabMain/jobFair/list',
                 component: () => import('@/views/pages/jobFair/list.vue')
@@ -259,6 +263,11 @@ const routes: Array<RouteRecordRaw> = [
                 name: 'jobHuntEdit',
                 component: () => import('@/views/pages/jobUserInfo/jobHuntEdit.vue'),
             },
+            {
+                path: 'honorEdit',
+                name: 'honorEdit',
+                component: () => import('@/views/pages/jobUserInfo/honorEdit.vue'),
+            },
             {
                 path: 'companyEdit',
                 name: 'companyEdit',

+ 1 - 0
h5app/src/views/pages/jobUserInfo/educationEdit.vue

@@ -125,6 +125,7 @@ export default defineComponent({
       {title: '教育经历', desc: '完善教育经历',val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
       {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const cultureRankList = ref<SelectProps[]>([]);
     const educationData = reactive<educationModel>({

+ 1 - 0
h5app/src/views/pages/jobUserInfo/experienceEdit.vue

@@ -123,6 +123,7 @@ export default defineComponent({
       {title: '教育经历', desc: '完善教育经历',val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
       {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const cultureRankList = ref<SelectProps[]>([]);
     const experienceData = reactive<experienceModel>({

+ 292 - 0
h5app/src/views/pages/jobUserInfo/honorEdit.vue

@@ -0,0 +1,292 @@
+<template>
+  <ion-page>
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel"
+                    style="padding-left:10px;width:24px;height:24px;"></ion-icon>
+        </ion-buttons>
+        <ion-title>个人荣誉收集</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="stepFlex">
+        <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
+          <div
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal==stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
+          <div class="stepFlex-item-label">
+            <p class="stepFlex-item-label-title" @click="onPathRedirect(record.val)">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc" @click="onPathRedirect(record.val)">{{ record.desc }}</p>
+          </div>
+        </div>
+      </div>
+
+      <form ref="editForm" @submit.prevent="onSave">
+        <div class="bw-vue-form">
+          <ion-list class="canvasWrapper">
+            <div class="form-title">个人荣誉</div>
+            <div class="form-input">
+              <ion-label>荣誉名称<span class="danger">*</span></ion-label>
+              <ion-input name="schoolName" id="schoolName" class="custom"
+                         placeholder="请输入荣誉名称" v-model="honorData.dataModel.honorName"></ion-input>
+            </div>
+            <div class="form-input">
+              <ion-label>
+                获得时间<span class="danger">*</span>
+              </ion-label>
+              <div class="dateTimeBox">
+                <ion-datetime-button datetime="completeTime"></ion-datetime-button>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="completeTime" placeholder="日期"
+                                v-model="honorData.dataModel.getTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+              </div>
+            </div>
+          </ion-list>
+        </div>
+      </form>
+    </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <ion-button style="width:100%;" @click="onSave">保 存</ion-button>
+      </ion-toolbar>
+    </ion-footer>
+    <ion-loading
+        :is-open="loading"
+        message="加载中..."
+        @didDismiss="setOpen(false)">
+    </ion-loading>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+import {arrowBackOutline} from "ionicons/icons";
+import {useRoute, useRouter} from "vue-router";
+import {computed, reactive, ref} from "vue";
+import {getHonorByID, saveHonor} from "@/api/honor/honor";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import dayjs from "dayjs";
+
+const router = useRouter();
+const route = useRoute();
+
+const honorData = reactive({
+  dataModel: {
+    honorID: "",
+    jobUserID: "",
+    honorName: '',
+    getTime: dayjs().format("YYYY-MM-DD"),
+  }
+});
+const curStepData = ref({
+  name: "",
+  statusVal: 2
+});
+const stepList = ref([
+  {title: '基础信息', desc: '个人基础信息', val: 1},
+  {title: '教育经历', desc: '完善教育经历', val: 2},
+  {title: '工作经验', desc: '完善工作经验', val: 3},
+  {title: '求职意向', desc: '个人求职意向', val: 4},
+  {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
+]);
+const loading = ref(false);
+const isEditJobUser = ref(0);
+const presentAlert = async (message: string) => {
+  const alert = await alertController.create({
+    header: '错误!',
+    message: message,
+    buttons: [
+      '确定'
+    ],
+  });
+  await alert.present();
+}
+const honorRules = computed(() => {
+  return {
+    dataModel: {
+      honorName: {required},
+      getTime: {required},
+    }
+  }
+});
+const honorValid = useVuelidate(honorRules, honorData);
+
+const loadData = async (honorID: any, jobUserID: any, status: any, userID: any) => {
+  loading.value = true;
+  curStepData.value.statusVal = status;
+  curStepData.value.loginUserID = userID;
+  await getHonorByID(honorID).then((result: any) => {
+    honorData.dataModel.honorID = result.honorID;
+    honorData.dataModel.honorName = result.honorName;
+    honorData.dataModel.getTime = dayjs(result.getTime).format("YYYY-MM-DD");
+    honorData.dataModel.jobUserID = result.jobUserID;
+  }).finally(() => {
+    loading.value = false;
+  })
+};
+
+const reload = async (honorID: any, jobUserID: any, status: any, isEdit: any) => {
+  await loadData(honorID, jobUserID, status, isEdit);
+}
+
+const onCancel = () => {
+  router.push({
+    path: './userEdit',
+    query: {reload: 1, jobUserID: honorData.dataModel.jobUserID, status: 5, loginUserId: curStepData.value.loginUserID}
+  });
+}
+
+const onPathRedirect = (statusValue: any) => {
+  if (isEditJobUser.value == 1) {
+    router.push({
+      path: './userEdit',
+      query: {
+        reload: 1,
+        jobUserID: honorData.dataModel.jobUserID,
+        status: 5,
+        loginUserId: curStepData.value.loginUserID
+      }
+    });
+  }
+}
+const onSave = async function () {
+  const isFormCorrect = await honorValid.value.$validate();
+  if (!isFormCorrect) {
+    await presentAlert("请填写完整的信息!");
+    return null;
+  }
+  saveHonor(honorData.dataModel).then(result => {
+    if (result) {
+      honorData.dataModel.honorID = "";
+      honorData.dataModel.honorName = "";
+      honorData.dataModel.getTime = dayjs().format("YYYY-MM-DD");
+      router.push({
+        path: './userEdit',
+        query: {
+          reload: 1,
+          jobUserID: honorData.dataModel.jobUserID,
+          status: 5,
+          loginUserId: curStepData.value.loginUserID
+        }
+      });
+    }
+  });
+}
+
+const setOpen = (isOpen: boolean) => {
+  loading.value = isOpen;
+};
+
+onIonViewDidEnter(() => {
+  if (route.query.reload)
+    reload(route.query.honorID, route.query.jobUserID, route.query.status, route.query.loginUserID);
+});
+</script>
+
+<style lang="less">
+ion-input.custom {
+  --placeholder-color: gray;
+  --placeholder-opacity: 0.5;
+}
+
+.title-item {
+  margin-left: 15px;
+  color: #1c3d70 !important;
+  font-size: 14px !important;
+  font-weight: bold;
+}
+
+.stepFlex {
+  margin: 0;
+  display: flex;
+  width: 100%;
+
+  .stepFlex-item {
+    position: relative;
+    flex: 1;
+    text-align: center;
+    margin-top: -10px;
+
+    .stepFlex-item-label {
+      padding-top: 60px;
+      font-size: 14px;
+
+      .stepFlex-item-label-title {
+        margin-top: 30px;
+      }
+
+      .stepFlex-item-label-desc {
+        margin-top: 5px;
+        color: #b9b9bd;
+      }
+    }
+  }
+
+  .greenCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+  }
+
+  .now {
+    top: calc(50% - 18px);
+    left: calc(50% - 8px);
+    position: absolute;
+    z-index: 3;
+    width: 16px;
+    height: 16px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+    border: 4px solid #c5e8f9;
+  }
+
+  .grayCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #ccc;
+  }
+
+  .greenLine {
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    height: 2px;
+    background-color: #31A2FE;
+    position: absolute;
+  }
+
+  .grayLine {
+    height: 0;
+    border: 1px dashed #ccc;
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    position: absolute;
+  }
+}
+
+.dateTimeBox {
+  width: 100%;
+  display: flex;
+  margin-top: 5px;
+  justify-content: space-between;
+  align-content: center;
+}
+</style>

+ 11 - 2
h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue

@@ -174,7 +174,8 @@ export default defineComponent({
       {title: '基础信息', desc: '个人基础信息', val: 1},
       {title: '教育经历', desc: '完善教育经历',val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
-      {title: '求职意向', desc: '个人求职意向', val: 4}
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const jobHuntTypeList = ref<SelectProps[]>([]);
     const jobUserTypeList = ref<SelectProps[]>([]);
@@ -303,7 +304,15 @@ export default defineComponent({
     }
 
     const onCancel = () => {
-      router.push({path: './,loginUserId:curStepData.value.loginUserID', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
+      router.push({
+        path: './userEdit',
+        query: {
+          reload: 1,
+          jobUserID: jobHuntData.dataModel.jobUserID,
+          status: 4,
+          loginUserId: curStepData.value.loginUserID
+        }
+      });
     }
 
 

+ 71 - 12
h5app/src/views/pages/jobUserInfo/userEdit.vue

@@ -324,9 +324,10 @@
                               placeholder="请输入家庭住址" v-model="baseData.familyAddress" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
               </div>
               <div class="form-input">
-                <ion-label>兴趣爱好</ion-label>
+                <ion-label>个人评价</ion-label>
                 <ion-textarea name="hobby" id="hobby"  class="custom" rows="4"
-                              placeholder="请输入兴趣爱好" v-model="baseData.hobby" style="border-bottom: 1px solid #fff2e8;" ></ion-textarea>
+                              placeholder="请输入个人评价" v-model="baseData.hobby"
+                              style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
               </div>
               <div class="form-input">
                 <ion-label>个人技能</ion-label>
@@ -348,14 +349,14 @@
             <div class="form-title">
               教育经历
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
+                        @click="onPathForward('./educationEdit',null,null,null,null,2)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in educationList" :key="key" >
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
+                      <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null,null,2)">
                         <ion-label>
                           <h2>{{record.schoolName}}</h2>
                           <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
@@ -378,14 +379,14 @@
             <div class="form-title">
               工作经验
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
+                        @click="onPathForward('./experienceEdit',null,null,null,null,3)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in experienceList" :key="key">
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
+                      <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,null,3)">
                         <ion-label>
                           <h2>{{record.workAddress}}</h2>
                           <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
@@ -408,14 +409,14 @@
             <div class="form-title">
               求职意向
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
+                        @click="onPathForward('./jobHuntEdit',null,null,null,null,4)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in jobHuntList" :key="key">
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,4)">
+                      <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID, null,4)">
                         <ion-label>
                           <h2>{{record.professionName}}</h2>
                           <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
@@ -433,6 +434,36 @@
             </div>
             <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
           </ion-list>
+
+          <ion-list v-if="curStepData.statusVal==5">
+            <div class="form-title">
+              个人荣誉
+              <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
+                        @click="onPathForward('./honorEdit',null,null,null,null,5)"></ion-icon>
+            </div>
+            <div class="bw-vue-list">
+              <div class="list-content" v-if="!loading">
+                <ion-list>
+                  <div v-for="(record,key) in honorList" :key="key">
+                    <ion-item-sliding>
+                      <ion-item detail @click="onPathForward('./honorEdit',null,null,null, record.honorID,5)">
+                        <ion-label>
+                          <h2>{{ record.honorName }}</h2>
+                          <p>获得时间:{{ dayjs(record.getTime).format("YYYY-MM-DD") }}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.honorID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="jobHuntList.length==0" :loading="loading"/>
+          </ion-list>
           <ion-infinite-scroll v-if="curStepData.statusVal!=1" threshold="100px" @ionInfinite="onScroll($event)">
             <ion-infinite-scroll-content
                 :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
@@ -447,8 +478,10 @@
         <ion-button style="width: 100%;" @click="onSave" v-if="curStepData.statusVal==1">保存并下一步</ion-button>
         <div v-if="curStepData.statusVal!=1" >
           <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
-          <ion-button style="width: 48%;margin-right: 1%;" @click="onSave"   v-if="curStepData.statusVal!=4">下一步</ion-button>
-          <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==4">完  成</ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onSave" v-if="curStepData.statusVal!=5">下一步
+          </ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==5">完 成
+          </ion-button>
         </div>
 
       </ion-toolbar>
@@ -497,6 +530,7 @@ import crtyptoHelp from "@/utils/crypto"
 import BImage from "@/components/bImage.vue";
 import {getUrlParams} from "@/utils/urlUtils";
 import {useUserStore} from "@/store/modules/user";
+import {getHonorListByJobUserID} from "@/api/honor/honor";
 
 interface SelectProps {
   name: string,
@@ -530,6 +564,7 @@ export default defineComponent({
       {title: '教育经历', desc: '完善教育经历',val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
       {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const genderList = ref<SelectProps[]>([]);
     const jobUserStatusList = ref<SelectProps[]>([]);
@@ -550,6 +585,7 @@ export default defineComponent({
     const educationList = ref([]);
     const experienceList = ref([]);
     const jobHuntList = ref([]);
+    const honorList = ref([]);
     const baseInfoData = reactive({
       baseData:{
         jobUserID:null,
@@ -789,11 +825,28 @@ export default defineComponent({
         await router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3,loginUserId:curStepData.value.loginUserID}});
       }else if (curStepData.value.statusVal==3){
         await router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
+      } else if (curStepData.value.statusVal == 4) {
+        await router.push({
+          path: '/jobUserInfo/userEdit',
+          query: {reload: 0, jobUserID: baseInfoData.baseData.jobUserID, status: 5}
+        });
       }
     }
 
-    const onPathForward = (pathValue:string,educationIDValue:any,experienceIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
-      router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,experienceID:experienceIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue,loginUserID:curStepData.value.loginUserID}});
+    const onPathForward = (pathValue: string, educationIDValue: any, experienceIDValue: any, jobHuntIDValue: any, honorIDValue: any, statusValue: any) => {
+      router.push({
+        path: pathValue,
+        query: {
+          reload: 1,
+          educationID: educationIDValue,
+          experienceID: experienceIDValue,
+          jobHuntID: jobHuntIDValue,
+          honorID: honorIDValue,
+          jobUserID: baseInfoData.baseData.jobUserID,
+          status: statusValue,
+          loginUserID: curStepData.value.loginUserID
+        }
+      });
     }
 
     const onScroll = (e: any) => {
@@ -915,6 +968,11 @@ export default defineComponent({
         jobHuntList.value= reqData.list;
         pageParams.total = reqData.total;
         console.log("jobHuntList",jobHuntList.value);
+      } else if (curStepData.value.statusVal == 5) {
+        await getHonorListByJobUserID(jobUserID).then((result: any) => {
+          honorList.value = result;
+          pageParams.total = result.length;
+        })
       }
       if (jobUserID == null) {
         setLongitudeLatitude()
@@ -997,6 +1055,7 @@ export default defineComponent({
       educationList,
       experienceList,
       jobHuntList,
+      honorList,
       delID,
       delAlertButtons,
       infoAlertButtons,

+ 54 - 8
h5app/src/views/pages/jobhunt/detail.vue

@@ -11,18 +11,22 @@
       </ion-toolbar>
     </ion-header>
     <ion-content>
-      <div style="margin-top: 7px;">
+      <div
+          style="margin-top: 7px;height: 35px; display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));justify-content: center;">
         <ion-label @click="onTabChange(1)" class="tab-item">
           <span :class="curTabIndex==1?'active':'passive'">个人信息</span>
         </ion-label>
         <ion-label  @click="onTabChange(2)" class="tab-item">
-          <sapn :class="curTabIndex>=2&&curTabIndex<3?'active':'passive '">教育经历</sapn>
+          <span :class="curTabIndex>=2&&curTabIndex<3?'active':'passive '">教育经历</span>
         </ion-label>
-        <ion-label  @click="onTabChange(3)" class="tab-item">
-          <sapn :class="curTabIndex>=3&&curTabIndex<4?'active':'passive '">工作经验</sapn>
+        <ion-label @click="onTabChange(3)" class="tab-item">
+          <span :class="curTabIndex>=3&&curTabIndex<4?'active':'passive '">工作经验</span>
         </ion-label>
-        <ion-label  @click="onTabChange(4)" class="tab-item">
-          <sapn :class="curTabIndex>=4?'active':'passive '">求职意向</sapn>
+        <ion-label @click="onTabChange(4)" class="tab-item">
+          <span :class="curTabIndex>=4&&curTabIndex<5?'active':'passive '">求职意向</span>
+        </ion-label>
+        <ion-label @click="onTabChange(5)" class="tab-item">
+          <span :class="curTabIndex>=5?'active':'passive '">个人荣誉</span>
         </ion-label>
     </div>
       <div class="bw-vue-form">
@@ -153,7 +157,7 @@
 <!--            <ion-text>{{ dataModel.familyAddress}}</ion-text>-->
 <!--          </div>-->
 <!--          <div class="form-detail">-->
-<!--            <ion-label>兴趣爱好</ion-label>-->
+          <!--            <ion-label>个人评价</ion-label>-->
 <!--            <ion-text>{{ dataModel.hobby}}</ion-text>-->
 <!--          </div>-->
         </div>
@@ -293,6 +297,29 @@
             </ion-text>
           </div>
         </div>
+        <div v-show="curTabIndex==5">
+          <br/>
+          <div v-if="!loading" id="honorList">
+            <div v-for="(record,key) in curUserHonorList" :key="key">
+              <ion-item detail @click="onHonorEdit(record.honorID)" class="ion-item">
+                <ion-label>
+                  <h2>{{ record.honorName }}</h2>
+                  <p>获得时间:{{ dayjs(record.getTime).format("YYYY-MM-DD") }}</p>
+                </ion-label>
+              </ion-item>
+            </div>
+          </div>
+        </div>
+        <div v-show="curTabIndex==5.5">
+          <div class="form-detail">
+            <ion-label>荣誉名称</ion-label>
+            <ion-text>{{ curUserHonorInfo.honorName }}</ion-text>
+          </div>
+          <div class="form-detail">
+            <ion-label>获得时间</ion-label>
+            <ion-text>{{ dayjs(curUserHonorInfo.getTime).format("YYYY-MM-DD") }}</ion-text>
+          </div>
+        </div>
       </div>
       <ion-infinite-scroll  threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
@@ -317,6 +344,7 @@ import {onIonViewDidEnter} from "@ionic/vue";
 import {arrowBackOutline} from 'ionicons/icons';
 import dayjs from "dayjs";
 import crtyptoHelp from "@/utils/crypto";
+import {getHonorListByJobUserID} from "@/api/honor/honor";
 
 interface FormData{
   dataModel:any
@@ -350,6 +378,8 @@ export default defineComponent({
     const curUserExperienceInfo = ref<any>({});
     const curUserJobHuntList = ref<any>([]);
     const curUserJobHuntInfo = ref<any>({});
+    const curUserHonorList = ref([]);
+    const curUserHonorInfo = ref({});
 
 
     const onBack=()=>{
@@ -405,6 +435,10 @@ export default defineComponent({
       curUserJobHuntList.value = jobHuntResult.list;
       //console.log("jobHuntList",curUserJobHuntList.value);
 
+      await getHonorListByJobUserID(pageParams.jobUserID).then((result: any) => {
+        curUserHonorList.value = result;
+      })
+
       loading.value = false;
     };
 
@@ -469,6 +503,15 @@ export default defineComponent({
       })
     }
 
+    function onHonorEdit(honorID: any) {
+      curTabIndex.value = 5.5;
+      (curUserHonorList.value as any[]).map(item => {
+        if (item.honorID == honorID) {
+          curUserHonorInfo.value = item;
+        }
+      })
+    }
+
     const reload = (jobUserID:any,loginUserID:any) => {
       loadData(jobUserID,loginUserID);
     };
@@ -494,12 +537,15 @@ export default defineComponent({
       curUserExperienceInfo,
       curUserJobHuntList,
       curUserJobHuntInfo,
+      curUserHonorList,
+      curUserHonorInfo,
       loading,
       onScroll,
       onTabChange,
       onEducationEdit,
       onExperienceEdit,
       onJobHuntEdit,
+      onHonorEdit,
       onBack,
       loadData,
       dayjs,
@@ -525,7 +571,7 @@ export default defineComponent({
 }
 .tab-item{
   height: 35px;
-  width: 25%;
+  width: 100%;
   float:left;
   text-align: center;
   border:none;

+ 68 - 12
h5app/src/views/pages/jobhunt/edit.vue

@@ -316,9 +316,10 @@
                           placeholder="请输入家庭住址" v-model="baseData.familyAddress" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
           </div>
           <div class="form-input">
-            <ion-label>兴趣爱好</ion-label>
+            <ion-label>个人评价</ion-label>
             <ion-textarea name="hobby" id="hobby"  class="custom" rows="4"
-                          placeholder="请输入兴趣爱好" v-model="baseData.hobby" style="border-bottom: 1px solid #fff2e8;" ></ion-textarea>
+                          placeholder="请输入个人评价" v-model="baseData.hobby"
+                          style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
           </div>
           <div class="form-input">
             <ion-label>个人技能</ion-label>
@@ -354,14 +355,14 @@
             <div class="form-title">
               教育经历
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
+                        @click="onPathForward('./educationEdit',null,null,null, null,2)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in educationList" :key="key" >
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
+                      <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null, null,2)">
                         <ion-label>
                           <h2>{{record.schoolName}}</h2>
                           <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
@@ -384,14 +385,14 @@
             <div class="form-title">
               工作经验
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
+                        @click="onPathForward('./experienceEdit',null,null,null, null,3)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in experienceList" :key="key">
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
+                      <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,null,3)">
                         <ion-label>
                           <h2>{{record.workAddress}}</h2>
                           <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
@@ -414,14 +415,14 @@
             <div class="form-title">
               求职意向
               <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
-                        @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
+                        @click="onPathForward('./jobHuntEdit',null,null,null,null,4)"></ion-icon>
             </div>
             <div class="bw-vue-list">
               <div class="list-content" v-if="!loading">
                 <ion-list>
                   <div v-for="(record,key) in jobHuntList" :key="key">
                     <ion-item-sliding>
-                      <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,4)">
+                      <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,null,4)">
                         <ion-label>
                           <h2>{{record.professionName}}</h2>
                           <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
@@ -439,6 +440,36 @@
             </div>
             <b-empty  v-if="jobHuntList.length==0"  :loading="loading" />
           </ion-list>
+
+          <ion-list v-if="curStepData.statusVal==5">
+            <div class="form-title">
+              个人荣誉
+              <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
+                        @click="onPathForward('./honorEdit',null,null,null,null,5)"></ion-icon>
+            </div>
+            <div class="bw-vue-list">
+              <div class="list-content" v-if="!loading">
+                <ion-list>
+                  <div v-for="(record,key) in honorList" :key="key">
+                    <ion-item-sliding>
+                      <ion-item detail @click="onPathForward('./honorEdit',null,null,null, record.honorID,5)">
+                        <ion-label>
+                          <h2>{{ record.honorName }}</h2>
+                          <p>获得时间:{{ dayjs(record.getTime).format("YYYY-MM-DD") }}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.honorID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="jobHuntList.length==0" :loading="loading"/>
+          </ion-list>
         <!--<ion-refresher pulling-text="下拉刷新" @ionRefresh="onRefresh"></ion-refresher>-->
         <ion-infinite-scroll v-if="curStepData.statusVal!=1" threshold="100px" @ionInfinite="onScroll($event)">
           <ion-infinite-scroll-content
@@ -454,8 +485,10 @@
           <ion-button style="width: 100%;" @click="onSave" v-if="curStepData.statusVal==1">保存并下一步</ion-button>
         <div v-if="curStepData.statusVal!=1" >
           <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
-          <ion-button style="width: 48%;margin-right: 1%;" @click="onSave"   v-if="curStepData.statusVal!=4">下一步</ion-button>
-          <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==4">完  成</ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onSave" v-if="curStepData.statusVal!=5">下一步
+          </ion-button>
+          <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==5">完 成
+          </ion-button>
         </div>
 
       </ion-toolbar>
@@ -505,6 +538,7 @@ import {getPosition} from "@/utils/position";
 import LabelSelection from "@/components/labelSelection.vue";
 import crtyptoHelp from "@/utils/crypto";
 import BImage from "@/components/bImage.vue";
+import {getHonorListByJobUserID} from "@/api/honor/honor";
 
 interface SelectProps {
   name: string,
@@ -536,6 +570,7 @@ export default defineComponent({
         {title: '教育经历', desc: '完善教育经历', val: 2},
         {title: '工作经验', desc: '完善工作经验', val: 3},
         {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const genderList = ref<SelectProps[]>([]);
     const jobUserStatusList = ref<SelectProps[]>([]);
@@ -556,6 +591,7 @@ export default defineComponent({
     const educationList = ref([]);
     const experienceList = ref([]);
     const jobHuntList = ref([]);
+    const honorList = ref([]);
     const isEdit =ref(false);
     const baseInfoData = reactive({
       baseData:{
@@ -803,11 +839,25 @@ export default defineComponent({
          await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3}});
       }else if (curStepData.value.statusVal==3){
         await router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:4}});
+      } else if (curStepData.value.statusVal == 4) {
+        await router.push({path: './edit', query: {reload: 0, jobUserID: baseInfoData.baseData.jobUserID, status: 5}});
       }
     }
 
-    const onPathForward = (pathValue:string,educationIDValue:any,experienceIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
-      router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,experienceID:experienceIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue,isEdit:isEdit.value==true?1:0}});
+    const onPathForward = (pathValue: string, educationIDValue: any, experienceIDValue: any, jobHuntIDValue: any, honorIDValue: any, statusValue: any) => {
+      router.push({
+        path: pathValue,
+        query: {
+          reload: 1,
+          educationID: educationIDValue,
+          experienceID: experienceIDValue,
+          jobHuntID: jobHuntIDValue,
+          honorID: honorIDValue,
+          jobUserID: baseInfoData.baseData.jobUserID,
+          status: statusValue,
+          isEdit: isEdit.value == true ? 1 : 0
+        }
+      });
     }
     const onPathRedirect = (statusValue:any)=>{
       if(isEdit.value) router.push({path: './edit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
@@ -932,6 +982,11 @@ export default defineComponent({
         jobHuntList.value= reqData.list;
         pageParams.total = reqData.total;
         //console.log("jobHuntList",jobHuntList.value);
+      } else if (curStepData.value.statusVal == 5) {
+        await getHonorListByJobUserID(jobUserID).then((result: any) => {
+          honorList.value = result;
+          pageParams.total = result.length;
+        })
       }
       if (jobUserID == null) {
         setLongitudeLatitude();
@@ -1021,6 +1076,7 @@ export default defineComponent({
       delLoading,
       infoAlterData,
       isGraduating,
+      honorList,
       finishDateChange,
       keyPersonTypeChange,
       provinceChange,

+ 1 - 0
h5app/src/views/pages/jobhunt/educationEdit.vue

@@ -126,6 +126,7 @@ export default defineComponent({
       {title: '教育经历', desc: '完善教育经历', val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
       {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const cultureRankList = ref<SelectProps[]>([]);
     const educationData = reactive<educationModel>({

+ 1 - 0
h5app/src/views/pages/jobhunt/experienceEdit.vue

@@ -123,6 +123,7 @@ export default defineComponent({
       {title: '教育经历', desc: '完善教育经历', val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
       {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const cultureRankList = ref<SelectProps[]>([]);
     const experienceData = reactive<experienceModel>({

+ 274 - 0
h5app/src/views/pages/jobhunt/honorEdit.vue

@@ -0,0 +1,274 @@
+<template>
+  <ion-page>
+    <ion-header class="header-theme2">
+      <ion-toolbar>
+        <ion-buttons slot="start">
+          <ion-icon :icon="arrowBackOutline" @click="onCancel"
+                    style="padding-left:10px;width:24px;height:24px;"></ion-icon>
+        </ion-buttons>
+        <ion-title>个人荣誉收集</ion-title>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <div class="stepFlex">
+        <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
+          <div
+              :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal==stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
+          <div class="stepFlex-item-label">
+            <p class="stepFlex-item-label-title" @click="onPathRedirect(record.val)">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc" @click="onPathRedirect(record.val)">{{ record.desc }}</p>
+          </div>
+        </div>
+      </div>
+
+      <form ref="editForm" @submit.prevent="onSave">
+        <div class="bw-vue-form">
+          <ion-list class="canvasWrapper">
+            <div class="form-title">个人荣誉</div>
+            <div class="form-input">
+              <ion-label>荣誉名称<span class="danger">*</span></ion-label>
+              <ion-input name="schoolName" id="schoolName" class="custom"
+                         placeholder="请输入荣誉名称" v-model="honorData.dataModel.honorName"></ion-input>
+            </div>
+            <div class="form-input">
+              <ion-label>
+                获得时间<span class="danger">*</span>
+              </ion-label>
+              <div class="dateTimeBox">
+                <ion-datetime-button datetime="completeTime"></ion-datetime-button>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="completeTime" placeholder="日期"
+                                v-model="honorData.dataModel.getTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+              </div>
+            </div>
+          </ion-list>
+        </div>
+      </form>
+    </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <ion-button style="width:100%;" @click="onSave">保 存</ion-button>
+      </ion-toolbar>
+    </ion-footer>
+    <ion-loading
+        :is-open="loading"
+        message="加载中..."
+        @didDismiss="setOpen(false)">
+    </ion-loading>
+  </ion-page>
+</template>
+
+<script setup lang="ts">
+import {arrowBackOutline} from "ionicons/icons";
+import {useRoute, useRouter} from "vue-router";
+import {computed, reactive, ref} from "vue";
+import {getHonorByID, saveHonor} from "@/api/honor/honor";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import dayjs from "dayjs";
+
+const router = useRouter();
+const route = useRoute();
+
+const honorData = reactive({
+  dataModel: {
+    honorID: "",
+    jobUserID: "",
+    honorName: '',
+    getTime: dayjs().format("YYYY-MM-DD"),
+  }
+});
+const curStepData = ref({
+  name: "",
+  statusVal: 2
+});
+const stepList = ref([
+  {title: '基础信息', desc: '个人基础信息', val: 1},
+  {title: '教育经历', desc: '完善教育经历', val: 2},
+  {title: '工作经验', desc: '完善工作经验', val: 3},
+  {title: '求职意向', desc: '个人求职意向', val: 4},
+  {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
+]);
+const loading = ref(false);
+const isEditJobUser = ref(0);
+const presentAlert = async (message: string) => {
+  const alert = await alertController.create({
+    header: '错误!',
+    message: message,
+    buttons: [
+      '确定'
+    ],
+  });
+  await alert.present();
+}
+const honorRules = computed(() => {
+  return {
+    dataModel: {
+      honorName: {required},
+      getTime: {required},
+    }
+  }
+});
+const honorValid = useVuelidate(honorRules, honorData);
+
+const loadData = async (honorID: any, jobUserID: any, status: any, isEdit: any) => {
+  loading.value = true;
+  curStepData.value.statusVal = status;
+  isEditJobUser.value = isEdit;
+  await getHonorByID(honorID).then((result: any) => {
+    honorData.dataModel.honorID = result.honorID;
+    honorData.dataModel.honorName = result.honorName;
+    honorData.dataModel.getTime = dayjs(result.getTime).format("YYYY-MM-DD");
+    honorData.dataModel.jobUserID = result.jobUserID;
+  }).finally(() => {
+    loading.value = false;
+  })
+};
+
+const reload = async (honorID: any, jobUserID: any, status: any, isEdit: any) => {
+  await loadData(honorID, jobUserID, status, isEdit);
+}
+
+const onCancel = () => {
+  router.push({path: './edit', query: {reload: 1, jobUserID: honorData.dataModel.jobUserID, status: 5}});
+}
+
+const onPathRedirect = (statusValue: any) => {
+  if (isEditJobUser.value == 1) router.push({
+    path: './edit',
+    query: {reload: 1, jobUserID: honorData.dataModel.jobUserID, status: statusValue, isEdit: isEditJobUser.value}
+  });
+}
+const onSave = async function () {
+  const isFormCorrect = await honorValid.value.$validate();
+  if (!isFormCorrect) {
+    await presentAlert("请填写完整的信息!");
+    return null;
+  }
+  saveHonor(honorData.dataModel).then(result => {
+    if (result) {
+      honorData.dataModel.honorID = "";
+      honorData.dataModel.honorName = "";
+      honorData.dataModel.getTime = dayjs().format("YYYY-MM-DD");
+      router.push({path: './edit', query: {reload: 1, jobUserID: honorData.dataModel.jobUserID, status: 5}});
+    }
+  });
+}
+
+const setOpen = (isOpen: boolean) => {
+  loading.value = isOpen;
+};
+
+onIonViewDidEnter(() => {
+  if (route.query.reload)
+    reload(route.query.honorID, route.query.jobUserID, route.query.status, route.query.isEdit);
+});
+</script>
+
+<style lang="less">
+ion-input.custom {
+  --placeholder-color: gray;
+  --placeholder-opacity: 0.5;
+}
+
+.title-item {
+  margin-left: 15px;
+  color: #1c3d70 !important;
+  font-size: 14px !important;
+  font-weight: bold;
+}
+
+.stepFlex {
+  margin: 0;
+  display: flex;
+  width: 100%;
+
+  .stepFlex-item {
+    position: relative;
+    flex: 1;
+    text-align: center;
+    margin-top: -10px;
+
+    .stepFlex-item-label {
+      padding-top: 60px;
+      font-size: 14px;
+
+      .stepFlex-item-label-title {
+        margin-top: 30px;
+      }
+
+      .stepFlex-item-label-desc {
+        margin-top: 5px;
+        color: #b9b9bd;
+      }
+    }
+  }
+
+  .greenCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+  }
+
+  .now {
+    top: calc(50% - 18px);
+    left: calc(50% - 8px);
+    position: absolute;
+    z-index: 3;
+    width: 16px;
+    height: 16px;
+    border-radius: 50%;
+    background-color: #31A2FE;
+    border: 4px solid #c5e8f9;
+  }
+
+  .grayCircle {
+    top: calc(50% - 15px);
+    left: calc(50% - 4px);
+    position: absolute;
+    z-index: 2;
+    width: 10px;
+    height: 10px;
+    border-radius: 50%;
+    background-color: #ccc;
+  }
+
+  .greenLine {
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    height: 2px;
+    background-color: #31A2FE;
+    position: absolute;
+  }
+
+  .grayLine {
+    height: 0;
+    border: 1px dashed #ccc;
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    position: absolute;
+  }
+}
+
+.dateTimeBox {
+  width: 100%;
+  display: flex;
+  margin-top: 5px;
+  justify-content: space-between;
+  align-content: center;
+}
+</style>

+ 2 - 1
h5app/src/views/pages/jobhunt/jobHuntEdit.vue

@@ -175,7 +175,8 @@ export default defineComponent({
       {title: '基础信息', desc: '个人基础信息', val: 1},
       {title: '教育经历', desc: '完善教育经历', val: 2},
       {title: '工作经验', desc: '完善工作经验', val: 3},
-      {title: '求职意向', desc: '个人求职意向', val: 4}
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+      {title: '个人荣誉', desc: '完善个人荣誉', val: 5},
     ]);
     const jobHuntTypeList = ref<SelectProps[]>([]);
     const jobUserTypeList = ref<SelectProps[]>([]);

+ 77 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/HonorController.java

@@ -0,0 +1,77 @@
+package com.hz.employmentsite.controller.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseErrorEnum;
+import com.hz.employmentsite.filter.exception.BaseException;
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.PcHonor;
+import com.hz.employmentsite.services.service.AccountService;
+import com.hz.employmentsite.services.service.jobUserManager.HonorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+@RestController
+@RequestMapping(value = "/api/jobUserService/honor")
+public class HonorController {
+
+    @Autowired
+    private HonorService honorService;
+
+    @Autowired
+    private AccountService accountService;
+
+    @ResponseBody
+    @GetMapping("/getPageList")
+    public BaseResponse getListByJobUserID(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize, @RequestParam(required = false) String jobUserID) {
+
+        PageInfo<PcHonor> result = honorService.getListByJobUserID(pageIndex, pageSize,jobUserID);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getList")
+    public BaseResponse getListByJobUserID(@RequestParam String jobUserID) {
+        List<PcHonor> result = honorService.getListByJobUserID(jobUserID);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getById")
+    public BaseResponse<PcHonor> getById(@RequestParam(required = false) String honorID) {
+        PcHonor dataModel = new PcHonor();
+        if (honorID == null || honorID == ""){
+            dataModel.setHonorID(UUID.randomUUID().toString());
+            dataModel.setGetTime(new Date());
+        }else{
+            dataModel = honorService.getById(honorID);
+        }
+        return RespGenerstor.success(dataModel);
+    }
+
+    @PostMapping("save")
+    public BaseResponse<Integer> save(@RequestBody PcHonor data) {
+        String loginUserID = "";
+        try {
+            loginUserID = accountService.getLoginUserID();
+        }
+        catch (Exception e){
+        }
+
+        return RespGenerstor.success(honorService.save(data,loginUserID));
+    }
+
+    @ResponseBody
+    @PostMapping("/delete")
+    public BaseResponse deleteEducation(@RequestBody List<String> ids) {
+        var result = honorService.delete(ids);
+        if (result <= 0) {
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        }
+        return RespGenerstor.success(1);
+    }
+}

+ 30 - 0
src/main/java/com/hz/employmentsite/mapper/PcHonorMapper.java

@@ -0,0 +1,30 @@
+package com.hz.employmentsite.mapper;
+
+import com.hz.employmentsite.model.PcHonor;
+import com.hz.employmentsite.model.PcHonorExample;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface PcHonorMapper {
+    long countByExample(PcHonorExample example);
+
+    int deleteByExample(PcHonorExample example);
+
+    int deleteByPrimaryKey(String honorID);
+
+    int insert(PcHonor row);
+
+    int insertSelective(PcHonor row);
+
+    List<PcHonor> selectByExample(PcHonorExample example);
+
+    PcHonor selectByPrimaryKey(String honorID);
+
+    int updateByExampleSelective(@Param("row") PcHonor row, @Param("example") PcHonorExample example);
+
+    int updateByExample(@Param("row") PcHonor row, @Param("example") PcHonorExample example);
+
+    int updateByPrimaryKeySelective(PcHonor row);
+
+    int updateByPrimaryKey(PcHonor row);
+}

+ 13 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/HonorCQuery.java

@@ -0,0 +1,13 @@
+package com.hz.employmentsite.mapper.cquery;
+
+import com.hz.employmentsite.model.PcHonor;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface HonorCQuery {
+    List<PcHonor> getListByJobUserID(@Param("jobUserID") String jobUserID);
+
+    PcHonor getById(@Param("honorID") String honorID);
+
+}

+ 85 - 0
src/main/java/com/hz/employmentsite/model/PcHonor.java

@@ -0,0 +1,85 @@
+package com.hz.employmentsite.model;
+
+import java.util.Date;
+
+public class PcHonor {
+    private String honorID;
+
+    private String jobUserID;
+
+    private String honorName;
+
+    private Date getTime;
+
+    private String createUserID;
+
+    private Date createTime;
+
+    private String modifyUserID;
+
+    private Date modifyTime;
+
+    public String getHonorID() {
+        return honorID;
+    }
+
+    public void setHonorID(String honorID) {
+        this.honorID = honorID == null ? null : honorID.trim();
+    }
+
+    public String getJobUserID() {
+        return jobUserID;
+    }
+
+    public void setJobUserID(String jobUserID) {
+        this.jobUserID = jobUserID == null ? null : jobUserID.trim();
+    }
+
+    public String getHonorName() {
+        return honorName;
+    }
+
+    public void setHonorName(String honorName) {
+        this.honorName = honorName == null ? null : honorName.trim();
+    }
+
+    public Date getGetTime() {
+        return getTime;
+    }
+
+    public void setGetTime(Date getTime) {
+        this.getTime = getTime;
+    }
+
+    public String getCreateUserID() {
+        return createUserID;
+    }
+
+    public void setCreateUserID(String createUserID) {
+        this.createUserID = createUserID == null ? null : createUserID.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getModifyUserID() {
+        return modifyUserID;
+    }
+
+    public void setModifyUserID(String modifyUserID) {
+        this.modifyUserID = modifyUserID == null ? null : modifyUserID.trim();
+    }
+
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+}

+ 730 - 0
src/main/java/com/hz/employmentsite/model/PcHonorExample.java

@@ -0,0 +1,730 @@
+package com.hz.employmentsite.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class PcHonorExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PcHonorExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andHonorIDIsNull() {
+            addCriterion("HonorID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDIsNotNull() {
+            addCriterion("HonorID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDEqualTo(String value) {
+            addCriterion("HonorID =", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDNotEqualTo(String value) {
+            addCriterion("HonorID <>", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDGreaterThan(String value) {
+            addCriterion("HonorID >", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDGreaterThanOrEqualTo(String value) {
+            addCriterion("HonorID >=", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDLessThan(String value) {
+            addCriterion("HonorID <", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDLessThanOrEqualTo(String value) {
+            addCriterion("HonorID <=", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDLike(String value) {
+            addCriterion("HonorID like", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDNotLike(String value) {
+            addCriterion("HonorID not like", value, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDIn(List<String> values) {
+            addCriterion("HonorID in", values, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDNotIn(List<String> values) {
+            addCriterion("HonorID not in", values, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDBetween(String value1, String value2) {
+            addCriterion("HonorID between", value1, value2, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorIDNotBetween(String value1, String value2) {
+            addCriterion("HonorID not between", value1, value2, "honorID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDIsNull() {
+            addCriterion("JobUserID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDIsNotNull() {
+            addCriterion("JobUserID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDEqualTo(String value) {
+            addCriterion("JobUserID =", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDNotEqualTo(String value) {
+            addCriterion("JobUserID <>", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDGreaterThan(String value) {
+            addCriterion("JobUserID >", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDGreaterThanOrEqualTo(String value) {
+            addCriterion("JobUserID >=", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDLessThan(String value) {
+            addCriterion("JobUserID <", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDLessThanOrEqualTo(String value) {
+            addCriterion("JobUserID <=", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDLike(String value) {
+            addCriterion("JobUserID like", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDNotLike(String value) {
+            addCriterion("JobUserID not like", value, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDIn(List<String> values) {
+            addCriterion("JobUserID in", values, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDNotIn(List<String> values) {
+            addCriterion("JobUserID not in", values, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDBetween(String value1, String value2) {
+            addCriterion("JobUserID between", value1, value2, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andJobUserIDNotBetween(String value1, String value2) {
+            addCriterion("JobUserID not between", value1, value2, "jobUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameIsNull() {
+            addCriterion("HonorName is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameIsNotNull() {
+            addCriterion("HonorName is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameEqualTo(String value) {
+            addCriterion("HonorName =", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameNotEqualTo(String value) {
+            addCriterion("HonorName <>", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameGreaterThan(String value) {
+            addCriterion("HonorName >", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameGreaterThanOrEqualTo(String value) {
+            addCriterion("HonorName >=", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameLessThan(String value) {
+            addCriterion("HonorName <", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameLessThanOrEqualTo(String value) {
+            addCriterion("HonorName <=", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameLike(String value) {
+            addCriterion("HonorName like", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameNotLike(String value) {
+            addCriterion("HonorName not like", value, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameIn(List<String> values) {
+            addCriterion("HonorName in", values, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameNotIn(List<String> values) {
+            addCriterion("HonorName not in", values, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameBetween(String value1, String value2) {
+            addCriterion("HonorName between", value1, value2, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andHonorNameNotBetween(String value1, String value2) {
+            addCriterion("HonorName not between", value1, value2, "honorName");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeIsNull() {
+            addCriterion("GetTime is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeIsNotNull() {
+            addCriterion("GetTime is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeEqualTo(Date value) {
+            addCriterion("GetTime =", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeNotEqualTo(Date value) {
+            addCriterion("GetTime <>", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeGreaterThan(Date value) {
+            addCriterion("GetTime >", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("GetTime >=", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeLessThan(Date value) {
+            addCriterion("GetTime <", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeLessThanOrEqualTo(Date value) {
+            addCriterion("GetTime <=", value, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeIn(List<Date> values) {
+            addCriterion("GetTime in", values, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeNotIn(List<Date> values) {
+            addCriterion("GetTime not in", values, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeBetween(Date value1, Date value2) {
+            addCriterion("GetTime between", value1, value2, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andGetTimeNotBetween(Date value1, Date value2) {
+            addCriterion("GetTime not between", value1, value2, "getTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDIsNull() {
+            addCriterion("CreateUserID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDIsNotNull() {
+            addCriterion("CreateUserID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDEqualTo(String value) {
+            addCriterion("CreateUserID =", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDNotEqualTo(String value) {
+            addCriterion("CreateUserID <>", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDGreaterThan(String value) {
+            addCriterion("CreateUserID >", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDGreaterThanOrEqualTo(String value) {
+            addCriterion("CreateUserID >=", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDLessThan(String value) {
+            addCriterion("CreateUserID <", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDLessThanOrEqualTo(String value) {
+            addCriterion("CreateUserID <=", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDLike(String value) {
+            addCriterion("CreateUserID like", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDNotLike(String value) {
+            addCriterion("CreateUserID not like", value, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDIn(List<String> values) {
+            addCriterion("CreateUserID in", values, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDNotIn(List<String> values) {
+            addCriterion("CreateUserID not in", values, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDBetween(String value1, String value2) {
+            addCriterion("CreateUserID between", value1, value2, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateUserIDNotBetween(String value1, String value2) {
+            addCriterion("CreateUserID not between", value1, value2, "createUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("CreateTime is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("CreateTime is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("CreateTime =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("CreateTime <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("CreateTime >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("CreateTime >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("CreateTime <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("CreateTime <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("CreateTime in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("CreateTime not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("CreateTime between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("CreateTime not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDIsNull() {
+            addCriterion("ModifyUserID is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDIsNotNull() {
+            addCriterion("ModifyUserID is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDEqualTo(String value) {
+            addCriterion("ModifyUserID =", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDNotEqualTo(String value) {
+            addCriterion("ModifyUserID <>", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDGreaterThan(String value) {
+            addCriterion("ModifyUserID >", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDGreaterThanOrEqualTo(String value) {
+            addCriterion("ModifyUserID >=", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDLessThan(String value) {
+            addCriterion("ModifyUserID <", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDLessThanOrEqualTo(String value) {
+            addCriterion("ModifyUserID <=", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDLike(String value) {
+            addCriterion("ModifyUserID like", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDNotLike(String value) {
+            addCriterion("ModifyUserID not like", value, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDIn(List<String> values) {
+            addCriterion("ModifyUserID in", values, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDNotIn(List<String> values) {
+            addCriterion("ModifyUserID not in", values, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDBetween(String value1, String value2) {
+            addCriterion("ModifyUserID between", value1, value2, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyUserIDNotBetween(String value1, String value2) {
+            addCriterion("ModifyUserID not between", value1, value2, "modifyUserID");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeIsNull() {
+            addCriterion("ModifyTime is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeIsNotNull() {
+            addCriterion("ModifyTime is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeEqualTo(Date value) {
+            addCriterion("ModifyTime =", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeNotEqualTo(Date value) {
+            addCriterion("ModifyTime <>", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeGreaterThan(Date value) {
+            addCriterion("ModifyTime >", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("ModifyTime >=", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeLessThan(Date value) {
+            addCriterion("ModifyTime <", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeLessThanOrEqualTo(Date value) {
+            addCriterion("ModifyTime <=", value, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeIn(List<Date> values) {
+            addCriterion("ModifyTime in", values, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeNotIn(List<Date> values) {
+            addCriterion("ModifyTime not in", values, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeBetween(Date value1, Date value2) {
+            addCriterion("ModifyTime between", value1, value2, "modifyTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifyTimeNotBetween(Date value1, Date value2) {
+            addCriterion("ModifyTime not between", value1, value2, "modifyTime");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 101 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/HonorServiceImpl.java

@@ -0,0 +1,101 @@
+package com.hz.employmentsite.services.impl.jobUserManager;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.mapper.PcHonorMapper;
+import com.hz.employmentsite.mapper.cquery.HonorCQuery;
+import com.hz.employmentsite.model.PcHonor;
+import com.hz.employmentsite.model.PcHonorExample;
+import com.hz.employmentsite.services.service.jobUserManager.HonorService;
+import com.hz.employmentsite.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+@Service("HonorService")
+public class HonorServiceImpl implements HonorService {
+
+    @Autowired
+    private HonorCQuery honorCQuery;
+    @Autowired
+    private StringUtils stringUtils;
+    @Autowired
+    private PcHonorMapper pcHonorMapper;
+
+    @Override
+    public PageInfo<PcHonor> getListByJobUserID(Integer pageIndex, Integer pageSize, String jobUserID) {
+        PageHelper.startPage(pageIndex, pageSize);
+        List<PcHonor> list = honorCQuery.getListByJobUserID(jobUserID);
+        PageInfo<PcHonor> result = new PageInfo(list);
+        return result;
+    }
+
+    @Override
+    public List<PcHonor> getListByJobUserID(String jobUserID) {
+        PcHonorExample example = new PcHonorExample();
+        example.or().andJobUserIDEqualTo(jobUserID);
+        example.setOrderByClause("GetTime DESC");
+        return pcHonorMapper.selectByExample(example);
+    }
+
+    @Override
+    public PcHonor getById(String educationID) {
+        if (stringUtils.IsNullOrEmpty(educationID)) {
+            return null;
+        }
+        PcHonor data = honorCQuery.getById(educationID);
+        return data;
+    }
+
+    @Override
+    public Integer save(PcHonor data, String userId) {
+        int result = 0;
+        PcHonor dbData = pcHonorMapper.selectByPrimaryKey(data.getHonorID());
+        if (dbData == null) {
+            dbData = new PcHonor();
+            dbData.setHonorID(UUID.randomUUID().toString());
+            dbData.setJobUserID(data.getJobUserID());
+            dbData.setHonorName(data.getHonorName());
+            dbData.setGetTime(data.getGetTime());
+            dbData.setCreateTime(new Date());
+            dbData.setCreateUserID(userId);
+            result = pcHonorMapper.insert(dbData);
+        } else {
+            dbData.setHonorID(data.getHonorID());
+            dbData.setJobUserID(data.getJobUserID());
+            dbData.setHonorName(data.getHonorName());
+            dbData.setGetTime(data.getGetTime());
+            dbData.setModifyTime(new Date());
+            dbData.setModifyUserID(userId);
+            result = pcHonorMapper.updateByPrimaryKey(dbData);
+        }
+        return result;
+    }
+
+    @Override
+    public Integer save(PcHonor data) {
+        return pcHonorMapper.insert(data);
+    }
+
+    @Override
+    public int delete(List<String> ids) {
+        int honorRows = 0;
+        PcHonorExample example = new PcHonorExample();
+        PcHonorExample.Criteria croEducation = example.or();
+        croEducation.andHonorIDIn(ids);
+        honorRows = pcHonorMapper.deleteByExample(example);
+        return honorRows;
+    }
+
+    @Override
+    public int deleteByJobUserID(String jobUserID) {
+        int result = 0;
+        PcHonorExample example = new PcHonorExample();
+        example.or().andJobUserIDEqualTo(jobUserID);
+        result = pcHonorMapper.deleteByExample(example);
+        return result;
+    }
+}

+ 11 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobUserServiceImpl.java

@@ -11,6 +11,7 @@ import com.hz.employmentsite.mapper.cquery.LabelCQuery;
 import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.impl.system.CityAreaImpl;
 import com.hz.employmentsite.services.service.AccountService;
+import com.hz.employmentsite.services.service.jobUserManager.HonorService;
 import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
 import com.hz.employmentsite.services.service.jobUserManager.JobUserServiceService;
 import com.hz.employmentsite.services.service.system.DictionaryService;
@@ -83,6 +84,8 @@ public class JobUserServiceImpl implements JobUserService {
     private SysLogMapper sysLogMapper;
     @Autowired
     private CityAreaImpl cityAreaImpl;
+    @Autowired
+    private HonorService honorService;
 
     @Override
     public PageInfo<JobUserVo> getList(Integer pageIndex, Integer pageSize,
@@ -307,6 +310,7 @@ public class JobUserServiceImpl implements JobUserService {
             ids.add(data.getJobUserID());
             deleteEducation(ids);
             deleteExperience(ids);
+            honorService.deleteByJobUserID(data.getJobUserID());
             data.getJobEducation().stream().forEach(x -> {
                 PcEducation education = new PcEducation();
                 education.setEducationID(UUID.randomUUID().toString());
@@ -340,6 +344,13 @@ public class JobUserServiceImpl implements JobUserService {
                 experience.setCreateUserID(userId);
                 pcExperienceMapper.insert(experience);
             });
+            data.getJobHonorList().stream().forEach(honor -> {
+                honor.setHonorID(UUID.randomUUID().toString());
+                honor.setJobUserID(data.getJobUserID());
+                honor.setCreateTime(new Date());
+                honor.setCreateUserID(userId);
+                honorService.save(honor);
+            });
         }
         return result;
     }

+ 23 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/HonorService.java

@@ -0,0 +1,23 @@
+package com.hz.employmentsite.services.service.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.model.PcHonor;
+
+import java.util.List;
+
+public interface HonorService {
+
+    PageInfo<PcHonor> getListByJobUserID(Integer pageIndex, Integer pageSize, String jobUserID);
+
+    List<PcHonor> getListByJobUserID(String jobUserID);
+
+    PcHonor getById(String educationID);
+
+    Integer save(PcHonor data, String userId);
+
+    Integer save(PcHonor data);
+
+    int delete(List<String> ids);
+
+    int deleteByJobUserID(String jobUserID);
+}

+ 2 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java

@@ -1,5 +1,6 @@
 package com.hz.employmentsite.vo.jobUserManager;
 
+import com.hz.employmentsite.model.PcHonor;
 import com.hz.employmentsite.util.datarange.annotations.InstitutionID;
 import com.hz.employmentsite.util.datarange.annotations.JobUserID;
 import com.hz.employmentsite.util.datarange.annotations.RegionID;
@@ -122,6 +123,7 @@ public class JobUserVo {
     public String keyTypeName;
     public List<HashMap<String, Object>> jobEducation;
     public List<HashMap<String, Object>> jobExperience;
+    public List<PcHonor> jobHonorList;
     /*已推荐岗位个数*/
     public int recommendedCount;
 

+ 258 - 0
src/main/resources/mapping/PcHonorMapper.xml

@@ -0,0 +1,258 @@
+<?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.hz.employmentsite.mapper.PcHonorMapper">
+  <resultMap id="BaseResultMap" type="com.hz.employmentsite.model.PcHonor">
+    <id column="HonorID" jdbcType="VARCHAR" property="honorID" />
+    <result column="JobUserID" jdbcType="VARCHAR" property="jobUserID" />
+    <result column="HonorName" jdbcType="VARCHAR" property="honorName" />
+    <result column="GetTime" jdbcType="TIMESTAMP" property="getTime" />
+    <result column="CreateUserID" jdbcType="VARCHAR" property="createUserID" />
+    <result column="CreateTime" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="ModifyUserID" jdbcType="VARCHAR" property="modifyUserID" />
+    <result column="ModifyTime" jdbcType="TIMESTAMP" property="modifyTime" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    HonorID, JobUserID, HonorName, GetTime, CreateUserID, CreateTime, ModifyUserID, ModifyTime
+  </sql>
+  <select id="selectByExample" parameterType="com.hz.employmentsite.model.PcHonorExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from pc_honor
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from pc_honor
+    where HonorID = #{honorID,jdbcType=VARCHAR}
+  </select>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    delete from pc_honor
+    where HonorID = #{honorID,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.hz.employmentsite.model.PcHonorExample">
+    delete from pc_honor
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.hz.employmentsite.model.PcHonor">
+    insert into pc_honor (HonorID, JobUserID, HonorName, 
+      GetTime, CreateUserID, CreateTime, 
+      ModifyUserID, ModifyTime)
+    values (#{honorID,jdbcType=VARCHAR}, #{jobUserID,jdbcType=VARCHAR}, #{honorName,jdbcType=VARCHAR}, 
+      #{getTime,jdbcType=TIMESTAMP}, #{createUserID,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{modifyUserID,jdbcType=VARCHAR}, #{modifyTime,jdbcType=TIMESTAMP})
+  </insert>
+  <insert id="insertSelective" parameterType="com.hz.employmentsite.model.PcHonor">
+    insert into pc_honor
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="honorID != null">
+        HonorID,
+      </if>
+      <if test="jobUserID != null">
+        JobUserID,
+      </if>
+      <if test="honorName != null">
+        HonorName,
+      </if>
+      <if test="getTime != null">
+        GetTime,
+      </if>
+      <if test="createUserID != null">
+        CreateUserID,
+      </if>
+      <if test="createTime != null">
+        CreateTime,
+      </if>
+      <if test="modifyUserID != null">
+        ModifyUserID,
+      </if>
+      <if test="modifyTime != null">
+        ModifyTime,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="honorID != null">
+        #{honorID,jdbcType=VARCHAR},
+      </if>
+      <if test="jobUserID != null">
+        #{jobUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="honorName != null">
+        #{honorName,jdbcType=VARCHAR},
+      </if>
+      <if test="getTime != null">
+        #{getTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createUserID != null">
+        #{createUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="modifyUserID != null">
+        #{modifyUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="modifyTime != null">
+        #{modifyTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.hz.employmentsite.model.PcHonorExample" resultType="java.lang.Long">
+    select count(*) from pc_honor
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update pc_honor
+    <set>
+      <if test="row.honorID != null">
+        HonorID = #{row.honorID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.jobUserID != null">
+        JobUserID = #{row.jobUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.honorName != null">
+        HonorName = #{row.honorName,jdbcType=VARCHAR},
+      </if>
+      <if test="row.getTime != null">
+        GetTime = #{row.getTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="row.createUserID != null">
+        CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.createTime != null">
+        CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="row.modifyUserID != null">
+        ModifyUserID = #{row.modifyUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="row.modifyTime != null">
+        ModifyTime = #{row.modifyTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update pc_honor
+    set HonorID = #{row.honorID,jdbcType=VARCHAR},
+      JobUserID = #{row.jobUserID,jdbcType=VARCHAR},
+      HonorName = #{row.honorName,jdbcType=VARCHAR},
+      GetTime = #{row.getTime,jdbcType=TIMESTAMP},
+      CreateUserID = #{row.createUserID,jdbcType=VARCHAR},
+      CreateTime = #{row.createTime,jdbcType=TIMESTAMP},
+      ModifyUserID = #{row.modifyUserID,jdbcType=VARCHAR},
+      ModifyTime = #{row.modifyTime,jdbcType=TIMESTAMP}
+    <if test="example != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.hz.employmentsite.model.PcHonor">
+    update pc_honor
+    <set>
+      <if test="jobUserID != null">
+        JobUserID = #{jobUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="honorName != null">
+        HonorName = #{honorName,jdbcType=VARCHAR},
+      </if>
+      <if test="getTime != null">
+        GetTime = #{getTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="createUserID != null">
+        CreateUserID = #{createUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        CreateTime = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="modifyUserID != null">
+        ModifyUserID = #{modifyUserID,jdbcType=VARCHAR},
+      </if>
+      <if test="modifyTime != null">
+        ModifyTime = #{modifyTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where HonorID = #{honorID,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.hz.employmentsite.model.PcHonor">
+    update pc_honor
+    set JobUserID = #{jobUserID,jdbcType=VARCHAR},
+      HonorName = #{honorName,jdbcType=VARCHAR},
+      GetTime = #{getTime,jdbcType=TIMESTAMP},
+      CreateUserID = #{createUserID,jdbcType=VARCHAR},
+      CreateTime = #{createTime,jdbcType=TIMESTAMP},
+      ModifyUserID = #{modifyUserID,jdbcType=VARCHAR},
+      ModifyTime = #{modifyTime,jdbcType=TIMESTAMP}
+    where HonorID = #{honorID,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 17 - 0
src/main/resources/mapping/cquery/HonorCQuery.xml

@@ -0,0 +1,17 @@
+<?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.hz.employmentsite.mapper.cquery.HonorCQuery">
+    <select id="getListByJobUserID" resultType="com.hz.employmentsite.model.PcHonor">
+        select * from pc_honor where 1=1
+        <if test="jobUserID != null and jobUserID != ''">
+            and JobUserID = #{jobUserID}
+        </if>
+        order by GetTime desc
+    </select>
+    <select id="getById" resultType="com.hz.employmentsite.model.PcHonor">
+        select * from pc_honor where 1=1
+        <if test="honorID != null and honorID != ''">
+            and honorID = #{honorID}
+        </if>
+    </select>
+</mapper>

+ 13 - 0
vue/src/api/jobUserManager/jobuser/index.ts

@@ -140,3 +140,16 @@ export function claimJobUser(ids: any, siteID: any) {
     }
   )
 }
+
+export function getHonorList(jobUserID: any) {
+  return request(
+    {
+      url: "jobUserService/honor/getList",
+      method: 'get',
+      params: {jobUserID},
+    },
+    {
+      isNew: true,
+    },
+  );
+}

+ 50 - 1
vue/src/views/companyService/post/jobUserDetail.vue

@@ -73,6 +73,19 @@
           </a-timeline-item>
         </a-timeline>
         <a-empty :image="simpleImage"  v-if="experienceData.length==0" ></a-empty>
+        <a-divider orientation="left">个人荣誉</a-divider>
+        <a-table :columns="HonorColumns" :data-source="honorData" bordered :pagination="false"
+                 style="margin-left: 11px">
+          <template #bodyCell="{ column, index, record}">
+            <template v-if="column.key === 'getTime'">
+              <div>
+                {{
+                  dayjs(record.getTime).format('YYYY-MM-DD')
+                }}
+              </div>
+            </template>
+          </template>
+        </a-table>
         <a-divider orientation="left">附件</a-divider>
         <b-upload-file :fileRefId="dataModel.jobUserID" :readonly="true" :multiple="true" style="width: 100%;"
                        :setFileList="setFileList" :accept="'.pdf,.png,.jpg'"></b-upload-file>
@@ -83,7 +96,7 @@
 
 <script lang="ts">
 import {defineComponent, reactive, ref, toRefs} from "vue";
-import {getDataById, getEducationList, getExperienceList} from "@/api/jobUserManager/jobuser";
+import {getDataById, getEducationList, getExperienceList, getHonorList} from "@/api/jobUserManager/jobuser";
 import type {SelectProps, TableColumnsType} from "ant-design-vue";
 import dayjs from "dayjs";
 import {getSysDictionaryList} from "@/api/system/dictionary";
@@ -160,6 +173,31 @@ export default defineComponent({
         }
       },
     ];
+    const HonorColumns: TableColumnsType = [
+      {
+        title: '序号',
+        align: "center",
+        key: 'honorID',
+        width: 100,
+        customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+      },
+      {
+        title: '荣誉名称',
+        dataIndex: 'honorName',
+        key: 'honorName',
+        align: "center",
+        width: 300
+      },
+      {
+        title: '获得时间',
+        dataIndex: 'getTime',
+        key: 'getTime',
+        align: "center",
+        width: 200
+      },
+    ]
+    const honorData = ref([]);
+
     // 期望月薪显示优化方法
     const showSalary = (minSalary: any, maxSalary: any) => {
       if (minSalary != null) {
@@ -185,6 +223,7 @@ export default defineComponent({
       await loadJobHuntData(id);
       await loadEducationData(id);
       await loadExperienceData(id);
+      await loadHonorData(id);
       getDataById(id, userInfo.value.userID, true).then(data => {
         jobUserInfo.dataModel = data;
         jobUserInfo.dataModel.userMobile = crtyptoHelp.decryptDesText(jobUserInfo.dataModel.userMobile);
@@ -224,6 +263,14 @@ export default defineComponent({
         jobHuntListData.value = result.list
       })
     }
+    // 加载个人荣誉
+    const loadHonorData = (id: any) => {
+      getHonorList(id).then(data => {
+        if (data) {
+          honorData.value = data;
+        }
+      })
+    }
 
     // 获取教育经历数据
     const getCultureList = async function () {
@@ -264,6 +311,8 @@ export default defineComponent({
       getCultureName,
       dayjs,
       simpleImage: Empty.PRESENTED_IMAGE_SIMPLE,
+      HonorColumns,
+      honorData,
     };
   },
   created() {

+ 94 - 7
vue/src/views/jobUserManager/jobuser/edit.vue

@@ -358,11 +358,12 @@
       <a-row :gutter="24">
         <a-col :span="24">
           <a-form-item
-            label="兴趣爱好"
+            label="个人评价"
             :label-col="{ span: 24 }"
             name="hobby"
           >
-            <a-textarea :auto-size="{ minRows: 4, maxRows: 10 }"  v-model:value="dataModel.hobby"  placeholder="兴趣爱好" :rows="4"/>
+            <a-textarea :auto-size="{ minRows: 4, maxRows: 10 }" v-model:value="dataModel.hobby" placeholder="个人评价"
+                        :rows="4"/>
           </a-form-item>
         </a-col>
       </a-row>
@@ -381,8 +382,8 @@
 
 <!--      <a-row :gutter="24">-->
 <!--        <a-col :span="16">-->
-<!--          <a-form-item label="兴趣爱好" :label-col="{ span: 3}" name="hobby" >-->
-<!--            <a-textarea v-model:value="dataModel.hobby" placeholder="兴趣爱好" :rows="2" />-->
+      <!--          <a-form-item label="个人评价" :label-col="{ span: 3}" name="hobby" >-->
+      <!--            <a-textarea v-model:value="dataModel.hobby" placeholder="个人评价" :rows="2" />-->
 <!--          </a-form-item>-->
 <!--        </a-col>-->
 <!--      </a-row>-->
@@ -521,6 +522,44 @@
           </a-table>
         </a-col>
       </a-row>
+      <a-row>
+        <a-col :span="24" style="text-align: right; margin-top: 20px; margin-right: 20px">
+          <Space>
+            <a-button @click="addHonor">
+              <template #icon>
+                <plus-circle-outlined/>
+              </template>
+              新增
+            </a-button>
+          </Space>
+        </a-col>
+      </a-row>
+      <a-divider orientation="left">个人荣誉</a-divider>
+      <a-row>
+        <a-col style="margin-bottom: 20px;">
+          <a-table :columns="HonorColumns" :data-source="honorData" :pagination="false"
+                   bordered>
+            <template #bodyCell="{ column ,index}">
+              <template v-if="column.key === 'honorName'">
+                <div>
+                  <a-input
+                    v-model:value="honorData[index][column.key]" style="width: 100%"
+                  />
+                </div>
+              </template>
+              <template v-if="column.key === 'getTime'">
+                <div>
+                  <a-date-picker v-model:value="honorData[index][column.key]"
+                                 picker="date" value-format="YYYY-MM-DD" :allow-clear="false"/>
+                </div>
+              </template>
+              <template v-if="column.key === 'honorOperation'">
+                <a-button type="link" size="small" @click="deleteHonor(index)">删除</a-button>
+              </template>
+            </template>
+          </a-table>
+        </a-col>
+      </a-row>
       <a-divider orientation="left">附件上传</a-divider>
       <b-upload-file :fileRefId="dataModel.jobUserID" :readonly="false" :multiple="true" style="width: 100%;"
                      :setFileList="setFileList" :accept="'.pdf,.png,.jpg'"></b-upload-file>
@@ -541,7 +580,7 @@ import {useTabsViewStore} from '@/store/modules/tabsView';
 import BUploadFile from '@/components/file/uploadFile.vue';
 import {get} from "@/api/common";
 import {getSysDictionaryList} from '@/api/system/dictionary';
-import {getDataById, getEducationList, getExperienceList, save} from '@/api/jobUserManager/jobuser';
+import {getDataById, getEducationList, getExperienceList, getHonorList, save} from '@/api/jobUserManager/jobuser';
 import {getSiteByID, getSiteList} from "@/api/baseSettings/siteInfo";
 import {getInfo} from "@/api/account";
 import dayjs from "dayjs";
@@ -833,7 +872,6 @@ export default defineComponent(
       const deleteExperience = (record) => {
         (experienceData.value as any[]).splice(record, 1);
       }
-
       const addExperience = () => {
         (experienceData.value as any[]).push({
           startTime: null,
@@ -843,6 +881,48 @@ export default defineComponent(
         });
       }
 
+      const HonorColumns: TableColumnsType = [
+        {
+          title: '序号',
+          align: "center",
+          key: 'honorID',
+          width: 100,
+          customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+        },
+        {
+          title: '荣誉名称',
+          dataIndex: 'honorName',
+          key: 'honorName',
+          align: "center",
+          width: 300
+        },
+        {
+          title: '获得时间',
+          dataIndex: 'getTime',
+          key: 'getTime',
+          align: "center",
+          width: 200
+        },
+        {title: '操作', key: 'honorOperation', fixed: 'right', width: 120, align: "center"},
+      ]
+      const honorData = ref([]);
+      const loadHonorData = (id: any) => {
+        getHonorList(id).then(data => {
+          if (data) {
+            honorData.value = data;
+          }
+        })
+      }
+      const deleteHonor = (record) => {
+        (honorData.value as any[]).splice(record, 1);
+      }
+      const addHonor = () => {
+        (honorData.value as any[]).push({
+          honorName: null,
+          getTime: null,
+        });
+      }
+
       const onClose = (reload: any) => {
         tabsViewStore.closeCurrentTabByPath('/jobusermgr/jobseeker/add');
         tabsViewStore.closeCurrentTabByPath('/jobusermgr/jobseeker/edit');
@@ -854,6 +934,7 @@ export default defineComponent(
         if(isAllowCommit.value){
           formState.dataModel.jobEducation = educationData.value;
           formState.dataModel.jobExperience = experienceData.value;
+          formState.dataModel.jobHonorList = honorData.value;
           let userMobile = formState.dataModel.userMobile;
           let identityNumber = formState.dataModel.identityNumber;
           formState.dataModel.userMobile = crtyptoHelp.encryptDesText(userMobile);
@@ -1023,7 +1104,12 @@ export default defineComponent(
         occupationalLevelList,
         loadLevelOccupationalCategoryList,
         occupationalChange,
-        addressChange
+        addressChange,
+        HonorColumns,
+        honorData,
+        deleteHonor,
+        addHonor,
+        loadHonorData
       }
     },
     created() {
@@ -1032,6 +1118,7 @@ export default defineComponent(
       if (id) {
         this.loadEducation(id);
         this.loadExperienceData(id);
+        this.loadHonorData(id);
       }
     }
   })

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

@@ -64,7 +64,7 @@
           <a-descriptions-item label="健康状况">{{ jobUserInfo.healthName }}</a-descriptions-item>
           <a-descriptions-item label="就业状态">{{ jobUserInfo.jobStatusName }}</a-descriptions-item>
           <a-descriptions-item label="住址">{{ jobUserInfo.address }}</a-descriptions-item>
-          <a-descriptions-item :span="2" label="兴趣爱好">{{ jobUserInfo.hobby }}</a-descriptions-item>
+          <a-descriptions-item :span="2" label="个人评价">{{ jobUserInfo.hobby }}</a-descriptions-item>
           <a-descriptions-item :span="2" label="专业技术特长">{{ jobUserInfo.personalSkills }}</a-descriptions-item>
         </a-descriptions>
         <a-divider orientation="left">教育经历</a-divider>
@@ -107,6 +107,19 @@
           </a-timeline-item>
         </a-timeline>
         <a-empty :image="simpleImage"  v-if="experienceData.length==0" ></a-empty>
+        <a-divider orientation="left">个人荣誉</a-divider>
+        <a-table :columns="HonorColumns" :data-source="honorData" bordered :pagination="false"
+                 style="margin-left: 11px">
+          <template #bodyCell="{ column, index, record}">
+            <template v-if="column.key === 'getTime'">
+              <div>
+                {{
+                  dayjs(record.getTime).format('YYYY-MM-DD')
+                }}
+              </div>
+            </template>
+          </template>
+        </a-table>
         <a-divider orientation="left">附件</a-divider>
         <b-upload-file :fileRefId="jobUserInfo.jobUserID" :readonly="true" :multiple="true" style="width: 100%;"
                        :setFileList="setFileList" :accept="'.pdf,.png,.jpg'"></b-upload-file>
@@ -117,7 +130,7 @@
 
 <script setup lang="ts">
 import {onMounted, reactive, ref} from "vue";
-import {getDataById, getEducationList, getExperienceList} from "@/api/jobUserManager/jobuser";
+import {getDataById, getEducationList, getExperienceList, getHonorList} from "@/api/jobUserManager/jobuser";
 import {ManOutlined, WomanOutlined} from '@ant-design/icons-vue';
 import type {SelectProps, TableColumnsType} from "ant-design-vue";
 import dayjs from "dayjs";
@@ -236,6 +249,31 @@ const jobHuntColumns: TableColumnsType = [
     }
   },
 ];
+const HonorColumns: TableColumnsType = [
+  {
+    title: '序号',
+    align: "center",
+    key: 'honorID',
+    width: 100,
+    customRender: item => `${searchParams.pageSize * (searchParams.pageIndex - 1) + item.index + 1}`
+  },
+  {
+    title: '荣誉名称',
+    dataIndex: 'honorName',
+    key: 'honorName',
+    align: "center",
+    width: 300
+  },
+  {
+    title: '获得时间',
+    dataIndex: 'getTime',
+    key: 'getTime',
+    align: "center",
+    width: 200
+  },
+]
+const honorData = ref([]);
+
 // 期望月薪显示优化方法
 const showSalary = (minSalary: any, maxSalary: any) => {
   if (minSalary != null) {
@@ -269,7 +307,7 @@ const loadData = (id: any) => {
 
 // 加载教育经历
 const loadEducation = (id: any) => {
-  getEducationList(id).then(data => {
+  getEducationList(id, true).then(data => {
     if (data) {
       educationData.value = data;
     }
@@ -278,13 +316,22 @@ const loadEducation = (id: any) => {
 
 // 加载工作经历
 const loadExperienceData = (id: any) => {
-  getExperienceList(id).then(data => {
+  getExperienceList(id, true).then(data => {
     if (data) {
       experienceData.value = data;
     }
   })
 }
 
+// 加载个人荣誉
+const loadHonorData = (id: any) => {
+  getHonorList(id).then(data => {
+    if (data) {
+      honorData.value = data;
+    }
+  })
+}
+
 // 加载求职意向数据
 function loadJobHuntData(jobUserID: any) {
   let params = {
@@ -325,6 +372,7 @@ onMounted(() => {
     loadEducation(id);
     loadExperienceData(id);
     loadJobHuntData(id);
+    loadHonorData(id);
   }
   getCultureList()
 })