liao-sea 11 mēneši atpakaļ
vecāks
revīzija
7f5ec211e2

+ 18 - 4
h5app/src/router/index.ts

@@ -223,11 +223,25 @@ const routes: Array<RouteRecordRaw> = [
                 component: () => import('@/views/pages/jobUserInfo/index.vue'),
             },
             {
-                path: 'useredit',
-                name: 'useredit',
+                path: 'userEdit',
+                name: 'userEdit',
                 component: () => import('@/views/pages/jobUserInfo/userEdit.vue'),
-            }
-            ,
+            },
+            {
+                path: 'educationEdit',
+                name: 'educationEdit',
+                component: () => import('@/views/pages/jobUserInfo/educationEdit.vue'),
+            },
+            {
+                path: 'experienceEdit',
+                name: 'experienceEdit',
+                component: () => import('@/views/pages/jobUserInfo/experienceEdit.vue'),
+            },
+            {
+                path: 'jobHuntEdit',
+                name: 'jobHuntEdit',
+                component: () => import('@/views/pages/jobUserInfo/jobHuntEdit.vue'),
+            },
             {
                 path: 'companyEdit',
                 name: 'companyEdit',

+ 1 - 1
h5app/src/views/pages/jobUserInfo/companyEdit.vue

@@ -406,7 +406,7 @@ export default defineComponent({
 
     onIonViewDidEnter(() => {
       if (route.query.reload) {
-        reload(route.query.id,1,route.query.siteUserId);
+        reload(route.query.id,1,route.query.loginUserId);
       }
     });
 

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

@@ -0,0 +1,319 @@
+<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">{{ record.title }}</p>
+<!--            <p class="stepFlex-item-label-desc">{{ 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="dataModel.schoolName" ></ion-input>
+<!--              <ion-note slot="error">毕业院校/培训机构不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>最高学历<span class="danger">*</span></ion-label>
+              <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="dataModel.cultureRank"
+                          interface="action-sheet" placeholder="请选择最高学历" style="width:100%;text-align:left;">
+                <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>-->
+            </div>
+<!--            <ion-item :class="[educationValid.dataModel.cultureRank.$error?'ion-invalid':'ion-valid']"></ion-item>-->
+            <div class="form-input">
+              <ion-label>专业<span class="danger">*</span></ion-label>
+              <ion-input name="major" id="major"  class="custom"
+                         placeholder="请输入专业" v-model="dataModel.major" ></ion-input>
+<!--              <ion-note slot="error">专业不能为空</ion-note>-->
+            </div>
+            <div class="form-input">
+              <ion-label>起止日期<span class="danger">*</span></ion-label>
+              <div>
+                <ion-datetime-button datetime="schoolTime" style="float:left;"></ion-datetime-button>
+                <span style="float:left;padding-top: 5px;">至</span>
+                <ion-datetime-button datetime="overTime" style="float:left;"></ion-datetime-button>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="schoolTime" placeholder="日期"
+                                v-model="dataModel.schoolTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="overTime" placeholder="日期"
+                                v-model="dataModel.overTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+              </div>
+              <!--<ion-note slot="error">起止日期不能为空</ion-note>-->
+            </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 lang="ts">
+import {arrowBackOutline} 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 {getEducationByID,saveEducation} from "@/api/education";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+
+interface educationModel {
+  dataModel:any
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  loginUserID: string,
+  statusVal: number
+}
+export default defineComponent({
+  name: 'educationEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const loading = ref(false);
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      loginUserID:"",
+      statusVal: 2
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+    ]);
+    const cultureRankList = ref<SelectProps[]>([]);
+    const educationData = reactive<educationModel>({
+      dataModel:{
+        jobuserID:null,
+        schoolName:'',
+        cultureRank:0,
+        major:'',
+        schoolTime:null,
+        overTime:null,
+    }});
+    const educationRules = computed(()=>{
+      return {dataModel:{
+          schoolName:{required},
+          cultureRank:{required},
+          major:{required},
+          schoolTime:{required},
+          overTime:{required},
+        }}});
+    const educationValid = useVuelidate(educationRules,educationData);
+    const setOpen = (isOpen: boolean) => {
+      loading.value = isOpen;
+    };
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await educationValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前教育经历数据",educationData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveEducation(educationData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './userEdit', query: {reload:1,jobUserID: educationData.dataModel.jobuserID,status:2,loginUserId:curStepData.value.loginUserID}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './userEdit', query: {reload:1,jobUserID: educationData.dataModel.jobuserID,status:2,loginUserId:curStepData.value.loginUserID}});
+    }
+
+    const getCultureRankList = async function(){
+      const data :any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = data;
+    }
+
+    const loadData = async (educationID: any,jobUserID:any,status:any,userID:any) => {
+      loading.value = true;
+      await getCultureRankList();
+      const reqData = await getEducationByID(educationID);
+      educationData.dataModel = reqData;
+      educationData.dataModel.jobuserID = jobUserID;
+      console.log("初始化教育经历",educationData.dataModel);
+      curStepData.value.statusVal = status;
+      curStepData.value.loginUserID = userID;
+      loading.value = false;
+    };
+
+    const reload = (educationID: any,jobUserID:any,status:any,loginUserId:any) => {
+      educationData.dataModel = {};
+      loadData(educationID,jobUserID,status,loginUserId);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload)
+        reload(route.query.educationID,route.query.jobUserID,route.query.status,route.query.loginUserID);
+    });
+
+    return {
+      ...toRefs(educationData),
+      arrowBackOutline,
+      editForm,
+      curStepData,
+      stepList,
+      cultureRankList,
+      setOpen,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      loading,
+      educationValid
+    }
+  }
+});
+</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;
+  }
+}
+
+</style>

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

