applyEducationCode.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. <!-- 退役军人职业教育码申请 -->
  2. <template>
  3. <view class="apply-code">
  4. <u-form :model="form" ref="uForm" label-width="160" label-align="left">
  5. <u-form-item label="姓名:" prop="veteName" :required="true">
  6. <u-input v-model="form.veteName" placeholder="请输入真实姓名" />
  7. </u-form-item>
  8. <u-form-item label="身份证号:" prop="veteIdCard" :required="true">
  9. <u-input v-model="form.veteIdCard" placeholder="请输入身份证号" @blur="idNumberChange" maxlength="18"/>
  10. </u-form-item>
  11. <u-form-item label="性别:" prop="veteSex" :required="true">
  12. <u-input v-model="form.veteSex" placeholder="输入身份证自动获取" disabled />
  13. </u-form-item>
  14. <u-form-item label="民族:" prop="nation">
  15. <u-input v-model="form.nation" placeholder="请输入您的民族" />
  16. </u-form-item>
  17. <u-form-item label="所在区域:" prop="veteHousehArea" :required="true">
  18. <u-input v-model="form.veteHousehArea" placeholder="请选择您的户籍区域" type="select" @click="areaShow = true"/>
  19. </u-form-item>
  20. <u-form-item label="现家庭详细地址:" label-position="top" label-width="200" label-align="left" prop="veteResiAddress" :required="true">
  21. <u-input v-model="form.veteResiAddress" placeholder="请输入您的现家庭详细地址" />
  22. </u-form-item>
  23. <u-form-item label="户籍类别:" prop="houseTypeId">
  24. <u-radio-group v-model="form.houseTypeId" @change="houseTypeChange">
  25. <u-radio v-for="(item, index) in houseTypeList" :key="index" :name="item.value">
  26. {{ item.label }}
  27. </u-radio>
  28. </u-radio-group>
  29. </u-form-item>
  30. <u-form-item label="户籍地:" prop="veteHousehRegi">
  31. <u-input v-model="form.veteHousehRegi" placeholder="请选择您的户籍地" type="select" @click="regionClick"/>
  32. </u-form-item>
  33. <u-form-item label="文化程度:" prop="degrEduc" :required="true">
  34. <u-input v-model="form.degrEduc" placeholder="请选择您的文化程度" type="select" @click="degrEducShow = true"/>
  35. </u-form-item>
  36. <u-form-item label="政治面貌:" prop="politOutlook" :required="true">
  37. <u-input v-model="form.politOutlook" placeholder="请选择您的政治面貌" type="select" @click="politOutlookShow = true"/>
  38. </u-form-item>
  39. <u-form-item label="就业状况:" prop="jobStatus">
  40. <u-radio-group v-model="form.jobStatus">
  41. <u-radio v-for="(item, index) in employmentStatusList" :key="index" :name="item.value">
  42. {{ item.label }}
  43. </u-radio>
  44. </u-radio-group>
  45. </u-form-item>
  46. <u-form-item label="薪资范围:" prop="salaryRangeName">
  47. <u-input v-model="form.salaryRangeName" placeholder="请选择您的薪资范围" type="select" @click="salaryRangeShow = true"/>
  48. </u-form-item>
  49. <u-form-item label="QQ:" prop="qqNum">
  50. <u-input v-model="form.qqNum" placeholder="请输入您的QQ" />
  51. </u-form-item>
  52. <u-form-item label="微信:" prop="wxNum">
  53. <u-input v-model="form.wxNum" placeholder="请输入您的微信" />
  54. </u-form-item>
  55. <u-form-item label="近期1寸免冠照片:" label-position="top" label-width="200" label-align="left" :required="true">
  56. <view class="pic">
  57. <u-upload
  58. ref="uUpload"
  59. :action="action"
  60. :custom-btn="true"
  61. :max-count="1"
  62. :limitType="['png', 'jpg']"
  63. @on-success="uploadSuccess"
  64. @on-remove="uploadRemove"
  65. >
  66. <view class="pic-upload-box" slot="addBtn">
  67. <view class="pic-upload">
  68. <image src="../../static/img/upload-add.png" mode=""/>
  69. <view class="font">上传照片</view>
  70. </view>
  71. <view class="tips">支持jpg.png格式</view>
  72. </view>
  73. </u-upload>
  74. <!-- <view class="pic-photograph" @click="photograph">
  75. <image src="../../static/img/paizhao.png" mode=""></image>
  76. <view class="font">立即拍照</view>
  77. </view> -->
  78. <!-- <view class="pic-url" v-if="form.files.length > 0">
  79. <view class="icon">
  80. <u-icon name="close" color="#fff" size="16" @click="clearFile"></u-icon>
  81. </view>
  82. <image :src="form.files[0].filesUrl" mode=""/>
  83. </view> -->
  84. </view>
  85. </u-form-item>
  86. <u-form-item>
  87. <u-button type="primary" class="submit" @click="submit">提交</u-button>
  88. </u-form-item>
  89. </u-form>
  90. <!-- 文化程度下拉 -->
  91. <u-select v-model="degrEducShow" :list="degrEducList" @confirm="degrEducChange" :default-value="degrEducIndex"/>
  92. <!-- 政治面貌下拉 -->
  93. <u-select v-model="politOutlookShow" :list="politOutlookList" @confirm="politOutlookChange" :default-value="politOutlookIndex"/>
  94. <!-- 户籍地下拉 -->
  95. <city-select-province v-model="regionShow" :default-region="[]" @city-change="regionConfirm"/>
  96. <!-- 户籍区域下拉 -->
  97. <u-city-select v-model="areaShow" :default-region="[]" @city-change="areaConfirm"/>
  98. <!-- 工资范围下拉 -->
  99. <u-select v-model="salaryRangeShow" :list="salaryRangeList" @confirm="salaryRangeChange" :default-value="salaryRangeIndex"/>
  100. </view>
  101. </template>
  102. <script>
  103. import citySelectProvince from '../../uview-ui/components/u-city-select-province/u-city-select-province.vue'
  104. export default {
  105. components: {
  106. citySelectProvince
  107. },
  108. data() {
  109. return {
  110. // 上传地址
  111. action: this.config.uploadUrl,
  112. form: {
  113. veteName: '',
  114. veteIdCard: '',
  115. veteSex: '',
  116. nation: '',
  117. qqNum: '',
  118. wxNum: '',
  119. degrEduc: '',
  120. degrEducId: '',
  121. houseType: '',
  122. houseTypeId:'',
  123. politOutlook: '',
  124. politOutlookId:'',
  125. veteHousehRegi: '',
  126. veteHousehArea: '',
  127. veteResiAddress: '',
  128. veteDateBirth:'',
  129. veteStatus: '1',
  130. files: [],
  131. jobStatus: '',
  132. salaryRange: '',
  133. salaryRangeName: '',
  134. provinceId: '',
  135. provinceName: '',
  136. cityId: '',
  137. cityName: '',
  138. areaId: '',
  139. areaName: ''
  140. },
  141. // 表单验证
  142. rules: {
  143. veteName: [
  144. { required: true, message: '请输入姓名', trigger: [ 'change', 'blur' ]}
  145. ],
  146. veteIdCard: [
  147. {
  148. required: true,
  149. pattern: /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0[1-9]|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/,
  150. // 正则检验前先将值转为字符串
  151. transform(value) {
  152. return String(value);
  153. },
  154. message: '请正确输入身份证号',
  155. trigger: ['change', 'blur']
  156. }
  157. ],
  158. vetePhone: [
  159. {
  160. pattern: /^(?:(?:\+|00)86)?1[3-9]\d{9}$/,
  161. message: '请正确输入手机号',
  162. required: true,
  163. trigger: ['change', 'blur'],
  164. }
  165. ],
  166. veteHousehArea:[
  167. {
  168. required: true,
  169. message: '请选择户籍区域',
  170. trigger: ['change', 'blur'],
  171. }
  172. ],
  173. veteResiAddress:[
  174. {
  175. required: true,
  176. message: '请填写详细地址',
  177. trigger: ['change', 'blur'],
  178. }
  179. ],
  180. // nation:[
  181. // {
  182. // required: true,
  183. // message: '请填写民族',
  184. // trigger: ['change', 'blur'],
  185. // }
  186. // ],
  187. degrEduc:[
  188. {
  189. required: true,
  190. message: '请选择文化程度',
  191. trigger: ['change', 'blur'],
  192. }
  193. ],
  194. politOutlook:[
  195. {
  196. required: true,
  197. message: '请选择政治面貌',
  198. trigger: ['change', 'blur']
  199. }
  200. ],
  201. // houseTypeId:[
  202. // {
  203. // required: true,
  204. // message: '请选择户籍类别',
  205. // trigger: ['change', 'blur']
  206. // }
  207. // ],
  208. // salaryRangeName: [
  209. // {
  210. // required: true,
  211. // message: '请选择薪资范围',
  212. // trigger: ['change', 'blur']
  213. // }
  214. // ],
  215. // jobStatus: [
  216. // {
  217. // required: true,
  218. // message: '请选择就业状态',
  219. // trigger: ['change', 'blur']
  220. // }
  221. // ]
  222. },
  223. // 文化程度
  224. degrEducShow: false,
  225. degrEducList: [],
  226. degrEducIndex: [],
  227. // 政治面貌
  228. politOutlookShow: false,
  229. politOutlookList: [],
  230. politOutlookIndex: [],
  231. // 户籍地
  232. regionShow: false,
  233. regionDefault: [],
  234. // 户籍类型
  235. houseTypeShow: false,
  236. houseTypeList: [],
  237. houseTypeIndex: [],
  238. // 户籍区域
  239. areaShow: false,
  240. // 薪资范围
  241. salaryRangeShow: false,
  242. salaryRangeIndex: [],
  243. salaryRangeList: [],
  244. salaryRangeIndex: [],
  245. // 就业状态
  246. employmentStatusList: []
  247. }
  248. },
  249. onLoad() {
  250. this.getVeteDegrEduc();
  251. this.getVetePolitOutlook();
  252. this.getVeteHouseType();
  253. this.getSalaryRange();
  254. this.getEmploymentStatus();
  255. this.getVeteEducData();
  256. },
  257. onReady() {
  258. this.$refs.uForm.setRules(this.rules);
  259. this.form.vetePhone = this.vuex_user.mobile;
  260. },
  261. methods: {
  262. /**
  263. * 获取已经提交的数据
  264. */
  265. getVeteEducData(){
  266. this.$u.api.getVeteEducData().then(res => {
  267. if(res.code == 200){
  268. const data = res.data
  269. for(let key in data.veteEduc) {
  270. if(key !== 'files'){
  271. this.form[key] = data.veteEduc[key];
  272. }
  273. };
  274. if (data.veteEduc) {
  275. this.form.veteSex = data.veteEduc.veteSex === 0 ? '男' : '女';
  276. // 文化程度
  277. this.degrEducList.forEach((item, index) => {
  278. if (item.text === data.veteEduc.degrEducId) {
  279. this.degrEducIndex = [index]
  280. }
  281. })
  282. // 政治面貌
  283. this.politOutlookList.forEach((item, index) => {
  284. if (item.text === data.veteEduc.politOutlookId) {
  285. this.politOutlookIndex = [index]
  286. }
  287. })
  288. // 户籍类型
  289. this.houseTypeList.forEach((item, index) => {
  290. if (item.text === data.veteEduc.houseTypeId) {
  291. this.houseTypeIndex = [index]
  292. }
  293. })
  294. // 户籍区域
  295. if(data.veteEduc.provinceName && data.veteEduc.cityName && data.veteEduc.areaName) {
  296. this.form.veteHousehArea = data.veteEduc.provinceName + '-' + data.veteEduc.cityName + '-' + data.veteEduc.areaName;
  297. }
  298. // 薪资范围
  299. this.form.salaryRange = data.veteEduc.salaryRange
  300. this.salaryRangeList.forEach((item, index) => {
  301. if (Number(item.value) === Number(data.veteEduc.salaryRange)) {
  302. this.salaryRangeIndex = [index]
  303. this.form.salaryRangeName = item.label
  304. }
  305. })
  306. }
  307. this.form.files = data.files;
  308. }
  309. });
  310. },
  311. /**
  312. * 获取文化程度类别
  313. */
  314. getVeteDegrEduc(){
  315. this.$u.api.getDictdataUrl({key:'degr_educ'}).then(res=>{
  316. if(res.code == 200){
  317. this.degrEducList = res.data.map(item => {
  318. return {
  319. ...item,
  320. value: item.text
  321. }
  322. });
  323. }
  324. });
  325. },
  326. /**
  327. * 文化程度下拉变化
  328. */
  329. degrEducChange(item) {
  330. this.form.degrEduc = item[0].label
  331. this.form.degrEducId = item[0].value
  332. },
  333. /**
  334. * 获取政治面貌类别
  335. */
  336. getVetePolitOutlook(){
  337. this.$u.api.getDictdataUrl({ key: 'polit_outlook' }).then(res => {
  338. if(res.code == 200){
  339. this.politOutlookList = res.data.map(item => {
  340. return {
  341. ...item,
  342. value: item.text
  343. }
  344. });
  345. }
  346. });
  347. },
  348. /**
  349. * 政治面貌下拉改变
  350. */
  351. politOutlookChange(item) {
  352. this.form.politOutlook = item[0].label
  353. this.form.politOutlookId = item[0].value
  354. },
  355. /**
  356. * 户籍地
  357. */
  358. regionConfirm(e){
  359. this.form.veteHousehRegi = `${e.province.label}-${e.city.label}`
  360. },
  361. /**
  362. * 户籍地点击
  363. */
  364. regionClick() {
  365. this.regionShow = true
  366. },
  367. /**
  368. * 户籍区域
  369. */
  370. areaConfirm(e) {
  371. this.form.veteHousehArea = `${e.province.label}-${e.city.label}-${e.area.label}`
  372. this.form.provinceId = e.province.value
  373. this.form.provinceName = e.province.label
  374. this.form.cityId = e.city.value
  375. this.form.cityName = e.city.label
  376. this.form.areaId = e.area.value
  377. this.form.areaName = e.area.label
  378. },
  379. /**
  380. * 获取户籍类别
  381. */
  382. getVeteHouseType(){
  383. this.$u.api.getDictdataUrl({ key:'house_type' }).then(res => {
  384. if(res.code === 200){
  385. this.houseTypeList = res.data.map(item => {
  386. return {
  387. ...item,
  388. value: item.text
  389. }
  390. });
  391. }
  392. });
  393. },
  394. /**
  395. * 户籍类别单选触发
  396. */
  397. houseTypeChange(val){
  398. this.houseTypeList.forEach(item => {
  399. if (item.value === val) {
  400. this.form.houseType = item.label
  401. }
  402. })
  403. },
  404. /**
  405. * 获取薪资范围
  406. */
  407. getSalaryRange(){
  408. this.$u.api.getDictdataUrl({ key:'salary_range' }).then(res => {
  409. if(res.code === 200){
  410. this.salaryRangeList = res.data.map(item => {
  411. return {
  412. ...item,
  413. value: item.text
  414. }
  415. });
  416. }
  417. });
  418. },
  419. /**
  420. * 薪资范围
  421. * @param {Object} e
  422. */
  423. salaryRangeChange(e) {
  424. this.form.salaryRangeName = e[0].label
  425. this.form.salaryRange = e[0].value
  426. },
  427. /**
  428. * 就业状态
  429. */
  430. getEmploymentStatus(){
  431. this.$u.api.getDictdataUrl({ key:'member_job_status' }).then(res => {
  432. if(res.code === 200){
  433. this.employmentStatusList = res.data.map(item => {
  434. return {
  435. ...item,
  436. value: item.text
  437. }
  438. });
  439. }
  440. });
  441. },
  442. /**
  443. * @param { String } val
  444. */
  445. idNumberChange(val) {
  446. const reg =
  447. /^\d{6}((?:19|20)((?:\d{2}(?:0[13578]|1[02])(?:0[1-9]|[12]\d|3[01]))|(?:\d{2}(?:0[13456789]|1[012])(?:0[1-9]|[12]\d|30))|(?:\d{2}02(?:0[1-9]|1\d|2[0-8]))|(?:(?:0[48]|[2468][048]|[13579][26])0229)))\d{2}(\d)[xX\d]$/
  448. if (!reg.test(val)) {
  449. return
  450. }
  451. // 根据身份证得出性别
  452. this.form.veteSex = (parseInt(val.substr(16, 1)) % 2 === 1 ? '男' : '女');
  453. // 设置出生日期
  454. this.form.veteDateBirth = val.substring(6, 10) + "-" + val.substring(10, 12) + "-" + val.substring(12, 14) + ' 00:00:00';
  455. // 根据身份证号获取基本信息
  456. this.$u.api.getIdInfo({ id: this.form.veteIdCard }).then(res=>{
  457. if (res.code === 200) {
  458. if (res.data) {
  459. this.form.nation = res.data.nation;
  460. this.form.veteName = res.data.veteName;
  461. this.form.vetePhone = res.data.vetePhone;
  462. this.form.veteResiAddress = res.data.veteResiAddress;
  463. }
  464. } else{
  465. uni.showToast({
  466. icon: 'none',
  467. title: res.msg
  468. })
  469. }
  470. })
  471. },
  472. /**
  473. * 图片上传成功
  474. */
  475. uploadSuccess(e) {
  476. this.form.files = []
  477. this.form.files.push({ filesType: 6, filesUrl: e.data.url})
  478. },
  479. /**
  480. * 图片移除
  481. * @param {Object} index
  482. */
  483. uploadRemove(index) {
  484. this.form.files.splice(index, 1)
  485. },
  486. /**
  487. * 拍照
  488. */
  489. photograph() {
  490. uni.chooseImage({
  491. count: 1,
  492. sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
  493. sourceType: ['camera'], //从相册选择
  494. success: (res) => {
  495. const tempFilePaths = res.tempFilePaths;
  496. uni.uploadFile({
  497. url: this.config.uploadUrl, // 服务器地址
  498. fileType: "image",// ZFB必填,不然报错
  499. filePath: tempFilePaths[0], // 这个就是我们上面拍照返回或者先中照片返回的数组
  500. name: 'imgFile',
  501. success: (uploadFileRes) => {
  502. const file = JSON.parse(uploadFileRes.data)
  503. this.form.files = []
  504. this.form.files.push({ filesType: 6, filesUrl: file.data.url})
  505. }
  506. });
  507. }
  508. })
  509. },
  510. /**
  511. * 清空图片文件
  512. */
  513. clearFile() {
  514. uni.showModal({
  515. title: '提示',
  516. content: '您确定要删除此项吗?',
  517. success: async (res) => {
  518. if (res.confirm) {
  519. this.form.files = []
  520. }
  521. }
  522. });
  523. },
  524. submit() {
  525. this.$refs.uForm.validate(valid => {
  526. if (valid) {
  527. if (this.form.files.length < 1){
  528. uni.showToast({
  529. title: '近期1寸免冠照片',
  530. icon:'none',
  531. duration: 2000
  532. });
  533. } else {
  534. let params = {
  535. veteEduc: {}
  536. };
  537. params.files = this.form.files
  538. for(let key in this.form) {
  539. if (key !== 'files') {
  540. params.veteEduc[key] = this.form[key];
  541. }
  542. };
  543. params.veteEduc.veteSex = params.veteEduc.veteSex === '男' ? 0 : 1;
  544. this.$u.api.veteEduc(params).then(res => {
  545. if (res.code === 200 ) {
  546. uni.showToast({
  547. title: '提交成功,等待审核!',
  548. duration: 2000,
  549. success: () => {
  550. this.$u.route('/pages/applyEducationCode/applyEducationSuccess')
  551. }
  552. });
  553. } else {
  554. uni.showToast({
  555. title: res.msg,
  556. icon:'none',
  557. duration: 2000
  558. });
  559. }
  560. })
  561. }
  562. }
  563. });
  564. }
  565. }
  566. }
  567. </script>
  568. <style lang="scss" scoped>
  569. @import './applyEducationCode.scss';
  570. </style>