postList.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <template>
  2. <ion-page class="list-page post-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>
  9. 企业岗位信息
  10. </ion-title>
  11. </ion-toolbar>
  12. </ion-header>
  13. <ion-content>
  14. <div class="stepFlex">
  15. <div v-for="(record,key) in stepList" :key="key" class="stepFlex-item">
  16. <div
  17. :class="[(record.val < curStepData?.statusVal || curStepData?.statusVal==stepList.val) ? 'greenCircle' :record.val == curStepData?.statusVal ? 'now' : 'grayCircle']"></div>
  18. <div v-if="key !== stepList.length - 1"
  19. :class="[record.val < curStepData?.statusVal ? 'greenLine' : 'grayLine']"></div>
  20. <div class="stepFlex-item-label">
  21. <p class="stepFlex-item-label-title">{{ record.title }}</p>
  22. <p class="stepFlex-item-label-desc">{{ record.desc }}</p>
  23. </div>
  24. </div>
  25. </div>
  26. <form autocomplete="off">
  27. <div class="bw-vue-form">
  28. <div class="form-title">
  29. 岗位信息
  30. <ion-icon :icon="addCircleOutline" class="iconBtn" style="float:right;"
  31. @click="onAdd()" ></ion-icon>
  32. </div>
  33. <div class="bw-vue-list">
  34. <div class="list-content" v-if="!loading">
  35. <ion-list>
  36. <div v-for="(record,key) in postList" :key="key" >
  37. <ion-item-sliding>
  38. <ion-item detail @click="onEdit(record.postID)">
  39. <ion-label>
  40. <h2>
  41. {{ record.professionName }}
  42. </h2>
  43. <p v-if="record.startTime!=null&&record.endTime!=null">
  44. {{ dayjs(record.startTime).format("YYYY-MM-DD") }}至{{ dayjs(record.endTime).format("YYYY-MM-DD") }}
  45. </p>
  46. <p v-if="record.startTime==null||record.endTime==null">
  47. 暂未设置有效期限
  48. </p>
  49. <p>
  50. 招聘人数:{{ record.recruitCount }} 人
  51. </p>
  52. </ion-label>
  53. </ion-item>
  54. <ion-item-options>
  55. <ion-item-option color="danger" @click="setDelAlertOpen(true, record.postID)">
  56. <ion-icon :icon="trashOutline"></ion-icon>
  57. </ion-item-option>
  58. </ion-item-options>
  59. </ion-item-sliding>
  60. </div>
  61. </ion-list>
  62. </div>
  63. </div>
  64. <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
  65. <ion-infinite-scroll-content
  66. :loadingText="pageParams.total>pageParams.pageIndex*pageParams.pageSize?'正在加载...':'暂无更多'"
  67. loadingSpinner="bubbles">
  68. </ion-infinite-scroll-content>
  69. </ion-infinite-scroll>
  70. </div>
  71. </form>
  72. </ion-content>
  73. <ion-footer>
  74. <ion-toolbar>
  75. <ion-button style="width: 48%;float:left;margin-left: 1%;" @click="onBack" >上一步</ion-button>
  76. <ion-button style="width: 48%;float:left;margin-right: 1%;" @click="onFinish" >完 成</ion-button>
  77. </ion-toolbar>
  78. </ion-footer>
  79. <ion-alert
  80. :is-open="delAlertOpen"
  81. header="删除确认"
  82. message="确定要删除该岗位吗?"
  83. :buttons="delAlertButtons"
  84. @didDismiss="setDelAlertOpen(false, null)"
  85. ></ion-alert>
  86. <ion-alert
  87. :is-open="infoAlertOpen"
  88. :header="infoAlterData.title"
  89. :message="infoAlterData.message"
  90. :buttons="infoAlertButtons"
  91. @didDismiss="setInfoAlertOpen(false)"
  92. ></ion-alert>
  93. <ion-loading
  94. :is-open="delLoading"
  95. message="删除中..."
  96. @didDismiss="setDelLoadingOpen(false)" >
  97. </ion-loading>
  98. </ion-page>
  99. </template>
  100. <script lang="ts">
  101. import {defineComponent, reactive, ref} from "vue";
  102. import {useRoute, useRouter} from "vue-router";
  103. import {alertController, onIonViewDidEnter} from "@ionic/vue";
  104. import {arrowBackOutline, addCircleOutline,trashOutline} from 'ionicons/icons';
  105. import {getCompanyPostList} from '@/api/company/index'
  106. import dayjs from "dayjs";
  107. import {post, postByDataAndParams} from "@/api/common";
  108. import {useUserStore} from "@/store/modules/user";
  109. interface StepParams{
  110. loginUserID: string,
  111. openID:string,
  112. statusVal: number
  113. }
  114. export default defineComponent({
  115. name: 'PostList',
  116. setup() {
  117. const userStore = useUserStore();
  118. const userInfo = ref(userStore.getUserInfo);
  119. const router = useRouter();
  120. const route = useRoute();
  121. const loading = ref(false);
  122. const postList = ref<any>([]);
  123. const pageParams = reactive({
  124. pageIndex: 1,
  125. pageSize: 10,
  126. total:0,
  127. companyID:''
  128. });
  129. const curStepData = ref<StepParams>({
  130. loginUserID:"",
  131. openID:"",
  132. statusVal: 1
  133. });
  134. const stepList = ref([
  135. {
  136. title: '基础信息',
  137. desc: '企业基础信息',
  138. val: 1
  139. },
  140. {
  141. title: '岗位信息',
  142. desc: '企业岗位信息',
  143. val: 2
  144. }]);
  145. const presentAlert = async (message: string) => {
  146. const alert = await alertController.create({
  147. header: '错误!',
  148. message: message,
  149. buttons: [
  150. '确定'
  151. ],
  152. });
  153. await alert.present();
  154. };
  155. // 信息弹窗内容
  156. const infoAlterData = reactive({
  157. title:"",
  158. message:""
  159. });
  160. // 删除警告弹窗开关
  161. const delAlertOpen = ref(false);
  162. // 删除警告弹窗按钮定义
  163. const infoAlertButtons = [
  164. {
  165. text: '确定',
  166. role: 'confirm',
  167. handler: () => {
  168. reload(pageParams.companyID,curStepData.value.statusVal,curStepData.value.loginUserID,curStepData.value.openID);
  169. },
  170. },
  171. ];
  172. // 删除数据
  173. const delPostID = ref("");
  174. // 删除加载
  175. const delLoading = ref(false);
  176. // 信息弹窗开关
  177. const infoAlertOpen = ref(false);
  178. // 删除警告弹窗按钮定义
  179. const delAlertButtons = [
  180. {
  181. text: '取消',
  182. role: 'cancel',
  183. handler: () => {
  184. reload(pageParams.companyID,curStepData.value.statusVal,curStepData.value.loginUserID,curStepData.value.openID);
  185. },
  186. },
  187. {
  188. text: '确定',
  189. role: 'confirm',
  190. handler: () => {
  191. delLoading.value = true;
  192. postByDataAndParams("companyService/post/delete", [delPostID.value], {loginUserID: userInfo.value.userID}, "岗位信息删除").then((res) => {
  193. /* infoAlterData.title = "提示";
  194. infoAlterData.message = "删除成功";
  195. setInfoAlertOpen(true);*/
  196. }).finally(()=>{
  197. delLoading.value = false;
  198. reload(pageParams.companyID,curStepData.value.statusVal,curStepData.value.loginUserID,curStepData.value.openID);
  199. });
  200. },
  201. },
  202. ];
  203. // 设置要删除的求职人员
  204. function setDelAlertOpen(value: boolean, postID: any) {
  205. delAlertOpen.value = value;
  206. if(postID != null) {
  207. delPostID.value = postID;
  208. }
  209. }
  210. // 设置信息提示弹窗开关
  211. function setInfoAlertOpen(value: boolean) {
  212. infoAlertOpen.value = value;
  213. }
  214. // 设置删除弹窗开启关闭
  215. function setDelLoadingOpen(value: boolean) {
  216. delLoading.value = value;
  217. }
  218. const onAdd = () => {
  219. router.push({path: './postEdit', query: {reload:1,id: null,companyID:pageParams.companyID,loginUserID:curStepData.value.loginUserID}});
  220. };
  221. const onEdit = (postID:any) => {
  222. router.push({path: './postEdit', query: {reload:1,id:postID,companyID:pageParams.companyID,loginUserID:curStepData.value.loginUserID}});
  223. };
  224. const onBack = () => {
  225. router.push({path: './companyEdit', query: {reload:1,id:pageParams.companyID,siteUserId:curStepData.value.loginUserID}});
  226. };
  227. const onFinish = () => {
  228. router.push('/jobUserInfo/finish');
  229. }
  230. const onScroll = (e: any) => {
  231. setTimeout(() => {
  232. e.target.complete();
  233. if (pageParams.total > pageParams.pageIndex * pageParams.pageSize) {
  234. pageParams.pageSize += 10;
  235. loadData(pageParams.companyID,curStepData.value.statusVal,curStepData.value.loginUserID,curStepData.value.openID);
  236. }
  237. }, 500);
  238. }
  239. const loadData = async function (companyID:any,status:any,userID:any,openId:any) {
  240. loading.value = true;
  241. pageParams.companyID = companyID;
  242. curStepData.value.statusVal = status;
  243. curStepData.value.loginUserID = userID;
  244. curStepData.value.openID = openId;
  245. //console.log("S",pageParams);
  246. const result:any = await getCompanyPostList(pageParams);
  247. postList.value = postList.value.concat(result.list);
  248. pageParams.total = result.total;
  249. //console.log(postList.value);
  250. loading.value = false;
  251. };
  252. const reload = (companyID:any,status:any,userID:any,openId:any) => {
  253. pageParams.pageIndex = 1;
  254. postList.value = [];
  255. loadData(companyID,status,userID,openId);
  256. /*const jsonPostList = localStorage.getItem("postData");
  257. postList.value = JSON.parse(jsonPostList ?? "");*/
  258. };
  259. onIonViewDidEnter(() => {
  260. if (route.query.reload)
  261. reload(route.query.id,route.query.status,route.query.userID,route.query.openId);
  262. });
  263. return {
  264. arrowBackOutline,
  265. addCircleOutline,
  266. trashOutline,
  267. route,
  268. router,
  269. loading,
  270. pageParams,
  271. curStepData,
  272. postList,
  273. stepList,
  274. delPostID,
  275. delAlertButtons,
  276. infoAlertButtons,
  277. delAlertOpen,
  278. infoAlertOpen,
  279. delLoading,
  280. infoAlterData,
  281. onBack,
  282. onAdd,
  283. onEdit,
  284. onFinish,
  285. onScroll,
  286. loadData,
  287. presentAlert,
  288. /*calculateEndDate,*/
  289. dayjs,
  290. setDelAlertOpen,
  291. setInfoAlertOpen,
  292. setDelLoadingOpen,
  293. }
  294. }
  295. });
  296. </script>
  297. <style lang="less">
  298. .next-btn {
  299. width: 100%;
  300. --border-radius: 0px;
  301. --background: #f2f2f5;
  302. margin: 20px 0 0 0;
  303. color: #363432;
  304. font-size: 14px;
  305. }
  306. .iconBtn{
  307. width:24px;
  308. height:24px;
  309. }
  310. .stepFlex {
  311. margin: 0;
  312. display: flex;
  313. width: 100%;
  314. .stepFlex-item {
  315. position: relative;
  316. flex: 1;
  317. text-align: center;
  318. margin-top: -10px;
  319. .stepFlex-item-label {
  320. padding-top: 60px;
  321. font-size: 14px;
  322. .stepFlex-item-label-title {
  323. margin-top: 30px;
  324. }
  325. .stepFlex-item-label-desc {
  326. margin-top: 5px;
  327. color: #b9b9bd;
  328. }
  329. }
  330. }
  331. .greenCircle {
  332. top: calc(50% - 15px);
  333. left: calc(50% - 4px);
  334. position: absolute;
  335. z-index: 2;
  336. width: 10px;
  337. height: 10px;
  338. border-radius: 50%;
  339. background-color: #31A2FE;
  340. }
  341. .now {
  342. top: calc(50% - 18px);
  343. left: calc(50% - 8px);
  344. position: absolute;
  345. z-index: 3;
  346. width: 16px;
  347. height: 16px;
  348. border-radius: 50%;
  349. background-color: #31A2FE;
  350. border: 4px solid #c5e8f9;
  351. }
  352. .grayCircle {
  353. top: calc(50% - 15px);
  354. left: calc(50% - 4px);
  355. position: absolute;
  356. z-index: 2;
  357. width: 10px;
  358. height: 10px;
  359. border-radius: 50%;
  360. background-color: #ccc;
  361. }
  362. .greenLine {
  363. width: 100%;
  364. top: calc(50% - 11px);
  365. left: calc(50% - 2px);
  366. height: 2px;
  367. background-color: #31A2FE;
  368. position: absolute;
  369. }
  370. .grayLine {
  371. height: 0;
  372. border: 1px dashed #ccc;
  373. width: 100%;
  374. top: calc(50% - 11px);
  375. left: calc(50% - 2px);
  376. position: absolute;
  377. }
  378. .post-list-page {
  379. .list-content {
  380. margin: 0px 15px !important;
  381. background-color: white !important;
  382. border-radius: 0 !important;
  383. ion-item {
  384. margin-top: 10px;
  385. font-size: 14px;
  386. border: 1px solid rgb(242, 242, 245);
  387. p {
  388. font-size: 12px;
  389. }
  390. }
  391. }
  392. }
  393. }
  394. </style>