@@ -0,0 +1,312 @@
+<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">{{ record.title }}</p>
+<!--            <p class="stepFlex-item-label-desc">{{ 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="workAddress" id="workAddress" style="text-align: left;" class="custom"
+                         placeholder="请输入工作单位" v-model="dataModel.workAddress" ></ion-input>
+<!--              <ion-note slot="error">工作单位不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+              <ion-label>职务<span class="danger">*</span></ion-label>
+              <ion-input name="duties" id="duties" style="text-align: left;" class="custom"
+                         placeholder="请输入职务" v-model="dataModel.duties" ></ion-input>
+<!--              <ion-note slot="error">职务不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+            <ion-label>工作内容<span class="danger">*</span></ion-label>
+              <ion-textarea name="workOffice" id="workOffice"  class="custom" rows="4"
+                            placeholder="请输入工作内容" v-model="dataModel.workOffice" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
+<!--              <ion-note slot="error">工作内容不能为空</ion-note>-->
+            </div>
+
+            <div class="form-input">
+              <ion-label>起止日期<span class="danger">*</span></ion-label>
+              <div>
+                <ion-datetime-button datetime="startTime" style="float:left;"></ion-datetime-button>
+                <span style="float:left;padding-top: 5px;">至</span>
+                <ion-datetime-button datetime="endTime" style="float:left;"></ion-datetime-button>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="startTime" placeholder="日期"
+                                v-model="dataModel.startTime" :prefer-wheel="true"
+                                dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                :show-default-buttons="true">
+                  </ion-datetime>
+                </ion-modal>
+                <ion-modal :keep-contents-mounted="true">
+                  <ion-datetime id="endTime" placeholder="日期"
+                                v-model="dataModel.endTime" :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 lang="ts">
+import {arrowBackOutline} 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 {getExperienceByID,saveExperience} from "@/api/experience";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+
+interface experienceModel {
+  dataModel:any
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  loginUserID: string,
+  statusVal: number
+}
+export default defineComponent({
+  name: 'educationEdit',
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const loading = ref(false);
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      loginUserID:"",
+      statusVal: 2
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+    ]);
+    const cultureRankList = ref<SelectProps[]>([]);
+    const experienceData = reactive<experienceModel>({
+      dataModel:{
+        jobuserID:null,
+        workAddress:'',
+        duties:'',
+        workOffice:'',
+        startTime:null,
+        endTime:null,
+    }});
+    const experienceRules = computed(()=>{
+      return {dataModel:{
+          workAddress:{required},
+          duties:{required},
+          workOffice:{required},
+          startTime:{required},
+          endTime:{required},
+        }}});
+    const experienceValid = useVuelidate(experienceRules,experienceData);
+    const setOpen = (isOpen: boolean) => {
+      loading.value = isOpen;
+    };
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
+    const onSave = async function (){
+      const isFormCorrect = await experienceValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前工作经验数据",experienceData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveExperience(experienceData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './userEdit', query: {reload:1,jobUserID: experienceData.dataModel.jobuserID,status:3,loginUserId:curStepData.value.loginUserID}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './userEdit', query: {reload:1,jobUserID: experienceData.dataModel.jobuserID,status:3,loginUserId:curStepData.value.loginUserID}});
+    }
+
+
+    const loadData = async (educationID: any,jobUserID:any,status:any,userID:any) => {
+      loading.value = true;
+      const reqData = await getExperienceByID(educationID);
+      experienceData.dataModel = reqData;
+      experienceData.dataModel.jobuserID = jobUserID;
+      console.log("初始化教育经历",experienceData.dataModel);
+      curStepData.value.statusVal = status;
+      curStepData.value.loginUserID = userID;
+      loading.value = false;
+    };
+
+    const reload = (educationID: any,jobUserID:any,status:any,loginUserID:any) => {
+      experienceData.dataModel = {};
+      loadData(educationID,jobUserID,status,loginUserID);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload)
+        reload(route.query.experienceID,route.query.jobUserID,route.query.status,route.query.loginUserID);
+    });
+
+    return {
+      ...toRefs(experienceData),
+      arrowBackOutline,
+      editForm,
+      curStepData,
+      stepList,
+      cultureRankList,
+      setOpen,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      loading,
+      experienceValid
+    }
+  }
+});
+</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;
+  }
+}
+
+</style>

+ 2 - 2
h5app/src/views/pages/jobUserInfo/index.vue

