Browse Source

手机端求职信息收集

liao-sea 11 months ago
parent
commit
96551f0070
28 changed files with 1692 additions and 246 deletions
  1. 34 0
      h5app/src/api/education/index.ts
  2. 42 0
      h5app/src/api/jobHuntInfo/index.ts
  3. 90 0
      h5app/src/api/jobUserInfo/index.ts
  4. 14 0
      h5app/src/api/siteInfo/index.ts
  5. 22 0
      h5app/src/api/system/area.ts
  6. BIN
      h5app/src/assets/icon/arrow-down-bold.png
  7. BIN
      h5app/src/assets/icon/arrow-up-bold.png
  8. 8 0
      h5app/src/router/index.ts
  9. 450 174
      h5app/src/views/pages/jobuser/edit.vue
  10. 286 0
      h5app/src/views/pages/jobuser/educationEdit.vue
  11. 302 0
      h5app/src/views/pages/jobuser/jobHuntEdit.vue
  12. 41 33
      h5app/src/views/pages/jobuser/list.vue
  13. 1 1
      src/main/java/com/hz/employmentsite/controller/baseSettings/InstitutionController.java
  14. 7 0
      src/main/java/com/hz/employmentsite/controller/baseSettings/SiteInfoController.java
  15. 48 0
      src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java
  16. 13 6
      src/main/java/com/hz/employmentsite/controller/jobUserManager/JobuserController.java
  17. 13 0
      src/main/java/com/hz/employmentsite/mapper/cquery/EductionCQuery.java
  18. 14 4
      src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteInfoImpl.java
  19. 80 0
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java
  20. 91 9
      src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobuserServiceImpl.java
  21. 3 0
      src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteInfoService.java
  22. 13 0
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/EducationService.java
  23. 3 1
      src/main/java/com/hz/employmentsite/services/service/jobUserManager/JobuserService.java
  24. 75 3
      src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java
  25. 16 0
      src/main/resources/mapping/cquery/EducationCQuery.xml
  26. 12 1
      vue/src/api/baseSettings/siteInfo.ts
  27. 7 7
      vue/src/api/jobUserManager/jobuser/index.ts
  28. 7 7
      vue/src/views/jobUserManager/jobuser/index.vue

+ 34 - 0
h5app/src/api/education/index.ts

