招聘网页
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.vue 8.2KB

1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <div v-if="mode== 'detail'">
  3. <a-page-header>
  4. <template #title>
  5. <a-button @click="back" type="link">
  6. <ArrowLeftOutlined />前往更多求职
  7. </a-button>
  8. </template>
  9. <a-list item-layout="vertical">
  10. <a-list-item>
  11. <a-list-item-meta>
  12. <template #title>
  13. <div style="font-size: 24px; font-family: bold;">{{companyDetail.full_name}}</div>
  14. </template>
  15. <template #description>
  16. <div>
  17. 企业编号:{{companyDetail.id}}
  18. </div>
  19. </template>
  20. </a-list-item-meta>
  21. </a-list-item>
  22. </a-list>
  23. <a-tabs v-model:activeKey="activeKey" type="card" @change="activeChange">
  24. <a-tab-pane :key="1" tab="企业信息">
  25. <template v-if="activeKey == 1">
  26. <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
  27. <a-descriptions title="公司介绍" layout="vertical">
  28. <a-descriptions-item>
  29. <div v-html="companyDetail.introduction"></div>
  30. </a-descriptions-item>
  31. </a-descriptions>
  32. </div>
  33. <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;">
  34. <a-descriptions :column="7" title="公司概况" layout="vertical">
  35. <a-descriptions-item label="所属行业" span="2"
  36. v-if="companyDetail.situation">{{companyDetail.situation.industry_text}}/{{companyDetail.situation.industry2_text}}</a-descriptions-item>
  37. <a-descriptions-item label="公司性质"
  38. v-if="companyDetail.situation">{{companyDetail.situation.nature_text}}</a-descriptions-item>
  39. <a-descriptions-item label="公司规模"
  40. v-if="companyDetail.situation">{{companyDetail.situation.scale_text }}</a-descriptions-item>
  41. <a-descriptions-item label="成立时间"
  42. v-if="companyDetail.situation">{{companyDetail.situation.establishment_date }}</a-descriptions-item>
  43. </a-descriptions>
  44. </div>
  45. <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
  46. <a-descriptions :column="7" title="联系方式" layout="vertical">
  47. <a-descriptions-item label="联系地址"
  48. span="2">{{companyDetail.detail_address}}</a-descriptions-item>
  49. <a-descriptions-item label="联系人">{{companyDetail.contact}}</a-descriptions-item>
  50. <a-descriptions-item label="联系手机">{{companyDetail.mobile}}</a-descriptions-item>
  51. <a-descriptions-item label="联系电话">{{companyDetail.phone}}</a-descriptions-item>
  52. <a-descriptions-item label="Email">{{companyDetail.email}}</a-descriptions-item>
  53. <a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item>
  54. </a-descriptions>
  55. </div>
  56. <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
  57. <a-descriptions :column="7" title="企业相册" layout="vertical">
  58. <a-descriptions-item><image-container :need="true"
  59. :imgObj="{src: imageprefix + companyDetail.photo,width: '200px',height:'200px', mode: 'fill'}"></image-container></a-descriptions-item>
  60. </a-descriptions>
  61. </div>
  62. <div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
  63. <a-descriptions :column="1" title="地图位置" layout="vertical">
  64. <a-descriptions-item span="24">
  65. <map-marker v-if="companyDetail.latitude && companyDetail.longitude" :lat="companyDetail.latitude" :lng="companyDetail.longitude"></map-marker>
  66. </a-descriptions-item>
  67. </a-descriptions>
  68. </div>
  69. </template>
  70. </a-tab-pane>
  71. <a-tab-pane :key="2" tab="招聘职位" force-render>
  72. <template v-if="activeKey == 2">
  73. <template v-if="!jobList || jobList.length == 0">
  74. <a-empty style="height: 100vh;">
  75. <template #description>
  76. 本企业未有招聘信息
  77. </template>
  78. </a-empty>
  79. </template>
  80. <template v-else>
  81. <a-row :gutter="10">
  82. <a-col span="8">
  83. <div style="background-color: #ffffff;padding-bottom: 20px; border-radius: 8px;">
  84. <job-card :list="jobList" @detail="toDetail"></job-card>
  85. <a-flex justify="center">
  86. <a-space>
  87. <a-pagination simple v-model:current="current" :total="total"
  88. @change="pageChange" />
  89. </a-space>
  90. </a-flex>
  91. </div>
  92. </a-col>
  93. <a-col span="16">
  94. <div style="padding: 20px;background-color: #ffffff;border-radius: 8px;">
  95. <job-detail v-if="job_id" :id="job_id"></job-detail>
  96. </div>
  97. </a-col>
  98. </a-row>
  99. </template>
  100. </template>
  101. </a-tab-pane>
  102. </a-tabs>
  103. </a-page-header>
  104. </div>
  105. <div v-else>
  106. <job-list @detail="showDetail"></job-list>
  107. <job-internship @detail="showDetail"></job-internship>
  108. <!-- <job-detail></job-detail> -->
  109. </div>
  110. </template>
  111. <script setup lang="ts">
  112. import { ref, onMounted, computed, watch, onBeforeUnmount } from 'vue';
  113. import JobDetail from '@/components/job/detail/index.vue'
  114. import JobCard from '@/components/job/card/index.vue'
  115. import JobList from '@/components/job/list/index.vue'
  116. import JobInternship from '@/components/job/internship/index.vue'
  117. import MapMarker from '@/components/map/marker.vue'
  118. import { PostCompanyInfo, GetJobCompanyjobs } from '@/apis/models';
  119. import { ArrowLeftOutlined } from '@ant-design/icons-vue';
  120. import { router } from '@/router';
  121. import { useCommon } from '@/hooks/useCommon';
  122. let { imageprefix } = useCommon();
  123. let activeKey = ref<Number>(sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1)
  124. let companyDetail = ref<object>({})
  125. let jobList = ref<object[]>([])
  126. let pubilc_id = ref<Number>(0)
  127. let current = ref<Number>(1)
  128. let total = ref<Number>(0)
  129. let job_id = ref<Number>(0)
  130. let mode = ref<String>(sessionStorage.getItem('mode'))
  131. const toDetail = (data) => {
  132. job_id.value = data.id;
  133. }
  134. const pageChange = (page) => {
  135. current.value = page
  136. getJobCompanyjobs(page)
  137. }
  138. const getJobCompanyjobs = (page) => {
  139. GetJobCompanyjobs({ company_id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id'), page: page, pagesize: 3 }).then(res => {
  140. total.value = res.data.total;
  141. if (res.data.jobs.length > 3) {
  142. jobList.value = res.data.jobs.slice(0, 3)
  143. } else {
  144. jobList.value = res.data.jobs
  145. }
  146. job_id.value = jobList.value[0].id
  147. })
  148. }
  149. const back = (page) => {
  150. sessionStorage.removeItem('pubilc_id')
  151. sessionStorage.removeItem('mode')
  152. sessionStorage.removeItem('tab_key')
  153. sessionStorage.removeItem('job_id')
  154. mode.value = sessionStorage.getItem('mode')
  155. }
  156. const showDetail = (page) => {
  157. // mode.value = sessionStorage.getItem('mode')
  158. activeKey.value = sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1
  159. // job_id.value = sessionStorage.getItem('job_id') ? Number(sessionStorage.getItem('job_id')) : 0;
  160. // pubilc_id.value = sessionStorage.getItem('pubilc_id') ? Number(sessionStorage.getItem('pubilc_id')) : pubilc_id.value;
  161. // if (sessionStorage.getItem('pubilc_id') != 0 || sessionStorage.getItem('id') != 0) {
  162. // PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => {
  163. // companyDetail.value = res.data
  164. // })
  165. // getJobCompanyjobs(current.value)
  166. // }
  167. window.open('/company/detail', "_blank");
  168. }
  169. onMounted(() => {
  170. if (mode.value == 'detail') {
  171. job_id.value = sessionStorage.getItem('job_id') ? Number(sessionStorage.getItem('job_id')) : 0;
  172. pubilc_id.value = sessionStorage.getItem('pubilc_id') ? Number(sessionStorage.getItem('pubilc_id')) : pubilc_id.value;
  173. if (sessionStorage.getItem('pubilc_id') != 0 || sessionStorage.getItem('id') != 0) {
  174. PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => {
  175. companyDetail.value = res.data;
  176. })
  177. getJobCompanyjobs(current.value)
  178. }
  179. }
  180. })
  181. onBeforeUnmount(() => {
  182. sessionStorage.removeItem('pubilc_id')
  183. sessionStorage.removeItem('mode')
  184. sessionStorage.removeItem('tab_key')
  185. sessionStorage.removeItem('job_id')
  186. })
  187. </script>
  188. <style scoped lang="less">
  189. :deep(.ant-list-item) {
  190. padding: 0 !important;
  191. }
  192. :deep(.ant-card) {
  193. padding: 0 !important;
  194. }
  195. :deep(.ant-card-body) {
  196. padding: 0 !important;
  197. }
  198. </style>