@@ -81,11 +81,11 @@ export default defineComponent({
     };
 
     const onCompany = function () {
-      router.push({path: '/jobUserInfo/companyedit', query: {reload: 1, openId: openId.value, siteUserId: userId}});
+      router.push({path: '/jobUserInfo/companyEdit', query: {reload: 1, openId: openId.value, loginUserId: userId}});
     };
 
     const onJobUser = function () {
-      router.push({path: '/jobUserInfo/useredit', query: {reload: 1, openId: openId.value, siteUserId: userId}});
+      router.push({path: '/jobUserInfo/userEdit', query: {reload: 1, openId: openId.value,status:1, loginUserId: userId}});
     };
 
 

+ 395 - 0
h5app/src/views/pages/jobUserInfo/jobHuntEdit.vue

@@ -0,0 +1,395 @@
+<template>
+  <ion-page  class="list-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">{{ record.title }}</p>
+            <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
+          </div>
+        </div>
+      </div>
+
+      <!--          <div class="form-input">
+                  <ion-label>工种名称<span class="danger">*</span></ion-label>
+                  <ion-input name="workName" id="workName"  style="text-align: left;" class="custom"
+                             placeholder="请输入工种名称" v-model="dataModel.workName" ></ion-input>
+      &lt;!&ndash;            <ion-note slot="error">工种名称不能为空</ion-note>&ndash;&gt;
+                </div>-->
+      <form ref="editForm" @submit.prevent="onSave">
+        <div class="bw-vue-form">
+        <ion-list>
+          <div class="form-title">求职意向</div>
+          <div class="form-select">
+            <ion-label>求职类型<span class="danger">*</span></ion-label>
+              <ion-select name="jobHuntType"  id="jobHuntType" okText="确定" cancelText="取消" v-model="dataModel.jobHuntType"
+                          interface="action-sheet" placeholder="请选择求职类型" style="width:100%;text-align: left;">
+                <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>-->
+          </div>
+          <div class="form-input">
+            <ion-label>求职岗位<span class="danger">*</span></ion-label>
+            <ion-input placeholder="请选择岗位" label-placement="stacked"
+                       v-model="dataModel.professionName" style="float:left;width: 88%;" >
+            </ion-input>
+            <picker :ProfessionID="dataModel.professionID" aria-disabled="false"
+                    @SetProfessionID="onSetProfessionID" style="float:left;width: 10%;"></picker>
+            <!--            <ion-note slot="error">请选择求职岗位</ion-note>-->
+          </div>
+          <div class="form-select">
+            <ion-label>人才类型<span class="danger">*</span></ion-label>
+              <ion-select name="jobUserType"  id="jobUserType" okText="确定" cancelText="取消" v-model="dataModel.jobUserType"
+                          interface="action-sheet" placeholder="请选择人才类型"  style="width:100%;text-align: left;">
+                <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>-->
+          </div>
+          <div class="form-input">
+            <ion-label>月薪要求(元)<span class="danger">*</span></ion-label>
+            <div>
+              <ion-input placeholder="请输入最低薪资" label-placement="stacked" style="float:left;width:42%;"
+                         v-model="dataModel.minSalary" class="custom">
+              </ion-input>
+              <ion-label style="float:left;width:5%;padding-top: 8px;">至</ion-label>
+              <ion-input placeholder="请输入最高薪资" label-placement="stacked" style="float:left;width:42%;"
+                         v-model="dataModel.maxSalary" class="custom">
+              </ion-input>
+              <!--              <ion-note slot="error">月薪要求不能为空</ion-note>-->
+            </div>
+          </div>
+          <div style="overflow: hidden;width:100%;"></div>
+          <div class="form-select">
+            <ion-label>工作年限<span class="danger">*</span></ion-label>
+            <ion-select name="workYear"  id="workYear" okText="确定" cancelText="取消" v-model="dataModel.workYear"
+                          interface="action-sheet" placeholder="请选择工作年限"  style="width:100%;text-align: left;">
+                <ion-select-option v-for=" (it,key) in workYearTypeList" :key="key" :value="it.value">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+<!--              <ion-note slot="error">工作年限不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>期望工作地区<span class="danger">*</span></ion-label>
+            <ion-input name="areaWork" id="areaWork" style="text-align: left;" class="custom"
+                       placeholder="请输入期望工作地区" v-model="dataModel.areaWork" ></ion-input>
+<!--              <ion-note slot="error">期望工作地区不能为空</ion-note>-->
+          </div>
+          <div class="form-input">
+            <ion-label>可到职日期<span class="danger">*</span></ion-label>
+              <ion-datetime-button datetime="inDate" style="position: relative;right:110px;"></ion-datetime-button>
+              <ion-modal :keep-contents-mounted="true">
+                <ion-datetime name="inDate" id="inDate" placeholder="可到职日期"
+                              v-model="dataModel.inDate"  :prefer-wheel="true"
+                              dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                              :show-default-buttons="true">
+                </ion-datetime>
+              </ion-modal>
+          </div>
+          <div class="form-input">
+            <ion-label>其他信息</ion-label>
+            <ion-textarea placeholder="请输入其他信息" :rows="3" label-placement="stacked"
+                          v-model="dataModel.otherDemand" class="custom" style="border-bottom: 1px solid #fff2e8;">
+            </ion-textarea>
+          </div>
+        </ion-list>
+        </div>
+      </form>
+    </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+          <ion-button style="width: 100%;"  @click="onSave">保  存</ion-button>
+      </ion-toolbar>
+      <ion-loading
+          :is-open="loading"
+          message="加载中..."
+          @didDismiss="setOpen(false)" >
+      </ion-loading>
+    </ion-footer>
+  </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,saveJobHunt} from "@/api/jobHuntInfo";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+import dayjs from "dayjs";
+import Picker from "@/components/picker.vue";
+
+interface huntModel {
+  dataModel: any;
+}
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  loginUserID: string,
+  statusVal: number
+}
+export class ExampleComponent {
+  pinFormatter(value: number) {
+    return `${value}`;
+  }
+}
+
+export default defineComponent({
+  name: 'jobHuntEdit',
+  components:{Picker},
+  setup() {
+    const router = useRouter();
+    const route = useRoute();
+    const loading = ref(false);
+    const editForm = ref();
+    const curStepData = ref<StepParams>({
+      loginUserID:"",
+      statusVal: 2
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4}
+    ]);
+    const jobHuntTypeList = ref<SelectProps[]>([]);
+    const jobUserTypeList = ref<SelectProps[]>([]);
+    const workYearTypeList = ref<SelectProps[]>([]);
+    const jobHuntData = reactive<huntModel>({dataModel:{
+        jobUserID:null,
+        jobHuntType:null,
+        jobUserType:null,
+        professionID:null,
+        professionName:null,
+        minSalary:null,
+        maxSalary:null,
+        workYear:null,
+        areaWork:null,
+        inDate:dayjs().format("YYYY-MM-DD"),
+        otherDemand:null
+      }});
+    const huntDataRule = computed(()=>{
+      return {dataModel:{
+          jobHuntType:{required},
+          jobUserType:{required},
+          professionID:{required},
+          professionName:{required},
+          minSalary:{required},
+          maxSalary:{required},
+          workYear:{required},
+          areaWork:{required},
+          inDate:{required}
+        }}});
+    const huntDataValid = useVuelidate(huntDataRule,jobHuntData);
+
+    const setOpen = (isOpen: boolean) => {
+      loading.value = isOpen;
+    };
+
+    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 getWorkYearTypeList = async function(){
+      const data :any = await getSysDictionaryList("WorkYearType");
+      workYearTypeList.value = data;
+    }
+
+    const onSetProfessionID = (data: any)=>{
+      jobHuntData.dataModel.professionID = data.value;
+      jobHuntData.dataModel.professionName = data.text;
+    }
+    const onSave = async function (){
+      const isFormCorrect = await huntDataValid.value.$validate();
+      if(!isFormCorrect){
+        console.log("当前求职意向数据",jobHuntData.dataModel);
+        await presentAlert("请填写完整的信息!");
+        return null;
+      }
+      saveJobHunt(jobHuntData.dataModel).then(result => {
+        if (result) {
+          router.push({path: './userEdit', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
+        }
+      });
+    }
+
+    const onCancel = () => {
+      router.push({path: './,loginUserId:curStepData.value.loginUserID', query: {reload:1,jobUserID: jobHuntData.dataModel.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
+    }
+
+
+    const loadData = async (jobHuntID: any,jobUserID:any,status:any,userID:any) => {
+      loading.value = true;
+      await getJobHuntTypeList();
+      await getJobUserTypeList();
+      await getWorkYearTypeList();
+      const reqData = await getJobHuntByID(jobHuntID);
+      curStepData.value.statusVal = status;
+      curStepData.value.loginUserID = userID;
+      jobHuntData.dataModel = reqData;
+      jobHuntData.dataModel.jobUserID = jobUserID;
+      console.log("初始化求职意向 ",jobHuntData.dataModel);
+      loading.value = false;
+    };
+
+    const reload = (educationID: any,jobUserID:any,status:any,loginUserID:any) => {
+      loadData(educationID,jobUserID,status,loginUserID);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload){
+        reload(route.query.jobHuntID,route.query.jobUserID,route.query.status,route.query.LoginUserID);
+      }
+    });
+
+    return {
+      ...toRefs(jobHuntData),
+      arrowBackOutline,
+      addCircleOutline,
+      editForm,
+      curStepData,
+      stepList,
+      jobUserTypeList,
+      jobHuntTypeList,
+      workYearTypeList,
+      setOpen,
+      onSetProfessionID,
+      onSave,
+      onCancel,
+      loadData,
+      route,
+      router,
+      loading,
+      huntDataValid
+    }
+  }
+});
+</script>
+<style lang="less">
+.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;
+  }
+}
+
+</style>