@@ -0,0 +1,34 @@
+import {request} from '@/utils/request';
+
+export function getEducationListByJobUserID(params:any){
+    return request(
+        {
+            url: 'jobUserService/education/getListByJobUserID',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+export function getEducationByID(educationID: any) {
+    return request(
+        {
+            url: 'jobUserService/education/getById',
+            method: 'get',
+            params: {educationID:educationID},
+        },
+        { isNew: true },
+    );
+}
+
+export function saveEducation(data:any) {
+    return request(
+        {
+            url: 'jobUserService/education/save',
+            method: 'post',
+            data: data,
+        },
+        { isNew: true },
+    );
+}

+ 42 - 0
h5app/src/api/jobHuntInfo/index.ts

@@ -0,0 +1,42 @@
+import {request} from '@/utils/request';
+
+export function getJobHuntListByJobUserID(params:any){
+    return request<any>(
+        {
+            url: 'jobUserService/jobHunt/getList',
+            method: 'get',
+            params: params,
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function getJobHuntByID(jobHuntID:any){
+    return request<any>(
+        {
+            url: 'jobUserService/jobHunt/get',
+            method: 'get',
+            params: {jobHuntID:jobHuntID},
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function jobHuntSave(data: any) {
+    return request(
+        {
+            url: "jobUserService/jobHunt/save",
+            method: 'post',
+            data: data
+        },
+        {
+            isNew: true,
+            errorMsg: '提交失败!'
+        },
+    );
+}
+

+ 90 - 0
h5app/src/api/jobUserInfo/index.ts

@@ -0,0 +1,90 @@
+import {request} from '@/utils/request';
+
+export function getList(params: any) {
+    return request(
+        {
+            url: 'jobUserService/jobUser/getList',
+            method: 'get',
+            params: params,
+        },
+        { isNew: true },
+    );
+}
+
+export function getJobUserDataList(){
+    return request<any>(
+        {
+            url: 'jobUserService/jobUser/getDataList',
+            method: 'get',
+            params: null,
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function getDataById(id: any) {
+    return request(
+        {
+            url: 'jobUserService/jobUser/getDataById',
+            method: 'get',
+            params: {id},
+        },
+        { isNew: true },
+    );
+}
+
+export function baseInfoSave(data: any) {
+    return request(
+        {
+            url: "jobUserService/jobUser/baseInfoSave",
+            method: 'post',
+            data: data
+        },
+        {
+            isNew: true,
+            errorMsg: '提交失败!'
+        },
+    );
+}
+
+export function del(data: any) {
+    return request({
+            url: 'jobUserService/jobUser/delete',
+            method: 'post',
+            data: data
+        },
+        {
+            isNew: true,
+            successMsg: '删除成功!',
+            errorMsg: '删除失败!'
+        }
+    )
+}
+
+export function getEducationList(id: any) {
+    return request(
+        {
+            url: "jobUserService/jobUser/getEducationList",
+            method: 'get',
+            params: {id},
+        },
+        {
+            isNew: true,
+        },
+    );
+}
+
+export function getExperienceList(id: any) {
+    return request(
+        {
+            url: "jobUserService/jobUser/getExperienceList",
+            method: 'get',
+            params: {id},
+        },
+        {
+            isNew: true,
+        },
+    );
+}

+ 14 - 0
h5app/src/api/siteInfo/index.ts

@@ -0,0 +1,14 @@
+import {request} from '@/utils/request';
+
+export function getSiteDataList(){
+    return request<any>(
+        {
+            url: 'siteInfo/getDataList',
+            method: 'get',
+            params: null,
+        },
+        {
+            isNew: true,
+        },
+    );
+}

+ 22 - 0
h5app/src/api/system/area.ts

@@ -0,0 +1,22 @@
+import {request} from '@/utils/request';
+
+export function getRegionCodeList() {
+    return request<any>({
+        url: 'system/area/getCityList',
+        method: 'get',
+        params: {},
+    }, {
+        isNew: true,
+    });
+}
+
+export function getStreetCodeList(code:string) {
+    return request<any>({
+        url: 'system/area/getAreaList',
+        method: 'get',
+        params: {code:code},
+    }, {
+        isNew: true,
+    });
+}
+

BIN
h5app/src/assets/icon/arrow-down-bold.png


BIN
h5app/src/assets/icon/arrow-up-bold.png


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

@@ -32,6 +32,14 @@ const routes: Array<RouteRecordRaw> = [
                 path: 'tabMain/jobuser/edit',
                 component: () => import('@/views/pages/jobuser/edit.vue')
             },
+            {
+                path: 'tabMain/jobuser/educationEdit',
+                component: () => import('@/views/pages/jobuser/educationEdit.vue')
+            },
+            {
+                path: 'tabMain/jobuser/jobHuntEdit',
+                component: () => import('@/views/pages/jobuser/jobHuntEdit.vue')
+            },
             {
                 path: 'tabMain/company/list',
                 component: () => import('@/views/pages/company/list.vue')

+ 450 - 174
h5app/src/views/pages/jobuser/edit.vue

@@ -1,9 +1,9 @@
 <template>
   <ion-page>
-    <ion-header class="header-theme2">
+    <ion-header>
       <ion-toolbar>
         <ion-buttons slot="start">
-          <ion-icon :icon="arrowBackOutline" @click="()=>router.push('./list')"></ion-icon>
+          <ion-icon :icon="arrowBackOutline" @click="onCancel" style="padding-left:10px;width:24px;height:24px;"></ion-icon>
         </ion-buttons>
         <ion-title>求职信息录入</ion-title>
       </ion-toolbar>
@@ -11,200 +11,336 @@
     <ion-content>
       <div class="stepFlex">
         <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
-          <div
-              :class="[(record.val < dataModel?.statusVal || dataModel?.statusVal==stepList[stepList.length-1].val) ? 'greenCircle' :record.val == dataModel?.statusVal ? 'now' : 'greyCircle']"></div>
-          <div v-if="key !== stepList.length - 1"
-               :class="[record.val < dataModel?.statusVal ? 'greenline' : 'greyline']"></div>
+          <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">{{ record.title }}</p>
-            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
+            <p class="stepFlex-item-label-desc"> {{ record.desc }}</p>
           </div>
         </div>
       </div>
-      <form autocomplete="off">
-        <ion-list>
-          <ion-item>
-            <ion-input label="姓名" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="公民身份号码" label-placement="stacked" :clear-input="true"
-                       >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="性别" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="民族" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="政治面貌" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="出生地" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="出生日期" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="户口性质" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="文化程度" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="健康状况" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="血型" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="身高" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="视力" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="体重" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="婚姻状况" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="省份" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="市/县" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="镇/街" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="联系人" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="联系电话" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="地址" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="家庭住址" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="电子邮箱" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="兴趣爱好" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="就业状态" label-placement="stacked" :clear-input="true" >
-            </ion-input>
-          </ion-item>
-          <ion-item>
-            <ion-input label="重点人员类别" label-placement="stacked" :clear-input="true"
-                       >
-            </ion-input>
+      <form ref="editForm" @submit.prevent="onSave">
+        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==1">
+          <ion-item-divider  style="height: 20px;">
+            <ion-badge slot="start">l</ion-badge>
+            <ion-label>
+              基本信息
+            </ion-label>
+          </ion-item-divider>
+          <ion-item-group>
+            <ion-item :class="[baseDataValid.baseData.name.$error?'ion-invalid':'ion-valid']">
+              <ion-label>姓名<span class="danger">*</span></ion-label>
+              <ion-input name="name" id="name"  placeholder="请输入姓名" v-model="baseData.name" ></ion-input>
+              <ion-note slot="error">姓名不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.identityNumber.$error?'ion-invalid':'ion-valid']">
+              <ion-label>公民身份号码<span class="danger">*</span></ion-label>
+              <ion-input name="identityNumber" id="identityNumber"  placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
+              <ion-note slot="error">公民身份号码不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.sex.$error?'ion-invalid':'ion-valid']">
+              <ion-label>性别<span class="danger">*</span></ion-label>
+              <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
+                          interface="action-sheet" placeholder="请选择性别" >
+                <ion-select-option v-for=" (it,key) in genderList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">性别不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.jobStatusID.$error?'ion-invalid':'ion-valid']">
+              <ion-label>就业状态<span class="danger">*</span></ion-label>
+              <ion-select name="jobStatusID"  id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
+                          interface="action-sheet" placeholder="请选择就业状态" >
+                <ion-select-option v-for=" (it,key) in jobUserStatusList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">就业状态不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.keyPersonTypeID.$error?'ion-invalid':'ion-valid']">
+              <ion-label>重点人员类别<span class="danger">*</span></ion-label>
+              <ion-select name="keyPersonTypeID"  id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
+                          interface="action-sheet" placeholder="请选择重点人员类别" >
+                <ion-select-option v-for=" (it,key) in keyPersonTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">重点人员类别不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.userMobile.$error?'ion-invalid':'ion-valid']">
+              <ion-label>联系电话<span class="danger">*</span></ion-label>
+              <ion-input name="userMobile" id="userMobile"  placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
+              <ion-note slot="error">联系电话不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[baseDataValid.baseData.birthPlace.$error?'ion-invalid':'ion-valid']">
+              <ion-label>地址<span class="danger">*</span></ion-label>
+              <ion-input name="birthPlace" id="birthPlace"  placeholder="请输入地址" v-model="baseData.birthPlace" ></ion-input>
+              <ion-note slot="error">地址不能为空</ion-note>
+            </ion-item>
+            <!-- :class="[baseDataValid.dataModel.siteID.$error?'ion-invalid':'ion-valid']"  -->
+            <ion-item  >
+              <ion-label>所属驿站<span class="danger">*</span></ion-label>
+              <ion-select name="siteID"  id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
+                          interface="action-sheet" placeholder="请选择所属驿站" >
+                <ion-select-option v-for=" (it,key) in siteInfoList" :key="key" :value="it.value">
+                  {{ it.text }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">所属驿站不能为空</ion-note>
+            </ion-item>
+          </ion-item-group>
+          <ion-item-divider style="height: 20px;" >
+            <ion-badge slot="start">l</ion-badge>
+            <ion-label>
+              其他信息
+            </ion-label>
+            <ion-avatar aria-hidden="true" slot="end" style="padding-top:5px;">
+              <img alt="" src="@/assets/icon/arrow-up-bold.png" style="width:32px;height:32px;"  @click="expandChange" v-if="!expand"/>
+              <img alt="" src="@/assets/icon/arrow-down-bold.png" style="width:32px;height:32px;" @click="expandChange" v-if="expand"/>
+            </ion-avatar>
+          </ion-item-divider>
+          <ion-item-group v-if="expand">
+            <ion-item>
+              <ion-label>文化程度<span class="danger">*</span></ion-label>
+              <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="baseData.cultureRank"
+                          interface="action-sheet" placeholder="请选择文化程度" >
+                <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>健康状况</ion-label>
+              <ion-select name="healthID"  id="healthID" okText="确定" cancelText="取消" v-model="baseData.healthID"
+                          interface="action-sheet" placeholder="请选择健康状况" >
+                <ion-select-option v-for=" (it,key) in userHealthList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>血型</ion-label>
+              <ion-select name="bloodTypeID"  id="bloodTypeID" okText="确定" cancelText="取消" v-model="baseData.bloodTypeID"
+                          interface="action-sheet" placeholder="请选择血型" >
+                <ion-select-option v-for=" (it,key) in bloodTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>身高</ion-label>
+              <ion-input name="height" id="height"  placeholder="请输入身高" v-model="baseData.height" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>视力</ion-label>
+              <ion-input name="vision" id="vision"  placeholder="请输入视力" v-model="baseData.vision" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>体重</ion-label>
+              <ion-input name="weight" id="weight"  placeholder="请输入体重" v-model="baseData.weight" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>婚姻状况</ion-label>
+              <ion-select name="maritalStatusID"  id="maritalStatusID" okText="确定" cancelText="取消" v-model="baseData.maritalStatusID"
+                          interface="action-sheet" placeholder="请选择婚姻状况" >
+                <ion-select-option v-for=" (it,key) in maritalStatusList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>省份</ion-label>
+              <ion-select name="provinceCode"  id="provinceCode" okText="确定" cancelText="取消" v-model="baseData.provinceCode"
+                          interface="action-sheet" placeholder="请选择省份" @change="provinceChange()" >
+                <ion-select-option v-for=" (it,key) in provinceList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>市/县</ion-label>
+              <ion-select name="regionCode"  id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
+                          interface="action-sheet" placeholder="请选择市/县"  @ionChange="regionChange()" >
+                <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>镇/街</ion-label>
+              <ion-select name="streetCode"  id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"
+                          interface="action-sheet" placeholder="请选择镇/街" >
+                <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </ion-item>
+            <ion-item>
+              <ion-label>联系人</ion-label>
+              <ion-input name="userName" id="userName"  placeholder="请输入联系人姓名" v-model="baseData.userName" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>家庭住址</ion-label>
+              <ion-input name="familyAddress" id="familyAddress"  placeholder="请输入家庭住址" v-model="baseData.familyAddress" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>电子邮箱</ion-label>
+              <ion-input name="email" id="email"  placeholder="请输入电子邮箱" v-model="baseData.email" ></ion-input>
+            </ion-item>
+            <ion-item>
+              <ion-label>兴趣爱好</ion-label>
+              <ion-input name="hobby" id="hobby"  placeholder="请输入兴趣爱好" v-model="baseData.hobby" ></ion-input>
+            </ion-item>
+          </ion-item-group>
+        </ion-list>
+        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==2">
+            <ion-item-divider  style="height: 20px;" >
+            <ion-badge slot="start">l</ion-badge>
+            <ion-label>
+              教育经历
+            </ion-label>
+            <ion-buttons slot="end">
+              <ion-icon :icon="addCircleOutline" @click="onPathForward('./educationEdit',null,null,2)"></ion-icon>
+            </ion-buttons>
+          </ion-item-divider>
+            <ion-item v-for="(record,key) in educationList" :key="key" >
+              <ion-label>
+                <h3>{{record.schoolName}}</h3>
+                <p>{{record.schoolTime}}至{{record.overTime}}</p>
+              </ion-label>
+              <img alt="" src="@/assets/icon/forward.png" style="width:32px;height:32px;"
+                   @click="onPathForward('./educationEdit',record.educationID,null,2)"  />
+            </ion-item>
+        </ion-list>
+        <ion-list class="canvasWrapper"  v-if="curStepData.statusVal==3">
+          <ion-item-divider  style="height: 20px;">
+            <ion-badge slot="start">l</ion-badge>
+            <ion-label>
+              求职意向
+            </ion-label>
+            <ion-buttons slot="end">
+              <ion-icon :icon="addCircleOutline" @click="onPathForward('./jobHuntEdit',null,null,3)"></ion-icon>
+            </ion-buttons>
+          </ion-item-divider>
+          <ion-item v-for="(record,key) in jobHuntList" :key="key" >
+            <ion-label>
+              <h3>{{record.jobUserType}}</h3>
+              <p>期望薪资:{{record.salary}}</p>
+            </ion-label>
+            <img alt="" src="@/assets/icon/forward.png" style="width:32px;height:32px;"
+                 @click="onPathForward( './jobHuntEdit',null,record.jobHuntID,3)"  />
           </ion-item>
         </ion-list>
-        <ion-button class="next-btn">下一步
-        </ion-button>
+
+        <ion-button class="next-btn" type="submit" v-if="curStepData.statusVal!=3">下一步</ion-button>
+        <ion-button class="next-btn" @click="onCancel" v-if="curStepData.statusVal==3">完  成</ion-button>
       </form>
     </ion-content>
-    <!--    <ion-footer>
-          <div>
-            <ion-button @click="onSave">下一步</ion-button>
-          </div>
-        </ion-footer>-->
   </ion-page>
 </template>
 <script lang="ts">
-import {defineComponent, ref, watch} from "vue";
-/*import {getPracticeBaseForStudentList,getSysAreaList} from "@/api/system/dictionary";
-import {get, save} from "@/api/practice/intention";*/
+import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
+import {reactive,defineComponent, computed,watch,ref,toRefs} from "vue";
 import {useRoute, useRouter} from "vue-router";
-import {alertController, onIonViewDidEnter} from "@ionic/vue";
-import {arrowBackOutline} from 'ionicons/icons';
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {getDataById, baseInfoSave, getEducationList} from "@/api/jobUserInfo";
+import {getEducationListByJobUserID} from "@/api/education";
+import {getRegionCodeList, getStreetCodeList} from "@/api/system/area";
+import {getSiteDataList} from "@/api/siteInfo";
+import {getJobHuntListByJobUserID,jobHuntSave} from "@/api/jobHuntInfo";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {alertController} from "@ionic/vue";
 
-interface DataModel {
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
   name: string,
   statusVal: number
 }
-
 export default defineComponent({
-  name: 'PracticeIntentionEdit',
+  name: 'jobUserEdit',
   setup() {
     const router = useRouter();
     const route = useRoute();
-    const dataModel = ref<DataModel>({
-      name: '',
+    const editForm = ref();
+    const expand = ref<boolean>(false);
+    const siteInfoList = ref<SelectProps[]>([]);
+    const curStepData = ref<StepParams>({
+      name:"",
       statusVal: 1
     });
-    const stepList = ref([{title: '基础信息', desc: '个人基础信息', val: 1}, {
-      title: '教育经历',
-      desc: '完事个人教育经历',
-      val: 2
-    }, {title: '求职意向', desc: '个人求职意向', val: 3}]);
-
-    const onSave = () => {
-      if (!dataModel.value.name) {
-        presentAlert("请填写姓名!");
-        return false;
-      }
-
-      /*save(dataModel.value as any).then(result => {
-        if (result) {
-          router.push({path: './index', query: {reload: 1}});
-        }
-      });*/
-    }
+    const stepList = ref([
+        {title: '基础信息', desc: '个人基础信息', val: 1},
+        {title: '教育经历', desc: '完善个人教育经历',val: 2},
+        {title: '求职意向', desc: '个人求职意向', val: 3}
+    ]);
+    const genderList = ref<SelectProps[]>([]);
+    const jobUserStatusList = ref<SelectProps[]>([]);
+    const keyPersonTypeList = ref<SelectProps[]>([]);
+    const cultureRankList = ref<SelectProps[]>([]);
+    const userHealthList = ref<SelectProps[]>([]);
+    const bloodTypeList  = ref<SelectProps[]>([]);
+    const maritalStatusList  = ref<SelectProps[]>([]);
+    const provinceList  = ref([{code:'01',name:'广东省'}]);
+    const regionList  = ref<SelectProps[]>([]);
+    const streetList  = ref<SelectProps[]>([]);
 
-    const onCancel = () => {
-      router.push("./index");
-    }
+    const educationList = ref<SelectProps[]>([]);
+    const jobHuntList = ref<SelectProps[]>([]);
 
-    const loadData = (practiceTaskStudentID: any) => {
-      /*get(practiceTaskStudentID).then((result: any) => {
-        dataModel.value = result;
+    const baseInfoData = reactive({baseData:{
 
-        loadPracticeBaseList(dataModel.value.schoolYearID);
-        loadCityList();
-      });*/
-    };
+        jobUserID:null,
+        name:null,
+        identityNumber: null,
+        sex: null,
+        userMobile: null,
+        birthPlace: null,
+        siteID:null,
+        jobStatusID: null,
+        keyPersonTypeID: null,
+        cultureRank:null,
+        healthID:null,
+        boolTypeID:null,
+        height:null,
+        vision:null,
+        weight:null,
+        maritalStatusID:null,
+        provinceCode:null,
+        regionCode:null,
+        streetCode:null,
+        userName:null,
+        familyAddress:null,
+        postalCode:null,
+        email:null,
+        hobby:null,
+        personalSkills:null,
+      }});
 
-    const initData = (id: any) => {
-      dataModel.value = {name: '',statusVal:1};
-      loadData(id);
-    };
-
-    onIonViewDidEnter(() => {
-      if (route.query.reload)
-        initData(route.query.id);
+    const pageParams = reactive({
+      pageIndex: 1,
+      pageSize: 10,
+      jobUserID:''
     });
+    const baseDataRule = computed(()=>{
+      return {baseData:{
+          name:{required},
+          identityNumber:{required},
+          sex:{required},
+          userMobile:{required},
+          birthPlace:{required},
+          jobStatusID:{required},
+          keyPersonTypeID:{required},
+        }}});
 
+    const baseDataValid = useVuelidate(baseDataRule,baseInfoData);
+    const expandChange= ()=>{
+      expand.value = !expand.value;
+    }
     const presentAlert = async (message: string) => {
       const alert = await alertController.create({
         header: '错误!',
@@ -217,20 +353,160 @@ export default defineComponent({
       await alert.present();
     }
 
+    const onSave = async function (){
+      if (curStepData.value.statusVal==1){
+        const isFormCorrect = await baseDataValid.value.$validate();
+        if(!isFormCorrect){
+          await presentAlert("请填写完整的信息!");
+          return null;
+        }
+        baseInfoSave(baseInfoData.baseData).then(result => {
+          if (result) {
+            router.push({path: './edit', query: {jobUserID: baseInfoData.baseData.jobUserID,status:2}});
+          }
+        });
+      }
+      else if(curStepData.value.statusVal==2){
+         router.push({path: './edit', query: {jobUserID: baseInfoData.baseData.jobUserID,status:3}});
+      }
+    }
+
+    const onPathForward = (pathValue:string,educationIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
+      router.push({path: pathValue, query: {educationID:educationIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue}});
+    }
+
+
+    const onCancel = () => {
+      router.push("./list");
+    }
+    const getSiteInfoList = async function(){
+      const siteInfoResult :any = await getSiteDataList();
+      siteInfoList.value = siteInfoResult;
+    }
+    const getGenderList = async function(){
+      const data :any = await getSysDictionaryList("Gender");
+      genderList.value = data;
+    }
+    const getJobUserStatusList = async function() {
+      const data :any = await getSysDictionaryList("JobStatus");
+      jobUserStatusList.value = data;
+    }
+    const getKeyPersonTypeList = async function() {
+      const data :any = await getSysDictionaryList("KeyPersonType");
+      keyPersonTypeList.value = data;
+    }
+    const getCultureRankList = async function(){
+      const data :any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = data;
+    }
+    const getHealthTypeList = async function(){
+      const data :any = await getSysDictionaryList("Health");
+      userHealthList.value = data;
+    }
+    const getBloodTypeList = async function(){
+      const data :any = await getSysDictionaryList("BloodType");
+      bloodTypeList.value = data;
+    }
+    const getMaritalStatusList = async function(){
+      const data :any = await getSysDictionaryList("MaritalStatus");
+      maritalStatusList.value = data;
+    }
+    const getRegionList = async function(){
+      const regionResult: any = await getRegionCodeList();
+      regionList.value = regionResult;
+    }
+    const getStreetList = async function(){
+      if (baseInfoData.baseData.regionCode != null){
+        const streetResult: any = await getStreetCodeList(baseInfoData.baseData.regionCode);
+        streetList.value = streetResult;
+      }
+    }
+    const regionChange = async function(){
+      baseInfoData.baseData.streetCode = null;
+      await getStreetList();
+    }
+    const provinceChange = async function(){
+      baseInfoData.baseData.regionCode = null;
+      await getRegionList();
+      await regionChange();
+    }
+
+
+    const loadData = async (jobUserID: any,status:any) => {
+      pageParams.jobUserID = jobUserID;
+      curStepData.value.statusVal = status;
+      if(curStepData.value.statusVal==1){
+        await getSiteInfoList();
+        await getGenderList();
+        await getJobUserStatusList();
+        await getKeyPersonTypeList();
+        await getCultureRankList();
+        await getHealthTypeList();
+        await getBloodTypeList();
+        await getMaritalStatusList();
+        await getRegionList();
+        await getStreetList();
+        const reqData = await getDataById(jobUserID);
+        baseInfoData.baseData = reqData;
+        console.log('baseData',baseInfoData.baseData);
+      }
+      else if(curStepData.value.statusVal==2){
+        const data :any = await getEducationListByJobUserID(pageParams);
+        educationList.value = data.list;
+      }
+      else if(curStepData.value.statusVal==3){
+        const reqData = await getJobHuntListByJobUserID(pageParams);
+        jobHuntList.value= reqData.list;
+      }
+    };
+
+    watch(() => route.query, () => {
+      if (route.query) {
+        loadData(route.query.id,route.query.status);
+      }
+    });
+
     return {
-      dataModel,
+      ...toRefs(baseInfoData),
+      arrowBackOutline,
+      addCircleOutline,
+      editForm,
+      expand,
+      curStepData,
       stepList,
-      initData,
+      siteInfoList,
+      genderList,
+      pageParams,
+      jobUserStatusList,
+      keyPersonTypeList,
+      cultureRankList,
+      userHealthList,
+      bloodTypeList,
+      maritalStatusList,
+      provinceList,
+      regionList,
+      streetList,
+      educationList,
+      jobHuntList,
+      expandChange,
+      provinceChange,
+      regionChange,
       onSave,
       onCancel,
+      onPathForward,
+      loadData,
       route,
-      arrowBackOutline,
       router,
+      baseDataValid,
     }
+  },
+  mounted(){
+    const jobUserID = this.route.query.jobUserID;
+    const status = this.route.query.status;
+    this.loadData(jobUserID,status);
   }
 });
 </script>
-
 <style lang="less">
 .next-btn {
   width: 100%;
@@ -289,7 +565,7 @@ export default defineComponent({
     border: 4px solid #c5e8f9;
   }
 
-  .greyCircle {
+  .grayCircle {
     top: calc(50% - 15px);
     left: calc(50% - 4px);
     position: absolute;
@@ -300,7 +576,7 @@ export default defineComponent({
     background-color: #ccc;
   }
 
-  .greenline {
+  .greenLine {
     width: 100%;
     top: calc(50% - 11px);
     left: calc(50% - 2px);
@@ -309,7 +585,7 @@ export default defineComponent({
     position: absolute;
   }
 
-  .greyline {
+  .grayLine {
     height: 0;
     border: 1px dashed #ccc;
     width: 100%;

+ 286 - 0
h5app/src/views/pages/jobuser/educationEdit.vue

@@ -0,0 +1,286 @@
+<template>
+  <ion-page>
+    <ion-header>
+      <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' : 'greyCircle']"></div>
+          <div v-if="key !== stepList.length - 1"
+               :class="[record.val < curStepData?.statusVal ? 'greenline' : 'greyline']"></div>
+          <div class="stepFlex-item-label">
+            <p class="stepFlex-item-label-title">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
+          </div>
+        </div>
+      </div>
+      <form ref="editForm" @submit.prevent="onSave">
+        <ion-list class="canvasWrapper" >
+          <ion-item-group>
+            <ion-item :class="[v$.dataModel.schoolName.$error?'ion-invalid':'ion-valid']">
+              <ion-label>毕业院校/培训机构<span class="danger">*</span></ion-label>
+              <ion-input name="schoolName" id="schoolName"  placeholder="请输入毕业院校/培训机构" v-model="dataModel.schoolName" ></ion-input>
+              <ion-note slot="error">毕业院校/培训机构不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[v$.dataModel.cultureRank.$error?'ion-invalid':'ion-valid']">
+              <ion-label>最高学历<span class="danger">*</span></ion-label>
+              <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="dataModel.cultureRank"
+                          interface="action-sheet" placeholder="请选择最高学历" >
+                <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">最高学历不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[v$.dataModel.major.$error?'ion-invalid':'ion-valid']">
+              <ion-label>专业<span class="danger">*</span></ion-label>
+              <ion-input name="major" id="major"  placeholder="请输入专业" v-model="dataModel.major" ></ion-input>
+              <ion-note slot="error">专业不能为空</ion-note>
+            </ion-item>
+            <ion-item mode="md">
+              <ion-label>日期<span class="danger">*</span></ion-label>
+              <ion-datetime-button datetime="schoolTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="schoolTime" placeholder="日期"
+                              v-model="dataModel.schoolTime"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+              <ion-datetime-button datetime="overTime"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime id="overTime" placeholder="日期"
+                              v-model="dataModel.overTime"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+            </ion-item>
+          </ion-item-group>
+        </ion-list>
+        <ion-button class="next-btn" type="submit" >保  存</ion-button>
+      </form>
+    </ion-content>
+  </ion-page>
+</template>
+<script lang="ts">
+import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
+import {reactive,defineComponent, computed,watch,ref,toRefs} from "vue";
+import {useRoute,useRouter} from "vue-router";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {getEducationByID,saveEducation} from "@/api/education";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {alertController} from "@ionic/vue";
+
+interface educationModel {
+  dataModel: any;
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  name: string,
+  statusVal: number
+}
+export default defineComponent({
+  name: 'educationEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      name:"",
+      statusVal: 2
+    });
+    const stepList = ref([{title: '基础信息', desc: '个人基础信息', val: 1}, {
+      title: '教育经历',
+      desc: '完事个人教育经历',
+      val: 2
+    }, {title: '求职意向', desc: '个人求职意向', val: 3}]);
+    const cultureRankList = ref<SelectProps[]>([]);
+    const educationList = ref<SelectProps[]>([]);
+    const educationData = reactive<educationModel>({ dataModel:{
+        jobuserID:null,
+        schoolName:null,
+        cultureRank:null,
+        major:null,
+        schoolTime:null,
+        overTime:null,
+    }});
+    const rules = computed(()=>{
+      return {dataModel:{
+          schoolName:{required},
+          cultureRank:{required},
+          major:{required},
+          schoolTime:{required},
+          overTime:{required},
+        }}});
+    const v$ = useVuelidate(rules,educationData);
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await v$.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前dataModel数据",educationData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveEducation(educationData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './edit', query: {jobUserID: educationData.dataModel.jobuserID,status:2}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './edit', query: {jobUserID: educationData.dataModel.jobuserID,status:2}});
+    }
+
+    const getCultureRankList = async function(){
+      const data :any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = data;
+    }
+
+    const loadData = async (educationID: any,jobUserID:any,status:any) => {
+      await getCultureRankList();
+      const reqData = await getEducationByID(educationID);
+      curStepData.value.statusVal = status;
+      educationData.dataModel = reqData;
+      educationData.dataModel.jobuserID = jobUserID;
+      console.log("初始化dataModel",educationData.dataModel);
+    };
+
+
+    return {
+      ...toRefs(educationData),
+      arrowBackOutline,
+      addCircleOutline,
+      editForm,
+      curStepData,
+      stepList,
+      educationList,
+      cultureRankList,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      v$
+    }
+  },
+  mounted(){
+    const educationID = this.route.query.educationID;
+    const jobUserID = this.route.query.jobUserID;
+    const status = this.route.query.status;
+    this.loadData(educationID,jobUserID,status);
+  }
+});
+</script>
+<style lang="less">
+.next-btn {
+  width: 100%;
+  --border-radius: 0px;
+  --background: #f2f2f5;
+  margin: 20px 0 0 0;
+  color: #363432;
+  font-size: 14px;
+}
+
+.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;
+  }
+
+  .greyCircle {
+    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;
+  }
+
+  .greyline {
+    height: 0;
+    border: 1px dashed #ccc;
+    width: 100%;
+    top: calc(50% - 11px);
+    left: calc(50% - 2px);
+    position: absolute;
+  }
+}
+
+</style>

+ 302 - 0
h5app/src/views/pages/jobuser/jobHuntEdit.vue

@@ -0,0 +1,302 @@
+<template>
+  <ion-page>
+    <ion-header>
+      <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">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
+          </div>
+        </div>
+      </div>
+      <form ref="editForm" @submit.prevent="onSave">
+        <ion-list class="canvasWrapper" >
+          <ion-item-divider  style="height: 20px;">
+            <ion-badge slot="start">l</ion-badge>
+            <ion-label>
+              求职意向
+            </ion-label>
+          </ion-item-divider>
+          <ion-item-group>
+            <ion-item :class="[huntDataValid.dataModel.workName.$error?'ion-invalid':'ion-valid']">
+              <ion-label>工种名称<span class="danger">*</span></ion-label>
+              <ion-input name="workName" id="workName"  placeholder="请输入工种名称" v-model="dataModel.workName" ></ion-input>
+              <ion-note slot="error">工种名称不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[huntDataValid.dataModel.ucHuntType.$error?'ion-invalid':'ion-valid']">
+              <ion-label>求职类型<span class="danger">*</span></ion-label>
+              <ion-select name="ucHuntType"  id="ucHuntType" okText="确定" cancelText="取消" v-model="dataModel.ucHuntType"
+                          interface="action-sheet" placeholder="请选择求职类型" >
+                <ion-select-option v-for=" (it,key) in jobHuntTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">求职类型不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[huntDataValid.dataModel.abilityType.$error?'ion-invalid':'ion-valid']">
+              <ion-label>人才类型<span class="danger">*</span></ion-label>
+              <ion-select name="abilityType"  id="abilityType" okText="确定" cancelText="取消" v-model="dataModel.abilityType"
+                          interface="action-sheet" placeholder="请选择人才类型" >
+                <ion-select-option v-for=" (it,key) in jobUserTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+              <ion-note slot="error">人才类型不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[huntDataValid.dataModel.maxSalary.$error||huntDataValid.dataModel.minSalary.$error?'ion-invalid':'ion-valid']">
+              <ion-label>月薪要求<span class="danger">*</span></ion-label>
+              <ion-input name="minSalary" id="minSalary"  placeholder="请输入最低薪资" v-model="dataModel.minSalary" ></ion-input>
+              <ion-input name="maxSalary" id="maxSalary"  placeholder="请输入最高薪资" v-model="dataModel.maxSalary" ></ion-input>
+              <ion-note slot="error">月薪要求不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[huntDataValid.dataModel.workYear.$error?'ion-invalid':'ion-valid']">
+              <ion-label>工作年限<span class="danger">*</span></ion-label>
+              <ion-input name="workYear" id="workYear"  placeholder="请输入工作年限" v-model="dataModel.workYear" ></ion-input>
+              <ion-note slot="error">工作年限不能为空</ion-note>
+            </ion-item>
+            <ion-item :class="[huntDataValid.dataModel.areaWork.$error?'ion-invalid':'ion-valid']">
+              <ion-label>期望工作地区<span class="danger">*</span></ion-label>
+              <ion-input name="areaWork" id="areaWork"  placeholder="请输入期望工作地区" v-model="dataModel.areaWork" style="display: inline;" ></ion-input>
+              <ion-note slot="error">期望工作地区不能为空</ion-note>
+            </ion-item>
+          </ion-item-group>
+        </ion-list>
+        <ion-button class="next-btn" type="submit" >保  存</ion-button>
+      </form>
+    </ion-content>
+  </ion-page>
+</template>
+<script lang="ts">
+import {arrowBackOutline,addCircleOutline} from 'ionicons/icons';
+import {reactive,defineComponent, computed,ref,toRefs} from "vue";
+import {useRoute,useRouter} from "vue-router";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {getJobHuntByID,jobHuntSave} from "@/api/jobHuntInfo";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {alertController} from "@ionic/vue";
+
+interface huntModel {
+  dataModel: any;
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  name: string,
+  statusVal: number
+}
+export default defineComponent({
+  name: 'jobHuntEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      name:"",
+      statusVal: 2
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完事个人教育经历',val: 2},
+      {title: '求职意向', desc: '个人求职意向', val: 3}]);
+    const jobHuntTypeList = ref<SelectProps[]>([]);
+    const jobUserTypeList =ref<SelectProps[]>([]);
+    const jobHuntData = reactive<huntModel>({dataModel:{
+        jobUserID:null,
+        workName:null,
+        ucHuntType:null,
+        abilityType:null,
+        minSalary:null,
+        maxSalary:null,
+        workYear:null,
+        areaWork:null,
+      }});
+    const huntDataRule = computed(()=>{
+      return {dataModel:{
+          workName:{required},
+          ucHuntType:{required},
+          abilityType:{required},
+          minSalary:{required},
+          maxSalary:{required},
+          workYear:{required},
+          areaWork:{required},
+        }}});
+    const huntDataValid = useVuelidate(huntDataRule,jobHuntData);
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+    const getJobHuntTypeList = async function(){
+      const data :any = await getSysDictionaryList("JobHuntType");
+      jobHuntTypeList.value = data;
+    }
+    const getJobUserTypeList = async function(){
+      const data :any = await getSysDictionaryList("JobUserType");
+      jobUserTypeList.value = data;
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await huntDataValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前dataModel数据",jobHuntData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      jobHuntSave(jobHuntData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './edit', query: {jobUserID: jobHuntData.dataModel.jobUserID,status:3}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './edit', query: {jobUserID: jobHuntData.dataModel.jobUserID,status:3}});
+    }
+
+
+    const loadData = async (jobHuntID: any,jobUserID:any,status:any) => {
+      await getJobHuntTypeList();
+      await getJobUserTypeList();
+      const reqData = await getJobHuntByID(jobHuntID);
+      curStepData.value.statusVal = status;
+      jobHuntData.dataModel = reqData;
+      jobHuntData.dataModel.jobUserID = jobUserID;
+      console.log("初始化dataModel ",jobHuntData.dataModel);
+    };
+
+
+    return {
+      ...toRefs(jobHuntData),
+      arrowBackOutline,
+      addCircleOutline,
+      editForm,
+      curStepData,
+      stepList,
+      jobUserTypeList,
+      jobHuntTypeList,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      huntDataValid
+    }
+  },
+  mounted(){
+    const jobHuntID = this.route.query.jobHuntID;
+    const jobUserID = this.route.query.jobUserID;
+    const status = this.route.query.status;
+    this.loadData(jobHuntID,jobUserID,status);
+  }
+});
+</script>
+<style lang="less">
+.next-btn {
+  width: 100%;
+  --border-radius: 0px;
+  --background: #f2f2f5;
+  margin: 20px 0 0 0;
+  color: #363432;
+  font-size: 14px;
+}
+
+.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;
+  }
+}
+
+</style>

+ 41 - 33
h5app/src/views/pages/jobuser/list.vue

@@ -16,18 +16,19 @@
         <ion-input style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;"></ion-input>
         <ion-button slot="end" style="height: 33px;width: 70px;margin-left: 10px;--box-shadow: none;--border-radius: 14px;">搜索</ion-button>
       </ion-item>
-      <ion-list  class="list-content">
-        <ion-item v-for="(record,key) in dataList" :key="key"  detail>
+      <ion-list  class="list-content" >
+        <ion-item v-for="(record,key) in dataList" :key="key">
           <ion-avatar aria-hidden="true" slot="start">
             <img alt="" src="@/assets/icon/avatar.svg" />
           </ion-avatar>
           <ion-label>
-            <h3>{{ record.userName }}</h3>
-            <p>已推荐岗位:{{record.postRecommendCount}}</p>
+            <h3>{{ record.name }}</h3>
+            <p>已推荐岗位:{{formState.total}}</p>
           </ion-label>
+          <img alt="" src="@/assets/icon/forward.png" style="width:32px;height:32px;"  @click="onDetail(record.jobUserID)"  />
         </ion-item>
       </ion-list>
-      <b-empty v-if="dataList.length<=0" :loading="loading"/>
+      <b-empty v-if="dataList.length<=0" :loading="formState.loading"/>
       <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
         <ion-infinite-scroll-content
             :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
@@ -40,60 +41,67 @@
 
 <script lang="ts">
 
-import {computed, defineComponent, reactive, ref} from 'vue';
 import dayjs from "dayjs";
-import {useRoute, useRouter} from "vue-router";
+import {useRouter} from "vue-router";
+import {computed, defineComponent, reactive, ref} from 'vue';
 import {arrowBackOutline, ellipse,addCircleOutline} from 'ionicons/icons';
 import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
-import BEmpty from "@/components/empty.vue";
+import {getList} from "@/api/jobUserInfo";
 
 export default defineComponent({
-  name: 'JobuserList',
-  components: {IonIcon,BEmpty},
+  name: 'jobUserList',
+  components: {IonIcon},
   setup() {
-    const loading = ref(true);
+    const searchParamsState = reactive({
+      pageIndex: 1,
+      pageSize: 10
+    });
+    const formState = reactive({
+      total: 0,
+      selectedRowKeys: [],
+      loading: false
+    });
     const pagination = computed(() => ({
-      total: total,
-      current: searchParamsState.page,
-      pageSize: searchParamsState.rows
+      current: searchParamsState.pageIndex,
+      pageSize: searchParamsState.pageSize,
+      total: formState.total,
     }));
     const dataList = ref<any>([]);
     const router = useRouter();
-    const route = useRoute();
-    const total = ref(15);
     const colors = ref(["secondary", "tertiary", "success", "warning"]);
 
-    const searchParamsState = reactive({page: 1, rows: 10, writeStatus: null})
 
     const loadData = async function () {
-      loading.value = true;
-
-      /*const result: any = await getMyIntentionList(searchParamsState);
+      formState.loading = true;
+      const result: any = await getList(searchParamsState);
       dataList.value = dataList.value.concat(result.list);
-      total.value = result.total;*/
-
-      dataList.value = [{userName:'张小兰',postRecommendCount:1},{userName:'李佳佳',postRecommendCount:3},{userName:'王胜',postRecommendCount:3},{userName:'陈丽丽',postRecommendCount:3}];
-      loading.value = false;
+      console.log("dataList",dataList.value);
+      formState.total = result.total;
+      formState.loading = false;
     }
 
     const reload = () => {
       dataList.value = [];
-      searchParamsState.page = 1;
+      searchParamsState.pageIndex = 1;
       loadData();
     }
 
     const onScroll = (e: any) => {
       setTimeout(() => {
         e.target.complete();
-        if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
+        if (pagination.value.total > pagination.value.current * pagination.value.pageSize) {
           pagination.value.current += 1;
           loadData();
         }
       }, 500);
     }
 
-    const onAdd = (item: any) => {
-      router.push({path: './edit', query: {reload: 1, id: ""}});
+    const onAdd = () => {
+      router.push({path: './edit', query: {id:null,status:1}});
+    }
+
+    const onDetail = (jobUserID:string) =>{
+      router.push({path: './edit', query: {jobUserID: jobUserID,status: 1}});
     }
 
     onIonViewDidEnter(() => {
@@ -102,17 +110,17 @@ export default defineComponent({
 
     return {
       router,
-      pagination,
       colors,
-      reload,
-      loading,
-      searchParamsState,
       dataList,
-      total,
+      formState,
+      pagination,
+      searchParamsState,
       dayjs,
       onScroll,
       onAdd,
+      onDetail,
       loadData,
+      reload,
       ellipse,
       arrowBackOutline,
       addCircleOutline,

+ 1 - 1
src/main/java/com/hz/employmentsite/controller/baseSettings/InstitutionController.java

@@ -55,7 +55,7 @@ public class InstitutionController {
 
     @ResponseBody
     @GetMapping("/getDataList")
-    public BaseResponse<ArrayList<SelectProps>> getDataList() {
+    public BaseResponse<List<SelectProps>> getDataList() {
         return RespGenerstor.success(institutionService.getDataList());
     }
 

+ 7 - 0
src/main/java/com/hz/employmentsite/controller/baseSettings/SiteInfoController.java

@@ -3,6 +3,7 @@ package com.hz.employmentsite.controller.baseSettings;
 import com.github.pagehelper.PageInfo;
 import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +42,12 @@ public class SiteInfoController {
         return RespGenerstor.success(result);
     }
 
+    @ResponseBody
+    @GetMapping("/getDataList")
+    public BaseResponse<List<SelectProps>> getDataList() {
+        return RespGenerstor.success(siteInfoService.getDataList());
+    }
+
     @PostMapping("getListByInstitutionID")
     public BaseResponse<Integer> getListByInstitutionID(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,@RequestParam(required = false) String institutionID) {
         return RespGenerstor.success(siteInfoService.getListByInstitutionID(pageIndex,pageSize, institutionID));

+ 48 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/EducationController.java

@@ -0,0 +1,48 @@
+package com.hz.employmentsite.controller.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.PcEducation;
+import com.hz.employmentsite.services.service.AccountService;
+import com.hz.employmentsite.services.service.jobUserManager.EducationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.UUID;
+
+@RestController
+@RequestMapping(value = "/api/jobUserService/education")
+public class EducationController {
+
+    @Autowired
+    private EducationService educationService;
+    @Autowired
+    private AccountService accountService;
+
+    @ResponseBody
+    @GetMapping("/getListByJobUserID")
+    public BaseResponse getListByJobUserID(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize, @RequestParam(required = false) String jobUserID) {
+
+        PageInfo<PcEducation> result = educationService.getListByJobUserID(pageIndex, pageSize,jobUserID);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getById")
+    public BaseResponse getById(@RequestParam(required = false) String educationID) {
+        PcEducation dataModel = new PcEducation();
+        if (educationID == null || educationID == ""){
+            dataModel.setEducationID(UUID.randomUUID().toString());
+        }else{
+            dataModel = educationService.getById(educationID);
+        }
+        return RespGenerstor.success(dataModel);
+    }
+
+    @PostMapping("save")
+    public BaseResponse<Integer> save(@RequestBody PcEducation data) {
+        return RespGenerstor.success(educationService.save(data,accountService.getLoginUserID()));
+    }
+
+
+}

+ 13 - 6
src/main/java/com/hz/employmentsite/controller/jobUserManager/JobuserController.java

@@ -7,7 +7,7 @@ import com.hz.employmentsite.filter.exception.BaseResponse;
 import com.hz.employmentsite.filter.exception.RespGenerstor;
 import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.services.service.AccountService;
-import com.hz.employmentsite.services.service.jobUserManager.JobuserService;
+import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
 import com.hz.employmentsite.util.DateUtils;
 import com.hz.employmentsite.util.ExcelHelper;
 import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
@@ -21,11 +21,11 @@ import java.util.List;
 import java.util.UUID;
 
 @RestController
-@RequestMapping(value = "/api/Jobusermgr/Jobuser")
-public class JobuserController {
+@RequestMapping(value = "/api/jobUserService/jobUser")
+public class JobUserController {
 
     @Autowired
-    private JobuserService jobuserService;
+    private JobUserService jobuserService;
     @Autowired
     private AccountService accountService;
     @Autowired
@@ -33,7 +33,7 @@ public class JobuserController {
 
     @ResponseBody
     @GetMapping("/getList")
-    public BaseResponse getList(@RequestParam("page") int pageIndex, @RequestParam("limit") int pageSize,
+    public BaseResponse getList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
                                 @RequestParam(required = false) String name, @RequestParam(required = false) String siteID, @RequestParam(required = false) String jobStatus, @RequestParam(required = false) Integer sexId,
                                 @RequestParam(required = false) Integer educationTypeId, @RequestParam(required = false) Integer emphasisTypeId) {
 
@@ -47,7 +47,7 @@ public class JobuserController {
         var result = jobuserService.getDataById(id);
         if (result == null) {
             result = new JobUserVo();
-            result.setJobuserID(UUID.randomUUID().toString());
+            result.setJobUserID(UUID.randomUUID().toString());
         }
         return RespGenerstor.success(result);
     }
@@ -79,6 +79,13 @@ public class JobuserController {
         return RespGenerstor.success(result);
     }
 
+    @ResponseBody
+    @PostMapping("/baseInfoSave")
+    public BaseResponse baseInfoSave(@RequestBody JobUserVo data) {
+        var result = jobuserService.baseInfoSave(data, accountService.getLoginUserID());
+        return RespGenerstor.success(result);
+    }
+
     @ResponseBody
     @PostMapping("/delete")
     public BaseResponse delete(@RequestBody List<String> ids) {

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

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

+ 14 - 4
src/main/java/com/hz/employmentsite/services/impl/baseSettings/SiteInfoImpl.java

@@ -7,10 +7,7 @@ import com.hz.employmentsite.mapper.PcSiteInstitutionMapper;
 import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.mapper.cquery.SiteInfoCQuery;
 import com.hz.employmentsite.mapper.cquery.SiteInstitutionCQuery;
-import com.hz.employmentsite.model.PcSite;
-import com.hz.employmentsite.model.PcSiteExample;
-import com.hz.employmentsite.model.PcSiteInstitution;
-import com.hz.employmentsite.model.PcSiteUser;
+import com.hz.employmentsite.model.*;
 import com.hz.employmentsite.services.service.baseSettings.SiteInfoService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
@@ -53,6 +50,19 @@ public class SiteInfoImpl implements SiteInfoService {
         return result;
     }
 
+    @Override
+    public List<SelectProps> getDataList() {
+        var dataList = getList(1,99999,null,null,null,null,null,null).getList();
+        List<SelectProps> dataResult = new ArrayList<>();
+        for (var item: dataList) {
+            SelectProps  itemResult = new SelectProps();
+            itemResult.setText(item.siteName);
+            itemResult.setValue(item.siteID);
+            dataResult.add(itemResult);
+        }
+        return dataResult;
+    }
+
     @Override
     public PageInfo<SiteInfoVo> getListByInstitutionID(int pageIndex, int pageSize, String institutionID) {
         PageHelper.startPage(pageIndex, pageSize);

+ 80 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/EducationServiceImpl.java

@@ -0,0 +1,80 @@
+package com.hz.employmentsite.services.impl.jobUserManager;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.mapper.PcEducationMapper;
+import com.hz.employmentsite.mapper.cquery.EductionCQuery;
+import com.hz.employmentsite.model.*;
+import com.hz.employmentsite.services.service.jobUserManager.EducationService;
+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;
+
+@Service("EducationService")
+public class EducationServiceImpl implements EducationService {
+
+    @Autowired
+    private EductionCQuery eductionCQuery;
+    @Autowired
+    private StringUtils stringUtils;
+    @Autowired
+    private PcEducationMapper pcEducationMapper;
+
+    @Override
+    public PageInfo<PcEducation> getListByJobUserID(Integer pageIndex, Integer pageSize, String jobUserID) {
+        PageHelper.startPage(pageIndex, pageSize);
+        List<PcEducation> list = eductionCQuery.getListByJobUserID(jobUserID);
+        PageInfo<PcEducation> result = new PageInfo(list);
+        return result;
+    }
+
+    @Override
+    public PcEducation getById(String educationID) {
+        if (stringUtils.IsNullOrEmpty(educationID)) {
+            return null;
+        }
+        PcEducation data = eductionCQuery.getById(educationID);
+        return data;
+    }
+
+    @Override
+    public Integer save(PcEducation data, String userId) {
+        int result = 0;
+        PcEducation dbData = pcEducationMapper.selectByPrimaryKey(data.getEducationID());
+        if (dbData == null) {
+            dbData = new PcEducation();
+            dbData.setEducationID(data.getEducationID());
+            dbData.setJobuserID(data.getJobuserID());
+            dbData.setCultureRank(data.getCultureRank());
+            dbData.setSchoolTime(data.getSchoolTime());
+            dbData.setOverTime(data.getOverTime());
+            dbData.setSchoolName(data.getSchoolName());
+            dbData.setCollegeDirection(data.getCollegeDirection());
+            dbData.setMajor(data.getMajor());
+            dbData.setIntroduce(data.getIntroduce());
+            dbData.setCreateTime(new Date());
+            dbData.setCreateUserID(userId);
+            result = pcEducationMapper.insert(dbData);
+        } else {
+            dbData.setEducationID(data.getEducationID());
+            dbData.setJobuserID(data.getJobuserID());
+            dbData.setCultureRank(data.getCultureRank());
+            dbData.setSchoolTime(data.getSchoolTime());
+            dbData.setOverTime(data.getOverTime());
+            dbData.setSchoolName(data.getSchoolName());
+            dbData.setCollegeDirection(data.getCollegeDirection());
+            dbData.setMajor(data.getMajor());
+            dbData.setIntroduce(data.getIntroduce());
+            dbData.setCreateTime(new Date());
+            dbData.setCreateUserID(userId);
+            dbData.setModifyTime(new Date());
+            dbData.setModifyUserID(userId);
+            result = pcEducationMapper.updateByPrimaryKeySelective(dbData);
+        }
+        return result;
+    }
+
+}

+ 91 - 9
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/JobuserServiceImpl.java

@@ -7,7 +7,7 @@ import com.hz.employmentsite.mapper.PcExperienceMapper;
 import com.hz.employmentsite.mapper.PcJobuserMapper;
 import com.hz.employmentsite.mapper.cquery.JobuserCQuery;
 import com.hz.employmentsite.model.*;
-import com.hz.employmentsite.services.service.jobUserManager.JobuserService;
+import com.hz.employmentsite.services.service.jobUserManager.JobUserService;
 import com.hz.employmentsite.util.StringUtils;
 import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,8 +20,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
-@Service("JobuserService")
-public class JobuserServiceImpl implements JobuserService {
+@Service("JobUserService")
+public class JobUserServiceImpl implements JobUserService {
 
     @Autowired
     private JobuserCQuery jobuserCQuery;
@@ -52,7 +52,7 @@ public class JobuserServiceImpl implements JobuserService {
         for (var item: dataList) {
             SelectProps  itemResult = new SelectProps();
             itemResult.setText(item.getName());
-            itemResult.setValue(item.getJobuserID());
+            itemResult.setValue(item.getJobUserID());
             dataResult.add(itemResult);
         }
         return dataResult;
@@ -119,10 +119,10 @@ public class JobuserServiceImpl implements JobuserService {
     @Override
     public int save(JobUserVo data, String userId) {
         int result = 0;
-        PcJobuser dbData = pcJobuserMapper.selectByPrimaryKey(data.getJobuserID());
+        PcJobuser dbData = pcJobuserMapper.selectByPrimaryKey(data.getJobUserID());
         if (dbData == null) {
             dbData = new PcJobuser();
-            dbData.setJobuserID(data.getJobuserID());
+            dbData.setJobuserID(data.getJobUserID());
             dbData.setSiteID(data.getSiteID());
             dbData.setIdentityNumber(data.getIdentityNumber());
             dbData.setName(data.getName());
@@ -132,7 +132,7 @@ public class JobuserServiceImpl implements JobuserService {
             dbData.setSex(data.getSex());
             dbData.setNation(data.getNation());
             dbData.setPoliticsStatusID(data.getPoliticsStatusID());
-            dbData.setBirthplace(data.getBirthplace());
+            dbData.setBirthplace(data.getBirthPlace());
             dbData.setBirthDay(data.getBirthDay());
             dbData.setFamilyNatureID(data.getFamilyNatureID());
             dbData.setFamilyAddress(data.getFamilyAddress());
@@ -159,7 +159,7 @@ public class JobuserServiceImpl implements JobuserService {
             result = pcJobuserMapper.insert(dbData);
 
         } else {
-            dbData.setJobuserID(data.getJobuserID());
+            dbData.setJobuserID(data.getJobUserID());
             dbData.setSiteID(data.getSiteID());
             dbData.setIdentityNumber(data.getIdentityNumber());
             dbData.setName(data.getName());
@@ -169,7 +169,7 @@ public class JobuserServiceImpl implements JobuserService {
             dbData.setJobStatusID(data.getJobStatusID());
             dbData.setNation(data.getNation());
             dbData.setPoliticsStatusID(data.getPoliticsStatusID());
-            dbData.setBirthplace(data.getBirthplace());
+            dbData.setBirthplace(data.getBirthPlace());
             dbData.setBirthDay(data.getBirthDay());
             dbData.setFamilyNatureID(data.getFamilyNatureID());
             dbData.setFamilyAddress(data.getFamilyAddress());
@@ -239,4 +239,86 @@ public class JobuserServiceImpl implements JobuserService {
         return result;
     }
 
+    @Override
+    public int baseInfoSave(JobUserVo data, String userId) {
+        int result = 0;
+        PcJobuser dbData = pcJobuserMapper.selectByPrimaryKey(data.getJobUserID());
+        if (dbData == null) {
+            dbData = new PcJobuser();
+            dbData.setJobuserID(data.getJobUserID());
+            dbData.setSiteID(data.getSiteID());
+            dbData.setIdentityNumber(data.getIdentityNumber());
+            dbData.setName(data.getName());
+            dbData.setPyName(data.getPyName());
+            dbData.setEngName(data.getEngName());
+            dbData.setJobStatusID(data.getJobStatusID());
+            dbData.setSex(data.getSex());
+            dbData.setNation(data.getNation());
+            dbData.setPoliticsStatusID(data.getPoliticsStatusID());
+            dbData.setBirthplace(data.getBirthPlace());
+            dbData.setBirthDay(data.getBirthDay());
+            dbData.setFamilyNatureID(data.getFamilyNatureID());
+            dbData.setFamilyAddress(data.getFamilyAddress());
+            dbData.setCultureRank(data.getCultureRank());
+            dbData.setHealthID(data.getHealthID());
+            dbData.setHeight(data.getHeight());
+            dbData.setBloodTypeID(data.getBloodTypeID());
+            dbData.setVision(data.getVision());
+            dbData.setWeight(data.getWeight());
+            dbData.setMaritalStatusID(data.getMaritalStatusID());
+            dbData.setProvinceCode(data.getProvinceCode());
+            dbData.setRegionCode(data.getRegionCode());
+            dbData.setStreetCode(data.getStreetCode());
+            dbData.setUserName(data.getUserName());
+            dbData.setUserMobile(data.getUserMobile());
+            dbData.setAddress(data.getAddress());
+            dbData.setPostalCode(data.getPostalCode());
+            dbData.setEmail(data.getEmail());
+            dbData.setHobby(data.getHobby());
+            dbData.setKeyPersonTypeID(data.getKeyPersonTypeID());
+            dbData.setPersonalSkills(data.getPersonalSkills());
+            dbData.setCreateTime(new Date());
+            dbData.setCreateUserID(userId);
+            result = pcJobuserMapper.insert(dbData);
+
+        } else {
+            dbData.setJobuserID(data.getJobUserID());
+            dbData.setSiteID(data.getSiteID());
+            dbData.setIdentityNumber(data.getIdentityNumber());
+            dbData.setName(data.getName());
+            dbData.setPyName(data.getPyName());
+            dbData.setEngName(data.getEngName());
+            dbData.setSex(data.getSex());
+            dbData.setJobStatusID(data.getJobStatusID());
+            dbData.setNation(data.getNation());
+            dbData.setPoliticsStatusID(data.getPoliticsStatusID());
+            dbData.setBirthplace(data.getBirthPlace());
+            dbData.setBirthDay(data.getBirthDay());
+            dbData.setFamilyNatureID(data.getFamilyNatureID());
+            dbData.setFamilyAddress(data.getFamilyAddress());
+            dbData.setCultureRank(data.getCultureRank());
+            dbData.setHealthID(data.getHealthID());
+            dbData.setHeight(data.getHeight());
+            dbData.setBloodTypeID(data.getBloodTypeID());
+            dbData.setVision(data.getVision());
+            dbData.setWeight(data.getWeight());
+            dbData.setMaritalStatusID(data.getMaritalStatusID());
+            dbData.setProvinceCode(data.getProvinceCode());
+            dbData.setRegionCode(data.getRegionCode());
+            dbData.setStreetCode(data.getStreetCode());
+            dbData.setUserName(data.getUserName());
+            dbData.setUserMobile(data.getUserMobile());
+            dbData.setAddress(data.getAddress());
+            dbData.setPostalCode(data.getPostalCode());
+            dbData.setEmail(data.getEmail());
+            dbData.setHobby(data.getHobby());
+            dbData.setKeyPersonTypeID(data.getKeyPersonTypeID());
+            dbData.setPersonalSkills(data.getPersonalSkills());
+            dbData.setModifyTime(new Date());
+            dbData.setModifyUserID(userId);
+            result = pcJobuserMapper.updateByPrimaryKeySelective(dbData);
+        }
+        return result;
+    }
+
 }

+ 3 - 0
src/main/java/com/hz/employmentsite/services/service/baseSettings/SiteInfoService.java

@@ -1,6 +1,7 @@
 package com.hz.employmentsite.services.service.baseSettings;
 
 import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.model.SelectProps;
 import com.hz.employmentsite.vo.baseSettings.SiteInfoVo;
 
 import java.util.List;
@@ -10,6 +11,8 @@ public interface SiteInfoService {
 
     PageInfo<SiteInfoVo> getList(int pageIndex, int pageSize, String primaryKey, String siteCode, String siteName, String institutionName, String regionCode, String streetCode);
 
+    List<SelectProps> getDataList();
+
     PageInfo<SiteInfoVo> getListByInstitutionID(int pageIndex, int pageSize, String institutionID);
 
     SiteInfoVo get(String siteID);

+ 13 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/EducationService.java

@@ -0,0 +1,13 @@
+package com.hz.employmentsite.services.service.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.model.PcEducation;
+
+public interface EducationService {
+
+    PageInfo<PcEducation> getListByJobUserID(Integer pageIndex, Integer pageSize,String jobUserID);
+
+    PcEducation getById(String educationID);
+
+    Integer save(PcEducation data, String userId);
+}

+ 3 - 1
src/main/java/com/hz/employmentsite/services/service/jobUserManager/JobuserService.java

@@ -8,7 +8,7 @@ import com.hz.employmentsite.vo.jobUserManager.JobUserVo;
 
 import java.util.List;
 
-public interface JobuserService {
+public interface JobUserService {
     PageInfo<JobUserVo> getList(Integer page, Integer rows,String jobuserID, String name, String siteId, String jobStatus,Integer sexId,Integer educationTypeId,Integer emphasisTypeId);
 
     JobUserVo getDataById(String id);
@@ -22,4 +22,6 @@ public interface JobuserService {
     int delete(List<String> ids);
 
     int save(JobUserVo data, String userId);
+
+    int baseInfoSave(JobUserVo data, String userId);
 }

+ 75 - 3
src/main/java/com/hz/employmentsite/vo/jobUserManager/JobUserVo.java

@@ -1,13 +1,85 @@
 package com.hz.employmentsite.vo.jobUserManager;
-
-import com.hz.employmentsite.model.PcJobuser;
 import lombok.Data;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 
 @Data
-public class JobUserVo extends PcJobuser {
+public class JobUserVo {
+
+    private String jobUserID;
+
+    private String siteID;
+
+    private String identityNumber;
+
+    private String name;
+
+    private String pyName;
+
+    private String engName;
+
+    private Integer sex;
+
+    private String nation;
+
+    private Integer politicsStatusID;
+
+    private String birthPlace;
+
+    private Date birthDay;
+
+    private Integer familyNatureID;
+
+    private Integer cultureRank;
+
+    private Integer healthID;
+
+    private Integer bloodTypeID;
+
+    private String height;
+
+    private String vision;
+
+    private String weight;
+
+    private Integer maritalStatusID;
+
+    private String provinceCode;
+
+    private String regionCode;
+
+    private String streetCode;
+
+    private String userName;
+
+    private String userMobile;
+
+    private String address;
+
+    private String familyAddress;
+
+    private String postalCode;
+
+    private String email;
+
+    private String hobby;
+
+    private Integer jobStatusID;
+
+    private Integer keyPersonTypeID;
+
+    private String personalSkills;
+
+    private String createUserID;
+
+    private Date createTime;
+
+    private String modifyUserID;
+
+    private Date modifyTime;
+
     public String genderName;
     public String cultureName;
     public String siteName;

+ 16 - 0
src/main/resources/mapping/cquery/EducationCQuery.xml

@@ -0,0 +1,16 @@
+<?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.EductionCQuery">
+    <select id="getListByJobUserID" resultType="com.hz.employmentsite.model.PcEducation">
+        select * from pc_education where 1=1
+        <if test="jobUserID != null and jobUserID != ''">
+            and jobUserID = #{jobUserID}
+        </if>
+    </select>
+    <select id="getById" resultType="com.hz.employmentsite.model.PcEducation">
+        select * from pc_education where 1=1
+        <if test="educationID != null and educationID != ''">
+            and educationID = #{educationID}
+        </if>
+    </select>
+</mapper>

+ 12 - 1
vue/src/api/baseSettings/siteInfo.ts

@@ -1,6 +1,5 @@
 import {request} from "@/utils/request";
 
-
 export function getSiteList(params:any) {
   return request<object>(
     {
@@ -14,6 +13,18 @@ export function getSiteList(params:any) {
   );
 }
 
+export function getSiteDataList(){
+  return request<any>(
+    {
+      url: 'siteInfo/getDataList',
+      method: 'get',
+      params: null,
+    },
+    {
+      isNew: true,
+    },
+  );
+}
 
 export function getListByInstitutionID(params: any) {
   return request<object>(

+ 7 - 7
vue/src/api/jobUserManager/jobuser/index.ts

@@ -3,7 +3,7 @@ import { request } from '@/utils/request';
 export function getList(query: any) {
   return request(
     {
-      url: 'Jobusermgr/Jobuser/getList',
+      url: 'jobUserService/jobUser/getList',
       method: 'get',
       params: query,
     },
@@ -13,7 +13,7 @@ export function getList(query: any) {
 export function getJobUserDataList(){
   return request<any>(
     {
-      url: 'Jobusermgr/Jobuser/getDataList',
+      url: 'jobUserService/jobUser/getDataList',
       method: 'get',
       params: null,
     },
@@ -26,7 +26,7 @@ export function getJobUserDataList(){
 export function getDataById(id: any) {
   return request(
     {
-      url: 'Jobusermgr/Jobuser/getDataById',
+      url: 'jobUserService/jobUser/getDataById',
       method: 'get',
       params: {id},
     },
@@ -37,7 +37,7 @@ export function getDataById(id: any) {
 export function save(data: any) {
   return request(
     {
-      url: "Jobusermgr/Jobuser/save",
+      url: "jobUserService/jobUser/save",
       method: 'post',
       data: data
     },
@@ -51,7 +51,7 @@ export function save(data: any) {
 
 export function del(data: any) {
   return request({
-      url: 'Jobusermgr/Jobuser/delete',
+      url: 'jobUserService/jobUser/delete',
       method: 'post',
       data: data
     },
@@ -66,7 +66,7 @@ export function del(data: any) {
 export function getEducationList(id: any) {
   return request(
     {
-      url: "Jobusermgr/Jobuser/getEducationList",
+      url: "jobUserService/jobUser/getEducationList",
       method: 'get',
       params: {id},
     },
@@ -79,7 +79,7 @@ export function getEducationList(id: any) {
 export function getExperienceList(id: any) {
   return request(
     {
-      url: "Jobusermgr/Jobuser/getExperienceList",
+      url: "jobUserService/jobUser/getExperienceList",
       method: 'get',
       params: {id},
     },

+ 7 - 7
vue/src/views/jobUserManager/jobuser/index.vue

@@ -156,8 +156,8 @@ export default defineComponent({
     const modalRoleEditRef = ref();
     const formRef = ref<FormInstance>();
     const searchParamsState = reactive({
-      page: 1,
-      limit: 20,
+      pageIndex: 1,
+      pageSize: 20,
       name: '',
       siteId: '',
       jobStatus: '',
@@ -177,7 +177,7 @@ export default defineComponent({
         width: 80,
         key: 'jobUserId',
         customRender: (item) =>
-          `${searchParamsState.limit * (searchParamsState.page - 1) + item.index + 1}`,
+          `${searchParamsState.pageIndex * (searchParamsState.pageSize - 1) + item.index + 1}`,
       },
       {title: '姓名', dataIndex: 'name', key: 'name', width: 100},
       {title: '公民身份号码', dataIndex: 'identityNumber', key: 'identityNumber', width: 150},
@@ -198,8 +198,8 @@ export default defineComponent({
     ];
     const pagination = computed(() => ({
       total: formState.total,
-      current: searchParamsState.page,
-      pageSize: searchParamsState.limit,
+      current: searchParamsState.pageIndex,
+      pageSize: searchParamsState.pageSize,
       showSizeChanger: true,
       showTotal: (total) => getPaginationTotalTitle(total),
     }));
@@ -237,8 +237,8 @@ export default defineComponent({
       pageSize: number;
       current: number;
     }) => {
-      searchParamsState.page = pag.current;
-      searchParamsState.limit = pag.pageSize;
+      searchParamsState.pageIndex = pag.current;
+      searchParamsState.pageSize = pag.pageSize;
       loadData();
     };