招聘网页
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

train.vue 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <template v-if="state">
  3. <a-form :model="createForm" layout="vertical" class="resume-form">
  4. <a-row :gutter="20">
  5. <a-col span="12">
  6. <a-form-item label="培训/教育时间">
  7. <a-range-picker v-model:value="time" @Change="getRange" picker="month" size="large" style="width: 100%;"/>
  8. </a-form-item>
  9. </a-col>
  10. <a-col span="12">
  11. <a-form-item label="是否至今">
  12. <a-radio-group v-model:value="createForm.end_today" button-style="solid" size="large"
  13. style="width: 100%;">
  14. <a-radio-button :value="1" style="width: 50%;">非至今</a-radio-button>
  15. <a-radio-button :value="2" style="width: 50%;">至今</a-radio-button>
  16. </a-radio-group>
  17. </a-form-item>
  18. </a-col>
  19. <a-col span="12">
  20. <a-form-item label="学校/培训机构" name="school_or_institution">
  21. <a-input v-model:value="createForm.school_or_institution" placeholder="请输入学校/培训机构"
  22. size="large" />
  23. </a-form-item>
  24. </a-col>
  25. <a-col span="12">
  26. <a-form-item label="专业" name="major">
  27. <a-input v-model:value="createForm.major" placeholder="请输入专业" size="large" />
  28. </a-form-item>
  29. </a-col>
  30. <a-col span="12">
  31. <a-form-item label="获得证书" name="certificate">
  32. <a-input v-model:value="createForm.certificate" placeholder="请输入获得证书" size="large" />
  33. </a-form-item>
  34. </a-col>
  35. <a-col span="12">
  36. <a-form-item label="曾获学校奖项或技能比赛奖项" name="certificate">
  37. <a-input v-model:value="createForm.awards" placeholder="请输入曾获学校奖项或技能比赛奖项" size="large" />
  38. </a-form-item>
  39. </a-col>
  40. <a-col span="12">
  41. <a-form-item label="曾任职务" name="positions_held">
  42. <a-input v-model:value="createForm.positions_held" placeholder="请输入曾任职务" size="large" />
  43. </a-form-item>
  44. </a-col>
  45. <a-col span="24">
  46. <a-flex justify="flex-end">
  47. <a-space>
  48. <a-button @click="resetForm" size="large">取消</a-button>
  49. <a-button type="primary" @click="saveForm" size="large">保存</a-button>
  50. </a-space>
  51. </a-flex>
  52. </a-col>
  53. </a-row>
  54. </a-form>
  55. </template>
  56. <template v-else>
  57. <a-list :data-source="trainList">
  58. <template #loadMore>
  59. <a-flex justify="center">
  60. <a-space>
  61. <div v-if="!loading" >
  62. <a-button @click="onLoadMore">加载更多</a-button>
  63. </div>
  64. </a-space>
  65. </a-flex>
  66. </template>
  67. <template #renderItem="{ item }">
  68. <a-list-item>
  69. <a-skeleton avatar :title="false" :loading="!!loading" active>
  70. <a-card :title="item.school_or_institution" style="width: 100%">
  71. <template #extra>
  72. <a-space>
  73. <a-button @click="toEdit(item)" type="primary" size="small">
  74. 编辑
  75. </a-button>
  76. <a-popconfirm title="是否删除该经历" @confirm="del(item.id)">
  77. <a-button size="small" danger>
  78. 删除
  79. </a-button>
  80. </a-popconfirm>
  81. </a-space>
  82. </template>
  83. <p>专业:{{item.major}}</p>
  84. <p>教育/培训时间:{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}</p>
  85. <p>曾担任的职务:{{item.positions_held}}</p>
  86. <p>获得的证书:{{item.certificate}}</p>
  87. <p>获得的奖项:{{item.awards}}</p>
  88. </a-card>
  89. </a-skeleton>
  90. </a-list-item>
  91. </template>
  92. </a-list>
  93. </template>
  94. </template>
  95. <script setup lang="ts">
  96. import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
  97. import { PostJobapplicantAddtraining, PostJobapplicantDeltraining, PostJobapplicantUpdatetraining, PostJobapplicantListtraining, PostJobapplicantTrainingdetail } from '@/apis/models';
  98. import { intersectionAlike } from '@/utils/dataHelper';
  99. import { warnToast, successToast } from '@/utils/toastHelper';
  100. import { dataForm, otherDataForm, reset } from '@/components/jobseeker/resume/train/data.ts';
  101. import { useCommon } from '@/hooks/useCommon';
  102. let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
  103. const dayjsRef = ref(dayjs);
  104. let props = defineProps(['form_state']);
  105. const emit = defineEmits();
  106. let state = ref<Boolean>(false)
  107. let loading = ref<Boolean>(true);
  108. let trainList = ref([]);
  109. let createForm = ref<JobseekerTrainType.JobseekerTrainFormType>(dataForm)
  110. let time = ref('')
  111. onMounted(() => {
  112. getData();
  113. })
  114. const searchData = (data : object) => {
  115. commomParams.value.search = data
  116. getData();
  117. }
  118. const clearData = (data : object) => {
  119. if (data) {
  120. commomParams.value.search = data
  121. } else {
  122. commomParams.value.search = {
  123. page: 1,
  124. pagesize: 10,
  125. sort: 'id',
  126. sortby: 'asc',
  127. keyword: ''
  128. }
  129. }
  130. getData();
  131. }
  132. const getPage = (data : object) => {
  133. commomParams.value.search.page = data.current;
  134. commomParams.value.search.pagesize = data.pageSize;
  135. getData();
  136. }
  137. const getData = async () => {
  138. try {
  139. loading.value = true;
  140. let res = await PostJobapplicantListtraining(commomParams.value.search);
  141. loading.value = false;
  142. if(!res.data.jobapplicanttrainings || res.data.jobapplicanttrainings.length <= 0) {
  143. warnToast('无更多数据')
  144. }
  145. trainList.value = res.data.jobapplicanttrainings ? trainList.value.concat(res.data.jobapplicanttrainings) : trainList.value.concat([]);
  146. commomParams.value.page = {
  147. current: commomParams.value.search.page,
  148. pageSize: commomParams.value.search.pagesize,
  149. total: res.data.total,
  150. pageSizeOptions: ['10', '20', '30', '40'],
  151. hideOnSinglePage: false,
  152. showSizeChanger: true
  153. };
  154. } catch {
  155. loading.value = false;
  156. }
  157. }
  158. const onLoadMore = () => {
  159. commomParams.value.search.page = commomParams.value.search.page + 1;
  160. getData();
  161. }
  162. // 详情
  163. const getDetail = (val) => {
  164. PostJobapplicantTrainingdetail({id: val, customer_id: sessionStorage.getItem('id')}).then(res => {
  165. createForm.value = intersectionAlike(createForm.value, res.data)
  166. createForm.value.id = res.data.id;
  167. time.value = [dayjsRef.value(`${res.data.start_year}-${res.data.start_month}`), dayjsRef.value(`${res.data.end_year}-${res.data.end_month}`)]
  168. })
  169. }
  170. const getRange = (val) => {
  171. let day1 = dayjsRef.value(val[0]).format('YYYY-MM-DD').split('-');
  172. let day2 = dayjsRef.value(val[1]).format('YYYY-MM-DD').split('-');
  173. createForm.value.start_year = parseInt(day1[0], 10);
  174. createForm.value.start_month = parseInt(day1[1], 10);
  175. createForm.value.end_year = parseInt(day2[0], 10);
  176. createForm.value.end_month = parseInt(day2[1], 10);
  177. }
  178. const saveForm = () => {
  179. if (createForm.value.id) {
  180. PostJobapplicantUpdatetraining(createForm.value).then(res => {
  181. successToast('保存成功');
  182. resetForm()
  183. }).catch(err => {
  184. })
  185. } else {
  186. PostJobapplicantAddtraining(createForm.value).then(res => {
  187. successToast('保存成功');
  188. resetForm()
  189. }).catch(err => {
  190. })
  191. }
  192. }
  193. const resetForm = () => {
  194. trainList.value = [];
  195. time.value = ''
  196. createForm.value = reset().dataForm as JobseekerTrainType.JobseekerTrainFormType;
  197. state.value = false;
  198. getData();
  199. emit("quitEdit")
  200. }
  201. watch(() => [props.form_state], (newVal) => {
  202. state.value = newVal[0];
  203. })
  204. const toEdit = (item : Object) => {
  205. createForm.value.id = item.id;
  206. getDetail(createForm.value.id)
  207. emit("editEdit")
  208. }
  209. const del = (id : number) => {
  210. commomParams.value.delParam = { id: id };
  211. PostJobapplicantDeltraining(commomParams.value.delParam).then(res => {
  212. successToast('删除成功');
  213. trainList.value = [];
  214. getData();
  215. })
  216. }
  217. </script>
  218. <style scoped>
  219. :deep(.ant-list-item:last-child) {
  220. border-block-end: none !important;
  221. }
  222. </style>