+ 898 - 7
h5app/src/views/pages/jobUserInfo/userEdit.vue

@@ -9,29 +9,920 @@
       </ion-toolbar>
     </ion-header>
     <ion-content>
-      jobUserInfoEdit
+      <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 autocomplete="off">
+        <div class="bw-vue-form">
+          <ion-list  v-if="curStepData.statusVal==1">
+            <div class="form-title">基本信息</div>
+            <div class="form-input">
+              <ion-label>姓名<span class="danger">*</span></ion-label>
+              <ion-input name="name" id="name" class="custom" :clear-input="true"
+                         placeholder="请输入姓名" v-model="baseData.name" >
+              </ion-input>
+              <!--              <ion-note slot="error">姓名不能为空</ion-note>-->
+            </div>
+            <div class="form-input">
+              <ion-label>公民身份号码<span class="danger">*</span></ion-label>
+              <ion-input name="identityNumber" id="identityNumber"  class="custom" :clear-input="true"
+                         placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
+              <!--              <ion-note slot="error">公民身份号码不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>性别<span class="danger">*</span></ion-label>
+              <ion-select name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
+                          interface="action-sheet"  placeholder="请选择性别" style="width:100%;text-align:left;" >
+                <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>-->
+            </div>
+            <div class="form-input">
+              <ion-label>联系电话<span class="danger">*</span></ion-label>
+              <ion-input name="userMobile" id="userMobile"  style="text-align: left;" class="custom" :clear-input="true"
+                         placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
+              <!--              <ion-note slot="error">联系电话不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>所属驿站<span class="danger">*</span></ion-label>
+              <ion-select disabled name="siteID"  id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
+                          interface="action-sheet" placeholder="请选择所属驿站"  style="width:100%;text-align:left;">
+                <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>-->
+            </div>
+            <div class="form-select">
+              <ion-label>市/县<span class="danger">*</span></ion-label>
+              <ion-select class="disable" disabled name="regionCode"  id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
+                          interface="action-sheet" placeholder="请选择市/县" style="width:100%;text-align:left;" @ionChange="regionChange()" >
+                <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </div>
+            <div class="form-select">
+              <ion-label>所在街道<span class="danger">*</span></ion-label>
+              <ion-select name="streetCode"  id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"
+                          interface="action-sheet" placeholder="请选择镇/街" style="width:100%;text-align:left;">
+                <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">
+                  {{ it.name }}
+                </ion-select-option>
+              </ion-select>
+            </div>
+            <div class="form-input">
+              <ion-label>住址<span class="danger">*</span></ion-label>
+              <ion-input name="address" id="address"  style="text-align: left;"  class="custom" :clear-input="true"
+                         placeholder="请输入住址" v-model="baseData.address" ></ion-input>
+              <!--          <ion-note slot="error">地址不能为空</ion-note>-->
+            </div>
+            <div class="form-select">
+              <ion-label>就业状态<span class="danger">*</span></ion-label>
+              <ion-select name="jobStatusID"  id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
+                          interface="action-sheet" placeholder="请选择就业状态"  style="width:100%;text-align:left;" >
+                <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>-->
+            </div>
+            <div class="form-select">
+              <ion-label>重点人员类别<span class="danger">*</span></ion-label>
+              <ion-select name="keyPersonTypeID"  id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
+                          interface="action-sheet" placeholder="请选择重点人员类别"  style="width:100%;text-align:left;" >
+                <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>-->
+            </div>
+
+            <div class="form-title">
+              其他信息
+              <div style="float: right;">
+                <ion-icon :icon="chevronDownOutline"  @click="expandChange" v-if="!expand"
+                          style="font-size: 24px;"></ion-icon>
+                <ion-icon :icon="chevronUpOutline"  @click="expandChange" v-if="expand"
+                          style="font-size: 24px;"></ion-icon>
+              </div>
+            </div>
+            <div v-if="expand">
+              <div class="form-select">
+                <ion-label>民族</ion-label>
+                <ion-select name="nationID"  id="nationID" okText="确定" cancelText="取消" v-model="baseData.nation"
+                            interface="action-sheet" placeholder="请选择民族" style="width:100%;text-align:left;" >
+                  <ion-select-option v-for=" (it,key) in nationTypeList" :key="key" :value="it.name">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+                <!--            <ion-input name="nation" id="nation"  style="text-align: left;" class="custom"  :clear-input="true"
+                                       v-model="baseData.nation" placeholder="请输入民族" ></ion-input>-->
+              </div>
+              <div class="form-select">
+                <ion-label>政治面貌</ion-label>
+                <ion-select name="politicsStatusID"  id="politicsStatusID" okText="确定" cancelText="取消" v-model="baseData.politicsStatusID"
+                            interface="action-sheet" placeholder="请选择政治面貌" style="width:100%;text-align:left;" >
+                  <ion-select-option v-for=" (it,key) in politicsStatusList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <div class="form-input">
+                <ion-label>出生地</ion-label>
+                <ion-input name="birthPlace" id="birthPlace"  style="text-align: left;" class="custom" :clear-input="true"
+                           v-model="baseData.birthPlace" placeholder="请输入出生地" ></ion-input>
+              </div>
+              <!--          <div class="form-input">
+                          <ion-label>出生日期</ion-label>
+                          <ion-datetime-button datetime="birthDay" style="position:relative;right:110px;"></ion-datetime-button>
+                          <ion-modal :keep-contents-mounted="true">
+                            <ion-datetime name="birthDay" id="birthDay" placeholder="日期"
+                                          v-model="baseData.birthDay"  :prefer-wheel="true"
+                                          dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
+                                          :show-default-buttons="true">
+                            </ion-datetime>
+                          </ion-modal>
+                        </div>-->
+              <div class="form-select">
+                <ion-label>户口性质</ion-label>
+                <ion-select name="familyNatureID"  id="familyNatureID" okText="确定" cancelText="取消" v-model="baseData.familyNatureID"
+                            interface="action-sheet" placeholder="请选择户口性质" style="width:100%;text-align:left;">
+                  <ion-select-option v-for=" (it,key) in familyNatureList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <div class="form-select">
+                <ion-label>文化程度</ion-label>
+                <ion-select name="cultureRank"  id="cultureRank" okText="确定" cancelText="取消" v-model="baseData.cultureRank"
+                            interface="action-sheet" placeholder="请选择文化程度" style="width:100%;text-align:left;">
+                  <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <div class="form-select">
+                <ion-label>健康状况</ion-label>
+                <ion-select name="healthID"  id="healthID" okText="确定" cancelText="取消" v-model="baseData.healthID"
+                            interface="action-sheet" placeholder="请选择健康状况" style="width:100%;text-align:left;">
+                  <ion-select-option v-for=" (it,key) in userHealthList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <div class="form-select">
+                <ion-label>血型</ion-label>
+                <ion-select name="bloodTypeID"  id="bloodTypeID" okText="确定" cancelText="取消" v-model="baseData.bloodTypeID"
+                            interface="action-sheet" placeholder="请选择血型" style="width:100%;text-align:left;">
+                  <ion-select-option v-for=" (it,key) in bloodTypeList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <div class="form-input">
+                <ion-label>身高(cm)</ion-label>
+                <ion-input name="height" id="height"  style="text-align: left;"  class="custom" :clear-input="true"
+                           placeholder="请输入身高" v-model="baseData.height" ></ion-input>
+              </div>
+              <div class="form-input">
+                <ion-label>视力</ion-label>
+                <ion-input name="vision" id="vision"  style="text-align: left;" class="custom" :clear-input="true"
+                           placeholder="如1.0" v-model="baseData.vision" ></ion-input>
+              </div>
+              <div class="form-input">
+                <ion-label>体重(kg)</ion-label>
+                <ion-input name="weight" id="weight"  style="text-align: left;" class="custom" :clear-input="true"
+                           placeholder="请输入体重" v-model="baseData.weight" ></ion-input>
+              </div>
+              <div class="form-select">
+                <ion-label>婚姻状况</ion-label>
+                <ion-select name="maritalStatusID"  id="maritalStatusID" okText="确定" cancelText="取消" v-model="baseData.maritalStatusID"
+                            interface="action-sheet" placeholder="请选择婚姻状况" style="width:100%;text-align:left;">
+                  <ion-select-option v-for=" (it,key) in maritalStatusList" :key="key" :value="it.value">
+                    {{ it.name }}
+                  </ion-select-option>
+                </ion-select>
+              </div>
+              <!--      <div class="form-select">
+                          <ion-label>省份</ion-label>
+                          <ion-select name="provinceCode"  id="provinceCode" okText="确定" cancelText="取消" v-model="baseData.provinceCode"
+                                      interface="action-sheet" placeholder="请选择省份" style="width:100%;text-align:left;" @change="provinceChange()" >
+                            <ion-select-option v-for=" (it,key) in provinceList" :key="key" :value="it.value">
+                              {{ it.name }}
+                            </ion-select-option>
+                          </ion-select>
+                        </div>-->
+
+              <div class="form-input">
+                <ion-label>联系人员</ion-label>
+                <ion-input name="userName" id="userName"  style="text-align: left;" class="custom" :clear-input="true"
+                           placeholder="请输入联系人员" v-model="baseData.userName" ></ion-input>
+              </div>
+              <div class="form-input">
+                <ion-label>电子邮箱</ion-label>
+                <ion-input name="email" id="email"  style="text-align: left;" class="custom" :clear-input="true"
+                           placeholder="请输入电子邮箱" v-model="baseData.email" ></ion-input>
+              </div>
+              <div class="form-input">
+                <ion-label>家庭住址</ion-label>
+                <ion-textarea name="familyAddress" id="familyAddress"  class="custom" rows="4"
+                              placeholder="请输入家庭住址" v-model="baseData.familyAddress" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
+              </div>
+              <div class="form-input">
+                <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>
+              </div>
+            </div>
+          </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==2" >
+            <div class="form-title">
+              教育经历
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./educationEdit',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-label>
+                          <h2>{{record.schoolName}}</h2>
+                          <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="educationList.length==0"  :loading="loading" />
+          </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==3" >
+            <div class="form-title">
+              工作经验
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./experienceEdit',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-label>
+                          <h2>{{record.workAddress}}</h2>
+                          <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.experienceID)">
+                          <ion-icon :icon="trashOutline"></ion-icon>
+                        </ion-item-option>
+                      </ion-item-options>
+                    </ion-item-sliding>
+                  </div>
+                </ion-list>
+              </div>
+            </div>
+            <b-empty v-if="experienceList.length==0"  :loading="loading" />
+          </ion-list>
+
+          <ion-list  v-if="curStepData.statusVal==4">
+            <div class="form-title">
+              求职意向
+              <ion-icon :icon="addCircleOutline"  class="iconBtn" style="float:right;"
+                        @click="onPathForward('./jobHuntEdit',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-label>
+                          <h2>{{record.professionName}}</h2>
+                          <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
+                        </ion-label>
+                      </ion-item>
+                      <ion-item-options>
+                        <ion-item-option color="danger" @click="setDelAlertOpen(true, record.jobHuntID)">
+                          <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?'正在加载...':'暂无更多'"
+                loadingSpinner="bubbles">
+            </ion-infinite-scroll-content>
+          </ion-infinite-scroll>
+        </div>
+      </form>
     </ion-content>
