userEdit.vue 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137
  1. <template>
  2. <ion-page class="list-page">
  3. <ion-header class="header-theme2">
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-icon :icon="arrowBackOutline" @click="onBack"></ion-icon>
  7. </ion-buttons>
  8. <ion-title>求职者信息登记</ion-title>
  9. </ion-toolbar>
  10. </ion-header>
  11. <ion-content>
  12. <div class="stepFlex">
  13. <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
  14. <div
  15. :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal == stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
  16. <div v-if="key !== stepList.length - 1"
  17. :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
  18. <div class="stepFlex-item-label">
  19. <p class="stepFlex-item-label-title">{{ record.title }}</p>
  20. <!--<p class="stepFlex-item-label-desc">{{ record.desc }}</p>-->
  21. </div>
  22. </div>
  23. </div>
  24. <form autocomplete="off">
  25. <div class="bw-vue-form">
  26. <ion-list v-if="curStepData.statusVal==1">
  27. <div class="form-title">基本信息</div>
  28. <div class="form-input">
  29. <ion-label>姓名<span class="danger">*</span></ion-label>
  30. <ion-input name="name" id="name" class="custom" :clear-input="true"
  31. placeholder="请输入姓名" v-model="baseData.name" >
  32. </ion-input>
  33. <!-- <ion-note slot="error">姓名不能为空</ion-note>-->
  34. </div>
  35. <div class="form-input">
  36. <ion-label>公民身份号码<span class="danger">*</span></ion-label>
  37. <ion-input name="identityNumber" id="identityNumber" class="custom" :clear-input="true"
  38. placeholder="请输入身份证号码" v-model="baseData.identityNumber" ></ion-input>
  39. <!-- <ion-note slot="error">公民身份号码不能为空</ion-note>-->
  40. </div>
  41. <div class="form-select">
  42. <ion-label>性别<span class="danger">*</span></ion-label>
  43. <ion-select disabled name="sex" id="sex" okText="确定" cancelText="取消" v-model="baseData.sex"
  44. interface="action-sheet" placeholder="请选择性别" style="width:100%;text-align:left;" >
  45. <ion-select-option v-for=" (it,key) in genderList" :key="key" :value="it.value" >{{ it.name }}</ion-select-option>
  46. </ion-select>
  47. <!-- <ion-note slot="error">性别不能为空</ion-note>-->
  48. </div>
  49. <div class="form-input">
  50. <ion-label>联系电话<span class="danger">*</span></ion-label>
  51. <ion-input name="userMobile" id="userMobile" style="text-align: left;" class="custom" :clear-input="true"
  52. placeholder="请输入联系电话" v-model="baseData.userMobile" ></ion-input>
  53. <!-- <ion-note slot="error">联系电话不能为空</ion-note>-->
  54. </div>
  55. <div class="form-select">
  56. <ion-label>所属驿站<span class="danger">*</span></ion-label>
  57. <ion-select disabled name="siteID" id="siteID" okText="确定" cancelText="取消" v-model="baseData.siteID"
  58. interface="action-sheet" placeholder="请选择所属驿站" style="width:100%;text-align:left;">
  59. <ion-select-option v-for=" (it,key) in siteInfoList" :key="key" :value="it.value">
  60. {{ it.text }}
  61. </ion-select-option>
  62. </ion-select>
  63. <!-- <ion-note slot="error">所属驿站不能为空</ion-note>-->
  64. </div>
  65. <ion-label style="padding-left: 10px;">所属街道<span class="danger">*</span></ion-label>
  66. <div class="form-select">
  67. <ion-select disabled name="regionCode" id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"
  68. interface="action-sheet" placeholder="请选择市/县" style="width:50%;float:left;" @ionChange="regionChange()" >
  69. <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">
  70. {{ it.name }}
  71. </ion-select-option>
  72. </ion-select>
  73. <ion-select interface="action-sheet" placeholder="请选择所属街道" cancel-text="取消"
  74. id="streetCode" v-model="baseData.streetCode" style="width: 50%;float: left;">
  75. <ion-select-option v-for="(record,key) in streetList" :key="key"
  76. v-model:value="record.code">
  77. {{ record.name }}
  78. </ion-select-option>
  79. </ion-select>
  80. </div>
  81. <!-- <div class="form-select">-->
  82. <!-- <ion-label>市/县<span class="danger">*</span></ion-label>-->
  83. <!-- <ion-select class="disable" disabled name="regionCode" id="regionCode" okText="确定" cancelText="取消" v-model="baseData.regionCode"-->
  84. <!-- interface="action-sheet" placeholder="请选择市/县" style="width:100%;text-align:left;" @ionChange="regionChange()" >-->
  85. <!-- <ion-select-option v-for=" (it,key) in regionList" :key="key" :value="it.code">-->
  86. <!-- {{ it.name }}-->
  87. <!-- </ion-select-option>-->
  88. <!-- </ion-select>-->
  89. <!-- </div>-->
  90. <!-- <div class="form-select">-->
  91. <!-- <ion-label>所在街道<span class="danger">*</span></ion-label>-->
  92. <!-- <ion-select name="streetCode" id="streetCode" okText="确定" cancelText="取消" v-model="baseData.streetCode"-->
  93. <!-- interface="action-sheet" placeholder="请选择镇/街" style="width:100%;text-align:left;">-->
  94. <!-- <ion-select-option v-for=" (it,key) in streetList" :key="key" :value="it.code">-->
  95. <!-- {{ it.name }}-->
  96. <!-- </ion-select-option>-->
  97. <!-- </ion-select>-->
  98. <!-- </div>-->
  99. <div class="form-input">
  100. <ion-label>住址<span class="danger">*</span></ion-label>
  101. <ion-input name="address" id="address" style="text-align: left;" class="custom" :clear-input="true"
  102. placeholder="请输入住址" v-model="baseData.address" ></ion-input>
  103. <!-- <ion-note slot="error">地址不能为空</ion-note>-->
  104. </div>
  105. <div class="form-select">
  106. <ion-label>就业状态<span class="danger">*</span></ion-label>
  107. <ion-select name="jobStatusID" id="jobStatusID" okText="确定" cancelText="取消" v-model="baseData.jobStatusID"
  108. interface="action-sheet" placeholder="请选择就业状态" style="width:100%;text-align:left;" >
  109. <ion-select-option v-for=" (it,key) in jobUserStatusList" :key="key" :value="it.value">{{ it.name }}</ion-select-option>
  110. </ion-select>
  111. <!-- <ion-note slot="error">就业状态不能为空</ion-note>-->
  112. </div>
  113. <div class="form-select">
  114. <ion-label>重点人员类别<span class="danger">*</span></ion-label>
  115. <ion-select name="keyPersonTypeID" id="keyPersonTypeID" okText="确定" cancelText="取消" v-model="baseData.keyPersonTypeID"
  116. interface="action-sheet" placeholder="请选择重点人员类别" style="width:100%;text-align:left;" >
  117. <ion-select-option v-for=" (it,key) in keyPersonTypeList" :key="key" :value="it.value">
  118. {{ it.name }}
  119. </ion-select-option>
  120. </ion-select>
  121. <!-- <ion-note slot="error">重点人员类别不能为空</ion-note>-->
  122. </div>
  123. <div class="form-select" >
  124. <ion-label>毕业日期<span v-show="isGraduating" class="danger">*</span></ion-label>
  125. <ion-datetime-button datetime="showFinishDate" style="position:absolute;left:10px;" ></ion-datetime-button>
  126. <ion-modal :keep-contents-mounted="true">
  127. <ion-datetime name="showFinishDate" id="showFinishDate" v-model="baseData.showFinishDate"
  128. dataformatas="YYYY-MM-DD" presentation="month-year" cancel-text="取消" done-text="确定"
  129. :show-default-buttons="true" @ionChange="finishDateChange()">
  130. </ion-datetime>
  131. </ion-modal>
  132. </div>
  133. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  134. <div class="form-title">
  135. 其他信息
  136. <div style="float: right;">
  137. <ion-label style="color: red;font-size: 14px;" @click="expand=!expand">{{expand?"收起":"展开"}}</ion-label>
  138. </div>
  139. </div>
  140. <div v-if="expand">
  141. <div class="form-input">
  142. <ion-label>社会保障卡号</ion-label>
  143. <ion-input name="socialSecurityCard" id="socialSecurityCard" style="text-align: left;" class="custom" :clear-input="true"
  144. placeholder="请输入社会保障卡号" v-model="baseData.socialSecurityCard" ></ion-input>
  145. </div>
  146. <div class="form-select">
  147. <ion-label>政治面貌</ion-label>
  148. <ion-select name="politicsStatusID" id="politicsStatusID" okText="确定" cancelText="取消" v-model="baseData.politicsStatusID"
  149. interface="action-sheet" placeholder="请选择政治面貌" style="width:100%;text-align:left;" >
  150. <ion-select-option v-for=" (it,key) in politicsStatusList" :key="key" :value="it.value">
  151. {{ it.name }}
  152. </ion-select-option>
  153. </ion-select>
  154. </div>
  155. <div class="form-select">
  156. <ion-label>民族</ion-label>
  157. <ion-select name="nationID" id="nationID" okText="确定" cancelText="取消" v-model="baseData.nation"
  158. interface="action-sheet" placeholder="请选择民族" style="width:100%;text-align:left;" >
  159. <ion-select-option v-for=" (it,key) in nationTypeList" :key="key" :value="it.value">
  160. {{ it.name }}
  161. </ion-select-option>
  162. </ion-select>
  163. <!-- <ion-input name="nation" id="nation" style="text-align: left;" class="custom" :clear-input="true"
  164. v-model="baseData.nation" placeholder="请输入民族" ></ion-input>-->
  165. </div>
  166. <div class="form-input">
  167. <ion-label>毕业院校</ion-label>
  168. <ion-input name="finishSchool" id="finishSchool" style="text-align: left;" class="custom" :clear-input="true"
  169. placeholder="请输入毕业院校" v-model="baseData.finishSchool" ></ion-input>
  170. </div>
  171. <div class="form-input">
  172. <ion-label>专业</ion-label>
  173. <ion-input name="professionID" id="profession" style="text-align: left;" class="custom" :clear-input="true"
  174. placeholder="请输入专业" v-model="baseData.profession" ></ion-input>
  175. </div>
  176. <div class="form-select">
  177. <ion-label>是否非全日制</ion-label>
  178. <ion-select name="isFullTime" id="isFullTime" okText="确定" cancelText="取消" v-model="baseData.isFullTime"
  179. interface="action-sheet" placeholder="请选择是否非全日制" style="width:100%;text-align:left;" >
  180. <ion-select-option v-for=" (it,key) in isFullTimeList" :key="key" :value="it.value">
  181. {{ it.name }}
  182. </ion-select-option>
  183. </ion-select>
  184. </div>
  185. <div class="form-input">
  186. <ion-label>职业资格类别</ion-label>
  187. <div>
  188. <ion-input placeholder="请选择职业资格类别" label-placement="stacked" style="float: left;width:78%;"
  189. v-model="baseData.occupationalCategoryName" class="custom" readonly >
  190. </ion-input>
  191. <ion-item style="width:22%;float: right;padding:0px;margin: 0px;">
  192. <category-selection :OccupationalID="baseData.occupationalCategory" @SetOccupationalID="onSetOccupationalID"></category-selection>
  193. </ion-item>
  194. </div>
  195. <!-- <ion-select name="occupationalCategory" id="occupationalCategory" okText="确定" cancelText="取消" v-model="baseData.occupationalCategory"-->
  196. <!-- interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >-->
  197. <!-- <ion-select-option v-for=" (it,key) in occupationalCategoryList" :key="key" :value="it.value">-->
  198. <!-- {{ it.name }}-->
  199. <!-- </ion-select-option>-->
  200. <!-- </ion-select>-->
  201. </div>
  202. <div class="form-select">
  203. <ion-label>职业资格等级</ion-label>
  204. <ion-select name="occupationalLevel" id="occupationalLevel" okText="确定" cancelText="取消" v-model="baseData.occupationalLevel"
  205. interface="action-sheet" placeholder="请选择职业资格类别" style="width:100%;text-align:left;" >
  206. <ion-select-option v-for=" (it,key) in occupationalLevelList" :key="key" :value="it.value">
  207. {{ it.name }}
  208. </ion-select-option>
  209. </ion-select>
  210. </div>
  211. <div class="form-input">
  212. <ion-label>籍贯</ion-label>
  213. <ion-input name="nativePlace" id="nativePlace" style="text-align: left;" class="custom" :clear-input="true"
  214. v-model="baseData.nativePlace" placeholder="请输入籍贯" ></ion-input>
  215. </div>
  216. <div class="form-input">
  217. <ion-label>出生地</ion-label>
  218. <ion-input name="birthPlace" id="birthPlace" style="text-align: left;" class="custom"
  219. :clear-input="true"
  220. v-model="baseData.birthPlace" placeholder="请输入出生地"></ion-input>
  221. </div>
  222. <div class="form-select" >
  223. <ion-label>出生日期</ion-label>
  224. <ion-datetime-button disabled datetime="birthDay" style="position:absolute;left:10px;"></ion-datetime-button>
  225. <ion-modal :keep-contents-mounted="true">
  226. <ion-datetime name="birthDay" id="birthDay" placeholder="日期"
  227. v-model="baseData.birthDay" :prefer-wheel="true"
  228. dataformatas="YYYY-MM-DD" presentation="date" cancel-text="取消" done-text="确定"
  229. :show-default-buttons="true">
  230. </ion-datetime>
  231. </ion-modal>
  232. </div>
  233. <div style="width:100%;overflow: hidden;height: 30px;"></div>
  234. <div class="form-select">
  235. <ion-label>户口性质</ion-label>
  236. <ion-select name="familyNatureID" id="familyNatureID" okText="确定" cancelText="取消" v-model="baseData.familyNatureID"
  237. interface="action-sheet" placeholder="请选择户口性质" style="width:100%;text-align:left;">
  238. <ion-select-option v-for=" (it,key) in familyNatureList" :key="key" :value="it.value">
  239. {{ it.name }}
  240. </ion-select-option>
  241. </ion-select>
  242. </div>
  243. <div class="form-select">
  244. <ion-label>最高学历</ion-label>
  245. <ion-select name="cultureRank" id="cultureRank" okText="确定" cancelText="取消" v-model="baseData.cultureRank"
  246. interface="action-sheet" placeholder="请选择最高学历" style="width:100%;text-align:left;">
  247. <ion-select-option v-for=" (it,key) in cultureRankList" :key="key" :value="it.value">
  248. {{ it.name }}
  249. </ion-select-option>
  250. </ion-select>
  251. </div>
  252. <div class="form-select">
  253. <ion-label>健康状况</ion-label>
  254. <ion-select name="healthID" id="healthID" okText="确定" cancelText="取消" v-model="baseData.healthID"
  255. interface="action-sheet" placeholder="请选择健康状况" style="width:100%;text-align:left;">
  256. <ion-select-option v-for=" (it,key) in userHealthList" :key="key" :value="it.value">
  257. {{ it.name }}
  258. </ion-select-option>
  259. </ion-select>
  260. </div>
  261. <!-- <div class="form-select">-->
  262. <!-- <ion-label>血型</ion-label>-->
  263. <!-- <ion-select name="bloodTypeID" id="bloodTypeID" okText="确定" cancelText="取消" v-model="baseData.bloodTypeID"-->
  264. <!-- interface="action-sheet" placeholder="请选择血型" style="width:100%;text-align:left;">-->
  265. <!-- <ion-select-option v-for=" (it,key) in bloodTypeList" :key="key" :value="it.value">-->
  266. <!-- {{ it.name }}-->
  267. <!-- </ion-select-option>-->
  268. <!-- </ion-select>-->
  269. <!-- </div>-->
  270. <div class="form-input">
  271. <ion-label>身高(cm)</ion-label>
  272. <ion-input name="height" id="height" style="text-align: left;" class="custom" :clear-input="true"
  273. placeholder="请输入身高" v-model="baseData.height" ></ion-input>
  274. </div>
  275. <div class="form-input">
  276. <ion-label>视力</ion-label>
  277. <ion-input name="vision" id="vision" style="text-align: left;" class="custom" :clear-input="true"
  278. placeholder="如5.0" v-model="baseData.vision" ></ion-input>
  279. </div>
  280. <div class="form-input">
  281. <ion-label>体重(kg)</ion-label>
  282. <ion-input name="weight" id="weight" style="text-align: left;" class="custom" :clear-input="true"
  283. placeholder="请输入体重" v-model="baseData.weight" ></ion-input>
  284. </div>
  285. <div class="form-select">
  286. <ion-label>婚姻状况</ion-label>
  287. <ion-select name="maritalStatusID" id="maritalStatusID" okText="确定" cancelText="取消" v-model="baseData.maritalStatusID"
  288. interface="action-sheet" placeholder="请选择婚姻状况" style="width:100%;text-align:left;">
  289. <ion-select-option v-for=" (it,key) in maritalStatusList" :key="key" :value="it.value">
  290. {{ it.name }}
  291. </ion-select-option>
  292. </ion-select>
  293. </div>
  294. <!-- <div class="form-select">
  295. <ion-label>省份</ion-label>
  296. <ion-select name="provinceCode" id="provinceCode" okText="确定" cancelText="取消" v-model="baseData.provinceCode"
  297. interface="action-sheet" placeholder="请选择省份" style="width:100%;text-align:left;" @change="provinceChange()" >
  298. <ion-select-option v-for=" (it,key) in provinceList" :key="key" :value="it.value">
  299. {{ it.name }}
  300. </ion-select-option>
  301. </ion-select>
  302. </div>-->
  303. <div class="form-input">
  304. <ion-label>联系人员</ion-label>
  305. <ion-input name="userName" id="userName" style="text-align: left;" class="custom" :clear-input="true"
  306. placeholder="请输入联系人员" v-model="baseData.userName" ></ion-input>
  307. </div>
  308. <!-- <div class="form-input">-->
  309. <!-- <ion-label>邮政编码</ion-label>-->
  310. <!-- <ion-input name="birthPlace" id="postalCode" style="text-align: left;" class="custom" :clear-input="true"-->
  311. <!-- placeholder="请输入邮政编码" v-model="baseData.postalCode"></ion-input>-->
  312. <!-- </div>-->
  313. <div class="form-input">
  314. <ion-label>电子邮箱</ion-label>
  315. <ion-input name="email" id="email" style="text-align: left;" class="custom" :clear-input="true"
  316. placeholder="请输入电子邮箱" v-model="baseData.email" ></ion-input>
  317. </div>
  318. <div class="form-input">
  319. <ion-label>家庭住址</ion-label>
  320. <ion-textarea name="familyAddress" id="familyAddress" class="custom" rows="4"
  321. placeholder="请输入家庭住址" v-model="baseData.familyAddress" style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
  322. </div>
  323. <div class="form-input">
  324. <ion-label>兴趣爱好</ion-label>
  325. <ion-textarea name="hobby" id="hobby" class="custom" rows="4"
  326. placeholder="请输入兴趣爱好" v-model="baseData.hobby" style="border-bottom: 1px solid #fff2e8;" ></ion-textarea>
  327. </div>
  328. <div class="form-input">
  329. <ion-label>个人技能</ion-label>
  330. <ion-textarea name="personalSkills" id="personalSkills" class="custom" rows="4"
  331. placeholder="请输入个人技能" v-model="baseData.personalSkills"
  332. style="border-bottom: 1px solid #fff2e8;"></ion-textarea>
  333. </div>
  334. <div class="form-input">
  335. <ion-label>
  336. 图片上传
  337. </ion-label>
  338. <b-image v-if="baseData.jobUserID" :file-ref-id="baseData.jobUserID" :readonly="false"
  339. :is-single="false"></b-image>
  340. </div>
  341. </div>
  342. </ion-list>
  343. <ion-list v-if="curStepData.statusVal==2" >
  344. <div class="form-title">
  345. 教育经历
  346. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  347. @click="onPathForward('./educationEdit',null,null,null,2)"></ion-icon>
  348. </div>
  349. <div class="bw-vue-list">
  350. <div class="list-content" v-if="!loading">
  351. <ion-list>
  352. <div v-for="(record,key) in educationList" :key="key" >
  353. <ion-item-sliding>
  354. <ion-item detail @click="onPathForward('./educationEdit',record.educationID,null,null,2)">
  355. <ion-label>
  356. <h2>{{record.schoolName}}</h2>
  357. <p>{{dayjs(record.schoolTime).format("YYYY-MM-DD")}}至{{dayjs(record.overTime).format("YYYY-MM-DD")}}</p>
  358. </ion-label>
  359. </ion-item>
  360. <ion-item-options>
  361. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.educationID)">
  362. <ion-icon :icon="trashOutline"></ion-icon>
  363. </ion-item-option>
  364. </ion-item-options>
  365. </ion-item-sliding>
  366. </div>
  367. </ion-list>
  368. </div>
  369. </div>
  370. <b-empty v-if="educationList.length==0" :loading="loading" />
  371. </ion-list>
  372. <ion-list v-if="curStepData.statusVal==3" >
  373. <div class="form-title">
  374. 工作经验
  375. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  376. @click="onPathForward('./experienceEdit',null,null,null,3)"></ion-icon>
  377. </div>
  378. <div class="bw-vue-list">
  379. <div class="list-content" v-if="!loading">
  380. <ion-list>
  381. <div v-for="(record,key) in experienceList" :key="key">
  382. <ion-item-sliding>
  383. <ion-item detail @click="onPathForward('./experienceEdit',null,record.experienceID,null,3)">
  384. <ion-label>
  385. <h2>{{record.workAddress}}</h2>
  386. <p>{{dayjs(record.startTime).format("YYYY-MM-DD")}}至{{dayjs(record.endTime).format("YYYY-MM-DD")}}</p>
  387. </ion-label>
  388. </ion-item>
  389. <ion-item-options>
  390. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.experienceID)">
  391. <ion-icon :icon="trashOutline"></ion-icon>
  392. </ion-item-option>
  393. </ion-item-options>
  394. </ion-item-sliding>
  395. </div>
  396. </ion-list>
  397. </div>
  398. </div>
  399. <b-empty v-if="experienceList.length==0" :loading="loading" />
  400. </ion-list>
  401. <ion-list v-if="curStepData.statusVal==4">
  402. <div class="form-title">
  403. 求职意向
  404. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  405. @click="onPathForward('./jobHuntEdit',null,null,null,4)"></ion-icon>
  406. </div>
  407. <div class="bw-vue-list">
  408. <div class="list-content" v-if="!loading">
  409. <ion-list>
  410. <div v-for="(record,key) in jobHuntList" :key="key">
  411. <ion-item-sliding>
  412. <ion-item detail @click="onPathForward('./jobHuntEdit',null,null,record.jobHuntID,4)">
  413. <ion-label>
  414. <h2>{{record.professionName}}</h2>
  415. <p>期望薪资:{{record.minSalary}}-{{record.maxSalary}}</p>
  416. </ion-label>
  417. </ion-item>
  418. <ion-item-options>
  419. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.jobHuntID)">
  420. <ion-icon :icon="trashOutline"></ion-icon>
  421. </ion-item-option>
  422. </ion-item-options>
  423. </ion-item-sliding>
  424. </div>
  425. </ion-list>
  426. </div>
  427. </div>
  428. <b-empty v-if="jobHuntList.length==0" :loading="loading" />
  429. </ion-list>
  430. <ion-infinite-scroll v-if="curStepData.statusVal!=1" threshold="100px" @ionInfinite="onScroll($event)">
  431. <ion-infinite-scroll-content
  432. :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
  433. loadingSpinner="bubbles">
  434. </ion-infinite-scroll-content>
  435. </ion-infinite-scroll>
  436. </div>
  437. </form>
  438. </ion-content>
  439. <ion-footer>
  440. <ion-toolbar>
  441. <ion-button style="width: 100%;" @click="onSave" v-if="curStepData.statusVal==1">保存并下一步</ion-button>
  442. <div v-if="curStepData.statusVal!=1" >
  443. <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
  444. <ion-button style="width: 48%;margin-right: 1%;" @click="onSave" v-if="curStepData.statusVal!=4">下一步</ion-button>
  445. <ion-button style="width: 48%;margin-right: 1%;" @click="onFinish" v-if="curStepData.statusVal==4">完 成</ion-button>
  446. </div>
  447. </ion-toolbar>
  448. </ion-footer>
  449. <ion-alert
  450. :is-open="delAlertOpen"
  451. header="删除确认"
  452. message="确定要删除该信息吗?"
  453. :buttons="delAlertButtons"
  454. @didDismiss="setDelAlertOpen(false, null)"
  455. ></ion-alert>
  456. <ion-alert
  457. :is-open="infoAlertOpen"
  458. :header="infoAlterData.title"
  459. :message="infoAlterData.message"
  460. :buttons="infoAlertButtons"
  461. @didDismiss="setInfoAlertOpen(false)"
  462. ></ion-alert>
  463. <ion-loading
  464. :is-open="delLoading"
  465. message="删除中..."
  466. @didDismiss="setDelLoadingOpen(false)" >
  467. </ion-loading>
  468. </ion-page>
  469. </template>
  470. <script lang="ts">
  471. import {computed, defineComponent, reactive, ref, toRefs, watch} from "vue";
  472. import {addCircleOutline, arrowBackOutline, trashOutline} from 'ionicons/icons';
  473. import {useRoute, useRouter} from "vue-router";
  474. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  475. import {baseInfoSave, getJobUserById} from "@/api/jobUserInfo";
  476. import {required} from "@vuelidate/validators";
  477. import {useVuelidate} from "@vuelidate/core";
  478. import {post} from "@/api/common";
  479. import {getSysDictionaryList} from "@/api/system/dictionary";
  480. import {getSiteDataList} from "@/api/siteInfo";
  481. import {getRegionCodeList, getStreetCodeList} from "@/api/system/area";
  482. import {getEducationListByJobUserID} from "@/api/education";
  483. import {getExperienceListByJobUserID} from "@/api/experience";
  484. import {getJobHuntListByJobUserID} from "@/api/jobHuntInfo";
  485. import dayjs from "dayjs";
  486. import CategorySelection from "@/components/ocCategorySelection.vue";
  487. import {getPosition} from "@/utils/position";
  488. import crtyptoHelp from "@/utils/crypto"
  489. import BImage from "@/components/bImage.vue";
  490. import {getUrlParams} from "@/utils/urlUtils";
  491. interface SelectProps {
  492. name: string,
  493. value: string
  494. }
  495. interface StepParams{
  496. loginUserID: string,
  497. statusVal: number
  498. }
  499. export default defineComponent({
  500. name: "jobUserInfoEdit",
  501. components: {BImage, CategorySelection},
  502. setup() {
  503. const route = useRoute();
  504. const router = useRouter();
  505. const curOpenID = ref("");
  506. const urlParams:{[key:string]:any} = getUrlParams();
  507. const isAllowCommit = ref(true);
  508. const expand = ref<boolean>(false);
  509. const loading = ref(true);
  510. const siteInfoList = ref<SelectProps[]>([]);
  511. const curStepData = ref<StepParams>({
  512. loginUserID:"",
  513. statusVal: 1
  514. });
  515. const stepList = ref([
  516. {title: '基础信息', desc: '个人基础信息', val: 1},
  517. {title: '教育经历', desc: '完善教育经历',val: 2},
  518. {title: '工作经验', desc: '完善工作经验', val: 3},
  519. {title: '求职意向', desc: '个人求职意向', val: 4},
  520. ]);
  521. const genderList = ref<SelectProps[]>([]);
  522. const jobUserStatusList = ref<SelectProps[]>([]);
  523. const keyPersonTypeList = ref<SelectProps[]>([]);
  524. const cultureRankList = ref<SelectProps[]>([]);
  525. const userHealthList = ref<SelectProps[]>([]);
  526. const bloodTypeList = ref<SelectProps[]>([]);
  527. const maritalStatusList = ref<SelectProps[]>([]);
  528. const provinceList = ref<SelectProps[]>([{name:'广东省',value:'440000000000000'}]);
  529. const nationTypeList = ref<SelectProps[]>([]);
  530. const isFullTimeList = ref<SelectProps[]>([]);
  531. //const occupationalCategoryList = ref<SelectProps[]>([]);
  532. const occupationalLevelList = ref<SelectProps[]>([]);
  533. const familyNatureList = ref([]);
  534. const politicsStatusList = ref([]);
  535. const regionList = ref<SelectProps[]>([]);
  536. const streetList = ref<SelectProps[]>([]);
  537. const educationList = ref([]);
  538. const experienceList = ref([]);
  539. const jobHuntList = ref([]);
  540. const baseInfoData = reactive({
  541. baseData:{
  542. jobUserID:null,
  543. siteID:null,
  544. name:null,
  545. identityNumber: null,
  546. sex: 1,
  547. userMobile: null,
  548. address: null,
  549. jobStatusID: null,
  550. keyPersonTypeID: null,
  551. politicsStatusID:null,
  552. birthPlace:null,
  553. birthDay:dayjs().format("YYYY-MM-DD"),
  554. familyNatureID:null,
  555. cultureRank:null,
  556. healthID:null,
  557. //bloodTypeID:null,
  558. height:null,
  559. vision:null,
  560. weight:null,
  561. maritalStatusID:null,
  562. provinceCode:null,
  563. regionCode:null,
  564. streetCode:null,
  565. userName:null,
  566. familyAddress:null,
  567. postalCode:null,
  568. email:'',
  569. hobby:null,
  570. personalSkills:null,
  571. socialSecurityCard:"",
  572. finishSchool:null,
  573. finishDate:"",
  574. showFinishDate:dayjs().format("YYYY-MM-DD"),
  575. profession:null,
  576. nativePlace:null,
  577. isFullTime:null,
  578. occupationalCategory:null,
  579. occupationalCategoryName:null,
  580. occupationalLevel:null,
  581. openId:"",
  582. isAppInsert:1,
  583. loginUserID: '',
  584. longitude: null,
  585. latitude: null
  586. }});
  587. const pageParams = reactive({
  588. pageIndex: 1,
  589. pageSize: 5,
  590. total:0,
  591. jobUserID:'',
  592. openID:''
  593. });
  594. const baseDataRule = computed(()=>{
  595. return {baseData:{
  596. siteID:{required},
  597. regionCode:{required},
  598. streetCode:{required},
  599. name:{required},
  600. identityNumber:{required},
  601. sex:{required},
  602. userMobile:{required},
  603. address:{required},
  604. jobStatusID:{required},
  605. keyPersonTypeID:{required},
  606. }}
  607. });
  608. const baseDataValid = useVuelidate(baseDataRule,baseInfoData);
  609. // 删除警告弹窗开关
  610. const delAlertOpen = ref(false);
  611. // 删除数据
  612. const delID = ref("");
  613. const postUrl = ref("jobUserService/education/deleteEducation");
  614. const actionName = ref("删除教育经历信息");
  615. // 删除加载
  616. const delLoading = ref(false);
  617. // 信息弹窗开关
  618. const infoAlertOpen = ref(false);
  619. // 删除警告弹窗按钮定义
  620. const infoAlertButtons = [
  621. {
  622. text: '确定',
  623. role: 'confirm',
  624. handler: () => {
  625. reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
  626. },
  627. },
  628. ];
  629. // 设置要删除的教育经历
  630. function setDelAlertOpen(value: boolean, id: any) {
  631. delAlertOpen.value = value;
  632. if(id != null) {
  633. delID.value = id;
  634. }
  635. }
  636. // 设置信息提示弹窗开关
  637. function setInfoAlertOpen(value: boolean) {
  638. infoAlertOpen.value = value;
  639. }
  640. // 设置删除弹窗开启关闭
  641. function setDelLoadingOpen(value: boolean) {
  642. delLoading.value = value;
  643. }
  644. // 信息弹窗内容
  645. const infoAlterData = reactive({
  646. title:"",
  647. message:""
  648. });
  649. // 删除警告弹窗按钮定义
  650. const delAlertButtons = [
  651. {
  652. text: '取消',
  653. role: 'cancel',
  654. handler: () => {
  655. console.log("取消了删除");
  656. },
  657. },
  658. {
  659. text: '确定',
  660. role: 'confirm',
  661. handler: () => {
  662. delLoading.value = true;
  663. postUrl.value = "jobUserService/education/deleteEducation";
  664. actionName.value = "删除教育经历";
  665. if(curStepData.value.statusVal!=2){
  666. postUrl.value = curStepData.value.statusVal==3 ?"jobUserService/experience/deleteExperience":"jobUserService/jobHunt/delete";
  667. actionName.value = curStepData.value.statusVal==3 ?"删除工作经验":"删除求职意向";
  668. }
  669. post(postUrl.value,[delID.value],actionName.value).then((res) => {
  670. /*infoAlterData.title = "提示";
  671. infoAlterData.message = "删除成功";
  672. setInfoAlertOpen(true);*/
  673. }).finally(()=>{
  674. delLoading.value = false;
  675. reload(baseInfoData.baseData.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
  676. });
  677. },
  678. },
  679. ];
  680. const presentAlert = async (message: string) => {
  681. const alert = await alertController.create({
  682. header: '错误!',
  683. message: message,
  684. buttons: [
  685. '确定'
  686. ],
  687. });
  688. await alert.present();
  689. }
  690. const onBack = () => {
  691. curStepData.value.statusVal-=1;
  692. if(curStepData.value.statusVal > 0){
  693. router.push({path:"/jobUserInfo/userEdit", query: {reload:0,educationID:null,jobHuntID:null,jobUserID: baseInfoData.baseData.jobUserID,status:curStepData.value.statusVal,loginUserId:curStepData.value.loginUserID}});
  694. }else{
  695. router.push({path:'/jobUserInfo/index', query: {userId: route.query.loginUserId,openId: curOpenID.value}});
  696. }
  697. }
  698. const inputDataValidate = () =>{
  699. isAllowCommit.value = true;
  700. const identReg = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}([0-9Xx])$/;
  701. if(baseInfoData.baseData.identityNumber != null){
  702. if(!identReg.test(baseInfoData.baseData.identityNumber)){
  703. presentAlert("输入的身份证号码有误!");
  704. isAllowCommit.value = false;
  705. }else{
  706. // 计算身份证校验码
  707. const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  708. const checkCode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  709. let sum = 0;
  710. for(let i = 0; i<weights.length;i++){
  711. sum += weights[i] * parseInt(String(baseInfoData.baseData.identityNumber).substring(i,i+1));
  712. }
  713. if(String(baseInfoData.baseData.identityNumber).substring(17,18)!=checkCode[sum%11]){
  714. presentAlert("输入的身份证号码有误!");
  715. console.log("lastOne",checkCode[sum%11]);
  716. isAllowCommit.value = false;
  717. }
  718. }
  719. }
  720. const mobileReg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  721. if(baseInfoData.baseData.userMobile != null){
  722. if(!mobileReg.test(baseInfoData.baseData.userMobile)){
  723. presentAlert("输入的联系电话有误!");
  724. isAllowCommit.value = false;
  725. }
  726. }
  727. const emailReg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  728. if(baseInfoData.baseData.email!=""&&baseInfoData.baseData.email!=null){
  729. if(!emailReg.test(baseInfoData.baseData.email)){
  730. presentAlert("输入的电子邮箱有误!");
  731. isAllowCommit.value = false;
  732. }
  733. }
  734. };
  735. const onSetOccupationalID = (data: any)=>{
  736. baseInfoData.baseData.occupationalCategory = data.value;
  737. baseInfoData.baseData.occupationalCategoryName = data.text;
  738. }
  739. const onSave = async function (){
  740. if (curStepData.value.statusVal==1){
  741. const isFormCorrect = await baseDataValid.value.$validate();
  742. if(!isFormCorrect){
  743. await presentAlert("请填写完整的信息!");
  744. return null;
  745. }
  746. inputDataValidate();
  747. if(isAllowCommit.value){
  748. baseInfoData.baseData.loginUserID = curStepData.value.loginUserID;
  749. const userMobile = baseInfoData.baseData.userMobile;
  750. const identityNumber = baseInfoData.baseData.identityNumber;
  751. baseInfoData.baseData.isAppInsert = 1;
  752. baseInfoData.baseData.userMobile = crtyptoHelp.encryptDesText(userMobile);
  753. baseInfoData.baseData.identityNumber = crtyptoHelp.encryptDesText(identityNumber);
  754. baseInfoSave(baseInfoData.baseData).then(result => {
  755. if (result) {
  756. router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:2,loginUserId:curStepData.value.loginUserID}});
  757. }
  758. }, () =>{
  759. baseInfoData.baseData.userMobile = userMobile;
  760. baseInfoData.baseData.identityNumber = identityNumber;
  761. });
  762. }
  763. }
  764. else if (curStepData.value.statusVal==2){
  765. await router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:3,loginUserId:curStepData.value.loginUserID}});
  766. }else if (curStepData.value.statusVal==3){
  767. await router.push({path: '/jobUserInfo/userEdit', query: {reload:0,jobUserID: baseInfoData.baseData.jobUserID,status:4,loginUserId:curStepData.value.loginUserID}});
  768. }
  769. }
  770. const onPathForward = (pathValue:string,educationIDValue:any,experienceIDValue:any,jobHuntIDValue:any,statusValue:any)=>{
  771. router.push({path: pathValue, query: {reload:1,educationID:educationIDValue,experienceID:experienceIDValue,jobHuntID:jobHuntIDValue,jobUserID: baseInfoData.baseData.jobUserID,status:statusValue,loginUserID:curStepData.value.loginUserID}});
  772. }
  773. const onScroll = (e: any) => {
  774. setTimeout(() => {
  775. e.target.complete();
  776. if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
  777. pageParams.pageSize += 5;
  778. loadData(pageParams.jobUserID,curStepData.value.statusVal,curStepData.value.loginUserID);
  779. }
  780. }, 500);
  781. }
  782. const onFinish = () => {
  783. router.push('/jobUserInfo/finish');
  784. }
  785. /*下拉字典查询*/
  786. const getSelectorDataList = async function(){
  787. const genderResult :any = await getSysDictionaryList("Gender");
  788. genderList.value = genderResult;
  789. const jobUserStatusResult :any = await getSysDictionaryList("JobStatus");
  790. jobUserStatusList.value = jobUserStatusResult;
  791. const keyPersonTypeResult :any = await getSysDictionaryList("KeyPersonType");
  792. keyPersonTypeList.value = keyPersonTypeResult;
  793. const cultureRankResult :any = await getSysDictionaryList("HighestDegree");
  794. cultureRankList.value = cultureRankResult;
  795. const userHealthResult :any = await getSysDictionaryList("Health");
  796. userHealthList.value = userHealthResult;
  797. const bloodTypeResult :any = await getSysDictionaryList("BloodType");
  798. bloodTypeList.value = bloodTypeResult;
  799. const maritalStatusResult :any = await getSysDictionaryList("MaritalStatus");
  800. maritalStatusList.value = maritalStatusResult;
  801. const politicsStatusResult :any = await getSysDictionaryList("PoliticsStatus");
  802. politicsStatusList.value = politicsStatusResult;
  803. const familyNatureResult :any = await getSysDictionaryList("FamilyNature");
  804. familyNatureList.value = familyNatureResult;
  805. const nationTypeListResult :any = await getSysDictionaryList("NationType");
  806. nationTypeList.value = nationTypeListResult;
  807. const isFullTimeListResult :any = await getSysDictionaryList("IsFullTime");
  808. isFullTimeList.value = isFullTimeListResult;
  809. //const occupationalCategoryListResult :any = await getSysDictionaryList("OccupationalCategory");
  810. //occupationalCategoryList.value = occupationalCategoryListResult;
  811. const occupationalLevelListResult :any = await getSysDictionaryList("OccupationalLevel");
  812. occupationalLevelList.value = occupationalLevelListResult;
  813. }
  814. const getSiteInfoList = async function(){
  815. const siteInfoResult :any = await getSiteDataList();
  816. siteInfoList.value = siteInfoResult;
  817. }
  818. const getRegionList = async function(){
  819. const regionResult: any = await getRegionCodeList();
  820. regionList.value = regionResult;
  821. }
  822. const getStreetList = async function(){
  823. if (baseInfoData.baseData.regionCode != null){
  824. const streetResult: any = await getStreetCodeList(baseInfoData.baseData.regionCode);
  825. streetList.value = streetResult;
  826. }
  827. }
  828. const finishDateChange = function(){
  829. baseInfoData.baseData.finishDate = baseInfoData.baseData.showFinishDate.substring(0,7);
  830. console.log(baseInfoData.baseData.finishDate);
  831. }
  832. const isGraduating = ref(false);
  833. const keyPersonTypeChange = function (){
  834. isGraduating.value = false;
  835. if(baseInfoData.baseData.keyPersonTypeID==2){
  836. isGraduating.value = true;
  837. }
  838. }
  839. const regionChange = async function(){
  840. baseInfoData.baseData.streetCode = null;
  841. await getStreetList();
  842. }
  843. const provinceChange = async function(){
  844. baseInfoData.baseData.regionCode = null;
  845. await getRegionList();
  846. await regionChange();
  847. }
  848. const loadData = async (jobUserID: any,status:any,userId:any) => {
  849. loading.value = true;
  850. pageParams.jobUserID = jobUserID;
  851. pageParams.openID = curOpenID.value;
  852. baseInfoData.baseData.jobUserID = jobUserID;
  853. curStepData.value.statusVal = status;
  854. curStepData.value.loginUserID = userId;
  855. if(curStepData.value.statusVal==1){
  856. const reqData = await getJobUserById(jobUserID,userId,true);
  857. baseInfoData.baseData = reqData;
  858. baseInfoData.baseData.openId = curOpenID.value;
  859. baseInfoData.baseData.userMobile = crtyptoHelp.decryptDesText(baseInfoData.baseData.userMobile);
  860. baseInfoData.baseData.identityNumber = crtyptoHelp.decryptDesText(baseInfoData.baseData.identityNumber);
  861. if(baseInfoData.baseData.keyPersonTypeID==2){
  862. isGraduating.value = true;
  863. }
  864. console.log("初始化baseData",baseInfoData.baseData);
  865. await getStreetList();
  866. }
  867. else if(curStepData.value.statusVal==2){
  868. const reqData :any = await getEducationListByJobUserID(pageParams);
  869. educationList.value = reqData.list;
  870. pageParams.total = reqData.total;
  871. console.log("educationList",educationList.value);
  872. }
  873. else if(curStepData.value.statusVal==3){
  874. const reqData = await getExperienceListByJobUserID(pageParams);
  875. experienceList.value= reqData.list;
  876. pageParams.total = reqData.total;
  877. console.log("experienceList",experienceList.value);
  878. }
  879. else if(curStepData.value.statusVal==4){
  880. const reqData = await getJobHuntListByJobUserID(pageParams);
  881. jobHuntList.value= reqData.list;
  882. pageParams.total = reqData.total;
  883. console.log("jobHuntList",jobHuntList.value);
  884. }
  885. if (jobUserID == null) {
  886. setLongitudeLatitude()
  887. }
  888. loading.value = false;
  889. };
  890. watch(() => route.query, () => {
  891. if (route.query.reload) {
  892. loadData(route.query.jobUserID,route.query.status,route.query.loginUserId);
  893. }
  894. });
  895. watch(() => baseInfoData.baseData.identityNumber, () => {
  896. if(baseInfoData.baseData.identityNumber != null && String(baseInfoData.baseData.identityNumber).length == 18){
  897. const identReg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/;
  898. if(identReg.test(baseInfoData.baseData.identityNumber)){
  899. const birthDayStr = String(baseInfoData.baseData.identityNumber).substring(6,14);
  900. const sexStr = String(baseInfoData.baseData.identityNumber).substring(16,17);
  901. baseInfoData.baseData.sex = parseInt(sexStr)%2 == 0 ? 2 : 1; //双女单男
  902. baseInfoData.baseData.birthDay = dayjs(birthDayStr).format("YYYY-MM-DD");
  903. }
  904. }
  905. });
  906. const reload = (jobUserID:any,status:any,userId:any) => {
  907. pageParams.pageIndex = 1;
  908. expand.value = false;
  909. loadData(jobUserID,status,userId);
  910. }
  911. // 设置经纬度
  912. function setLongitudeLatitude() {
  913. getPosition().then((data: any) => {
  914. console.log(data)
  915. if (data.longitude != null && data.latitude != null) {
  916. baseInfoData.baseData.longitude = data.longitude;
  917. baseInfoData.baseData.latitude = data.latitude;
  918. }
  919. })
  920. }
  921. onIonViewDidEnter(() => {
  922. curOpenID.value = urlParams["openId"];
  923. if (route.query.reload)
  924. reload(route.query.jobUserID,route.query.status,route.query.loginUserId);
  925. });
  926. return {
  927. ...toRefs(baseInfoData),
  928. arrowBackOutline,
  929. addCircleOutline,
  930. trashOutline,
  931. route,
  932. router,
  933. curOpenID,
  934. expand,
  935. loading,
  936. stepList,
  937. curStepData,
  938. baseDataValid,
  939. siteInfoList,
  940. genderList,
  941. nationTypeList,
  942. isFullTimeList,
  943. //occupationalCategoryList,
  944. occupationalLevelList,
  945. familyNatureList,
  946. politicsStatusList,
  947. pageParams,
  948. jobUserStatusList,
  949. keyPersonTypeList,
  950. cultureRankList,
  951. userHealthList,
  952. bloodTypeList,
  953. maritalStatusList,
  954. provinceList,
  955. regionList,
  956. streetList,
  957. educationList,
  958. experienceList,
  959. jobHuntList,
  960. delID,
  961. delAlertButtons,
  962. infoAlertButtons,
  963. delAlertOpen,
  964. infoAlertOpen,
  965. delLoading,
  966. infoAlterData,
  967. isGraduating,
  968. finishDateChange,
  969. keyPersonTypeChange,
  970. provinceChange,
  971. regionChange,
  972. onSetOccupationalID,
  973. onSave,
  974. onBack,
  975. onFinish,
  976. onScroll,
  977. onPathForward,
  978. loadData,
  979. reload,
  980. setDelAlertOpen,
  981. setInfoAlertOpen,
  982. setDelLoadingOpen,
  983. getSiteInfoList,
  984. getSelectorDataList,
  985. getRegionList,
  986. getStreetList,
  987. dayjs
  988. }
  989. },
  990. mounted(){
  991. this.getSiteInfoList();
  992. this.getSelectorDataList();
  993. this.getRegionList();
  994. this.getStreetList();
  995. }
  996. });
  997. </script>
  998. <style lang="less">
  999. ion-select#sex.md.select-disabled.legacy-select::after{display: none;}
  1000. ion-select#siteID.md.select-disabled.legacy-select::after{display: none;}
  1001. ion-select#regionCode.md.select-disabled.legacy-select::after{display: none;}
  1002. .custom{
  1003. --placeholder-color: gray;
  1004. --placeholder-opacity: 0.5;
  1005. }
  1006. .title-item{
  1007. margin-left: 15px;
  1008. color:#1c3d70 !important;
  1009. font-size: 14px !important;
  1010. font-weight: bold;
  1011. }
  1012. .next-btn {
  1013. width: 80px;
  1014. border-radius: 5px;
  1015. background-color:#3a7be0;
  1016. color: #363432;
  1017. font-size: 14px;
  1018. }
  1019. .iconBtn{
  1020. width:24px;
  1021. height:24px;
  1022. }
  1023. .stepFlex {
  1024. margin: 0;
  1025. display: flex;
  1026. width: 100%;
  1027. .stepFlex-item {
  1028. position: relative;
  1029. flex: 1;
  1030. text-align: center;
  1031. margin-top: -10px;
  1032. .stepFlex-item-label {
  1033. padding-top: 30px;
  1034. font-size: 14px;
  1035. .stepFlex-item-label-title{
  1036. margin-top:30px;
  1037. }
  1038. .stepFlex-item-label-desc{
  1039. margin-top:5px;color: #b9b9bd;
  1040. }
  1041. }
  1042. }
  1043. .greenCircle {
  1044. top: calc(50% - 15px);
  1045. left: calc(50% - 4px);
  1046. position: absolute;
  1047. z-index: 2;
  1048. width: 10px;
  1049. height: 10px;
  1050. border-radius: 50%;
  1051. background-color: #31A2FE;
  1052. }
  1053. .now {
  1054. top: calc(50% - 18px);
  1055. left: calc(50% - 8px);
  1056. position: absolute;
  1057. z-index: 3;
  1058. width: 16px;
  1059. height: 16px;
  1060. border-radius: 50%;
  1061. background-color: #31A2FE;
  1062. border: 4px solid #c5e8f9;
  1063. }
  1064. .grayCircle {
  1065. top: calc(50% - 15px);
  1066. left: calc(50% - 4px);
  1067. position: absolute;
  1068. z-index: 2;
  1069. width: 10px;
  1070. height: 10px;
  1071. border-radius: 50%;
  1072. background-color: #ccc;
  1073. }
  1074. .greenLine {
  1075. width: 100%;
  1076. top: calc(50% - 11px);
  1077. left: calc(50% - 2px);
  1078. height: 2px;
  1079. background-color: #31A2FE;
  1080. position: absolute;
  1081. }
  1082. .grayLine {
  1083. height: 0;
  1084. border: 1px dashed #ccc;
  1085. width: 100%;
  1086. top: calc(50% - 11px);
  1087. left: calc(50% - 2px);
  1088. position: absolute;
  1089. }
  1090. }
  1091. </style>