+    <ion-footer>
+      <ion-toolbar>
+        <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>
+        </div>
+
+      </ion-toolbar>
+    </ion-footer>
+    <ion-alert
+        :is-open="delAlertOpen"
+        header="删除确认"
+        message="确定要删除该信息吗?"
+        :buttons="delAlertButtons"
+        @didDismiss="setDelAlertOpen(false, null)"
+    ></ion-alert>
+
+    <ion-alert
+        :is-open="infoAlertOpen"
+        :header="infoAlterData.title"
+        :message="infoAlterData.message"
+        :buttons="infoAlertButtons"
+        @didDismiss="setInfoAlertOpen(false)"
+    ></ion-alert>
+    <ion-loading
+        :is-open="delLoading"
+        message="删除中..."
+        @didDismiss="setDelLoadingOpen(false)" >
+    </ion-loading>
   </ion-page>
 </template>
-<script>
-import {defineComponent} from "vue";
-import {arrowBackOutline} from 'ionicons/icons';
-import {useRouter} from "vue-router";
+<script lang="ts">
+import {computed, defineComponent, reactive, ref, toRefs, watch} from "vue";
+import {addCircleOutline, arrowBackOutline, chevronDownOutline, chevronUpOutline, trashOutline} from 'ionicons/icons';
+import {useRoute, useRouter} from "vue-router";
+import {alertController, onIonViewDidEnter} from "@ionic/vue";
+import {baseInfoSave, getJobUserById} from "@/api/jobUserInfo";
+import {required} from "@vuelidate/validators";
+import {useVuelidate} from "@vuelidate/core";
+import {post} from "@/api/common";
+import {getSysDictionaryList} from "@/api/system/dictionary";
+import {getSiteDataList} from "@/api/siteInfo";
+import {getRegionCodeList, getStreetCodeList} from "@/api/system/area";
+import {getEducationListByJobUserID} from "@/api/education";
+import {getExperienceListByJobUserID} from "@/api/experience";
+import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
+import dayjs from "dayjs";
 
+interface SelectProps {
+  name: string,
+  value: string
+}
+interface StepParams{
+  loginUserID: string,
+  statusVal: number
+}
 export default defineComponent({
   name: "jobUserInfoEdit",
   setup() {
+    const route = useRoute();
     const router = useRouter();
+    const isAllowCommit = ref(true);
+    const expand = ref<boolean>(false);
+    const loading = ref(true);
+    const siteInfoList = ref<SelectProps[]>([]);
+    const curStepData = ref<StepParams>({
+      loginUserID:"",
+      statusVal: 1
+    });
+    const stepList = ref([
+      {title: '基础信息', desc: '个人基础信息', val: 1},
+      {title: '教育经历', desc: '完善教育经历',val: 2},
+      {title: '工作经验', desc: '完善工作经验', val: 3},
+      {title: '求职意向', desc: '个人求职意向', val: 4},
+    ]);
+    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<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
+    const nationTypeList  = ref<SelectProps[]>([]);
+    const familyNatureList = ref([]);
+    const politicsStatusList = ref([]);
+    const regionList  = ref<SelectProps[]>([]);
+    const streetList  = ref<SelectProps[]>([]);
+    const educationList = ref([]);
+    const experienceList = ref([]);
+    const jobHuntList = ref([]);
+    const baseInfoData = reactive({
+      baseData:{
+        jobUserID:null,
+        siteID:null,
+        name:null,
+        identityNumber: null,
+        sex: null,
+        userMobile: null,
+        address: null,
+        jobStatusID: null,
+        keyPersonTypeID: null,
+        nation:null,
+        politicsStatusID:null,
+        birthPlace:null,
+        birthDay:null,
+        familyNatureID: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:'',
+        hobby:null,
+        personalSkills:null,
+      }});
+    const pageParams = reactive({
+      pageIndex: 1,
+      pageSize: 5,
+      total:0,
+      jobUserID:''
+    });
+    const baseDataRule = computed(()=>{
+      return {baseData:{
+          siteID:{required},
+          name:{required},
+          identityNumber:{required:true,},
+          sex:{required},
+          userMobile:{required},
+          address:{required},
+          jobStatusID:{required},
+          keyPersonTypeID:{required},
+        }}
+    });
+    const baseDataValid = useVuelidate(baseDataRule,baseInfoData);
+
+    const expandChange= ()=>{
+      expand.value = !expand.value;
+    }
+    // 删除警告弹窗开关
+    const delAlertOpen = ref(false);
+
+    // 删除数据
+    const delID = ref("");
+    const postUrl = ref("jobUserService/education/deleteEducation");
+    const actionName = ref("删除教育经历信息");
+    // 删除加载
+    const delLoading = ref(false);
+    // 信息弹窗开关
+    const infoAlertOpen = ref(false);
+    // 删除警告弹窗按钮定义
+    const infoAlertButtons = [
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
+        },
+      },
+    ];
+    // 设置要删除的教育经历
+    function setDelAlertOpen(value: boolean, id: any) {
+      delAlertOpen.value = value;
+      if(id != null) {
+        delID.value = id;
+      }
+    }
+    // 设置信息提示弹窗开关
+    function setInfoAlertOpen(value: boolean) {
+      infoAlertOpen.value = value;
+    }
+    // 设置删除弹窗开启关闭
+    function setDelLoadingOpen(value: boolean) {
+      delLoading.value = value;
+    }
+    // 信息弹窗内容
+    const infoAlterData = reactive({
+      title:"",
+      message:""
+    });
+
+    // 删除警告弹窗按钮定义
+    const delAlertButtons = [
+      {
+        text: '取消',
+        role: 'cancel',
+        handler: () => {
+          console.log("取消了删除");
+        },
+      },
+      {
+        text: '确定',
+        role: 'confirm',
+        handler: () => {
+          delLoading.value = true;
+          postUrl.value = "jobUserService/education/deleteEducation";
+          actionName.value = "删除教育经历";
+          if(curStepData.value.statusVal!=2){
+            postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/delete";
+            actionName.value = curStepData.value.statusVal==3 ?"删除工作经验":"删除求职意向";
+          }
+          post(postUrl.value,[delID.value],actionName.value).then((res) => {
+            /*infoAlterData.title = "提示";
+            infoAlterData.message = "删除成功";
+            setInfoAlertOpen(true);*/
+          }).finally(()=>{
+            delLoading.value = false;
+            reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
+          });
+        },
+      },
+    ];
+    const presentAlert = async (message: string) => {
+      const alert = await alertController.create({
+        header: '错误!',
+        message: message,
+        buttons: [
+          '确定'
+        ],
+      });
+
+      await alert.present();
+    }
+
     const onBack = () => {
-      router.push('/jobUserInfo/index');
+      curStepData.value.statusVal-=1;
+      if(curStepData.value.statusVal > 0){
+        router.push({path:"/jobUserInfo/userEdit", query: {reload:0,educationID:null,jobHuntID:null,jobUserID: baseInfoData.baseData.jobUserID,status:curStepData.value.statusVal,loginUserId:curStepData.value.loginUserID}});
+      }else{
+        router.push('/jobUserInfo/index');
+      }
+    }
+
+    const inputDataValidate = () =>{
+      isAllowCommit.value = true;
+      const identReg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/;
+      if(baseInfoData.baseData.identityNumber != null){
+        if(!identReg.test(baseInfoData.baseData.identityNumber)){
+          presentAlert("输入的身份证号码有误!");
+          isAllowCommit.value = false;
+        }
+      }
+      const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
+      if(baseInfoData.baseData.userMobile != null){
+        if(!mobileReg.test(baseInfoData.baseData.userMobile)){
+          presentAlert("输入的联系电话有误!");
+          isAllowCommit.value = false;
+        }
+      }
+      const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
+      if(baseInfoData.baseData.email!=""&&baseInfoData.baseData.email!=null){
+        if(!emailReg.test(baseInfoData.baseData.email)){
+          presentAlert("输入的电子邮箱有误!");
+          isAllowCommit.value = false;
+        }
+      }
+    };
+
+    const onSave = async function (){
+      if (curStepData.value.statusVal==1){
+        const isFormCorrect = await baseDataValid.value.$validate();
+        if(!isFormCorrect){
+          await presentAlert("请填写完整的信息!");
+          return null;
+        }
+        inputDataValidate();
+        if(isAllowCommit.value){
+          baseInfoSave(baseInfoData.baseData).then(result => {
+            if (result) {
+              router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2,loginUserId:curStepData.value.loginUserID}});
+            }
+          });
+        }
+      }
+      else if (curStepData.value.statusVal==2){
+        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}});
+      }
+    }
+
+    const onPathForward = (pathValue:string,educationIDValue:any,experienceIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
+      console.log("userid",baseInfoData.baseData.jobUserID);
+      router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,experienceID:experienceIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue,loginUserID:curStepData.value.loginUserID}});
+    }
+
+    const onScroll = (e: any) => {
+      setTimeout(() => {
+        e.target.complete();
+        if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
+          pageParams.pageSize += 5;
+          loadData(pageParams.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
+        }
+      }, 500);
+    }
+
+    const onFinish = () => {
+      router.push('/jobUserInfo/finish');
+    }
+
+    /*下拉字典查询*/
+    const getSelectorDataList = async function(){
+      const genderResult :any = await getSysDictionaryList("Gender");
+      genderList.value = genderResult;
+      const jobUserStatusResult :any = await getSysDictionaryList("JobStatus");
+      jobUserStatusList.value = jobUserStatusResult;
+      const keyPersonTypeResult :any = await getSysDictionaryList("KeyPersonType");
+      keyPersonTypeList.value = keyPersonTypeResult;
+      const cultureRankResult :any = await getSysDictionaryList("CultureLevel");
+      cultureRankList.value = cultureRankResult;
+      const userHealthResult :any = await getSysDictionaryList("Health");
+      userHealthList.value = userHealthResult;
+      const bloodTypeResult :any = await getSysDictionaryList("BloodType");
+      bloodTypeList.value = bloodTypeResult;
+      const maritalStatusResult :any = await getSysDictionaryList("MaritalStatus");
+      maritalStatusList.value = maritalStatusResult;
+      const politicsStatusResult :any = await getSysDictionaryList("PoliticsStatus");
+      politicsStatusList.value = politicsStatusResult;
+      const familyNatureResult :any = await getSysDictionaryList("FamilyNature");
+      familyNatureList.value = familyNatureResult;
+      const nationTypeListResult :any = await getSysDictionaryList("NationType");
+      nationTypeList.value = nationTypeListResult;
     }
+
+    const getSiteInfoList = async function(){
+      const siteInfoResult :any = await getSiteDataList();
+      siteInfoList.value = siteInfoResult;
+    }
+    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,userId:any) => {
+      loading.value = true;
+      pageParams.jobUserID = jobUserID;
+      baseInfoData.baseData.jobUserID = jobUserID;
+      curStepData.value.statusVal = status;
+      curStepData.value.loginUserID = userId;
+      console.log("当前curStepData",curStepData.value);
+      if(curStepData.value.statusVal==1){
+        const reqData = await getJobUserById(jobUserID,userId);
+        baseInfoData.baseData = reqData;
+        console.log('baseData',baseInfoData.baseData);
+        await getStreetList();
+      }
+      else if(curStepData.value.statusVal==2){
+        const reqData :any = await getEducationListByJobUserID(pageParams);
+        educationList.value = reqData.list;
+        pageParams.total = reqData.total;
+        console.log("educationList",educationList.value);
+      }
+      else if(curStepData.value.statusVal==3){
+        const reqData = await getExperienceListByJobUserID(pageParams);
+        experienceList.value= reqData.list;
+        pageParams.total = reqData.total;
+        console.log("experienceList",experienceList.value);
+      }
+      else if(curStepData.value.statusVal==4){
+        const reqData = await getJobHuntListByJobUserID(pageParams);
+        jobHuntList.value= reqData.list;
+        pageParams.total = reqData.total;
+        console.log("jobHuntList",jobHuntList.value);
+      }
+      loading.value = false;
+    };
+
+    watch(() => route.query, () => {
+      if (route.query.reload) {
+        loadData(route.query.jobUserID,route.query.status,route.query.loginUserId);
+      }
+    });
+
+    const reload = (jobUserID:any,status:any,userId:any) => {
+      pageParams.pageIndex = 1;
+      expand.value = false;
+      console.log("status",status);
+      loadData(jobUserID,status,userId);
+    }
+
+    onIonViewDidEnter(() => {
+      if (route.query.reload)
+        reload(route.query.jobUserID,route.query.status,route.query.loginUserId);
+    });
+
     return {
+      ...toRefs(baseInfoData),
+      chevronDownOutline,
+      chevronUpOutline,
       arrowBackOutline,
-      onBack
+      addCircleOutline,
+      trashOutline,
+      route,
+      router,
+      expand,
+      loading,
+      stepList,
+      curStepData,
+      baseDataValid,
+      siteInfoList,
+      genderList,
+      nationTypeList,
+      familyNatureList,
+      politicsStatusList,
+      pageParams,
+      jobUserStatusList,
+      keyPersonTypeList,
+      cultureRankList,
+      userHealthList,
+      bloodTypeList,
+      maritalStatusList,
+      provinceList,
+      regionList,
+      streetList,
+      educationList,
+      experienceList,
+      jobHuntList,
+      delID,
+      delAlertButtons,
+      infoAlertButtons,
+      delAlertOpen,
+      infoAlertOpen,
+      delLoading,
+      infoAlterData,
+      expandChange,
+      provinceChange,
+      regionChange,
+      onSave,
+      onBack,
+      onFinish,
+      onScroll,
+      onPathForward,
+      loadData,
+      reload,
+      setDelAlertOpen,
+      setInfoAlertOpen,
+      setDelLoadingOpen,
+      getSiteInfoList,
+      getSelectorDataList,
+      getRegionList,
+      getStreetList,
+      dayjs
     }
+  },
+  mounted(){
+    this.getSiteInfoList();
+    this.getSelectorDataList();
+    this.getRegionList();
+    this.getStreetList();
   }
 });
 </script>
 <style lang="less">
+ion-select#siteID.md.select-disabled.legacy-select::after{display: none;}
+ion-select#regionCode.md.select-disabled.legacy-select::after{display: none;}
+.custom{
+  --placeholder-color: gray;
+  --placeholder-opacity: 0.5;
+}
+
+.title-item{
+  margin-left: 15px;
+  color:#1c3d70 !important;
+  font-size: 14px !important;
+  font-weight: bold;
+}
+
+.next-btn {
+  width: 80px;
+  border-radius: 5px;
+  background-color:#3a7be0;
+  color: #363432;
+  font-size: 14px;
+}
+
+.iconBtn{
+  width:24px;
+  height:24px;
+}
+
+.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>

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

@@ -5,9 +5,11 @@ 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.mapper.PcSiteMapper;
 import com.hz.employmentsite.mapper.PcSiteUserMapper;
 import com.hz.employmentsite.model.PcCompany;
 import com.hz.employmentsite.model.PcSite;
+import com.hz.employmentsite.model.PcSiteExample;
 import com.hz.employmentsite.model.PcSiteUserExample;
 import com.hz.employmentsite.services.service.AccountService;
 import com.hz.employmentsite.services.service.companyService.CompanyService;