show_job.html 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. {include file="header" /}
  2. <link rel="stylesheet" href="/assets/xtu/job.css?v=20260506-2118">
  3. {php}
  4. $jobTitle = trim((string)($title ?? ''));
  5. $jobTitle = $jobTitle !== '' ? $jobTitle : trim((string)($category['catname'] ?? cms_t('job_detail','岗位详情')));
  6. $jobAddress = trim((string)($address ?? ''));
  7. $jobType = trim((string)($jobtype ?? ''));
  8. $jobPublish = !empty($publish_time) ? date('Y-m-d', (int)$publish_time) : '';
  9. $jobZhize = trim((string)($zhize ?? ''));
  10. $jobYaoqiu = trim((string)($yaoqiu ?? ''));
  11. $jobZhizeHtml = nl2br($jobZhize);
  12. $jobYaoqiuHtml = nl2br($jobYaoqiu);
  13. $jobApplyEmail = trim((string)config('site.job_email'));
  14. $jobApplyEmail = $jobApplyEmail !== '' ? $jobApplyEmail : 'hr@xtu.com';
  15. $jobMailSubject = rawurlencode(cms_t('job_apply_subject_prefix','应聘岗位:') . $jobTitle);
  16. {/php}
  17. <main class="job-page job-detail-page job-dji-detail-page">
  18. <section class="job-dji-detail-wrap">
  19. <div class="content-1300-wrap">
  20. <nav class="job-dji-breadcrumb" aria-label="breadcrumb">
  21. <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
  22. <span>/</span>
  23. {if !empty($category['parentid'])}
  24. <a href="{:getCategory($category['parentid'],'url')}">{:getCategory($category['parentid'],'catname')}</a>
  25. <span>/</span>
  26. {/if}
  27. <em>{$category.catname|default=cms_t('job_detail','岗位详情')}</em>
  28. </nav>
  29. <article class="job-dji-detail-main">
  30. <h1 class="job-dji-title">{$jobTitle}</h1>
  31. <div class="job-dji-meta">
  32. {if $jobAddress !== ''}<span><i class="bi bi-geo-alt"></i>{$jobAddress}</span>{/if}
  33. {if $jobType !== ''}<span><i class="bi bi-briefcase"></i>{$jobType}</span>{/if}
  34. {if $jobPublish !== ''}<span><i class="bi bi-clock"></i>{$jobPublish}</span>{/if}
  35. </div>
  36. <section class="job-dji-block">
  37. <h2>{:cms_t('job_responsibilities','工作职责')}</h2>
  38. <div class="job-dji-richtext">
  39. {if $jobZhize !== ''}
  40. {$jobZhizeHtml|raw}
  41. {else /}
  42. <p>{:cms_t('job_no_responsibilities','暂无工作职责说明。')}</p>
  43. {/if}
  44. </div>
  45. </section>
  46. <section class="job-dji-block">
  47. <h2>{:cms_t('job_requirements','任职要求')}</h2>
  48. <div class="job-dji-richtext">
  49. {if $jobYaoqiu !== ''}
  50. {$jobYaoqiuHtml|raw}
  51. {else /}
  52. <p>{:cms_t('job_no_requirements','暂无任职要求说明。')}</p>
  53. {/if}
  54. </div>
  55. </section>
  56. <p class="job-dji-apply-note">{:cms_t('job_apply_email_intro','投递简历请发送至邮箱:')}<a href="mailto:{$jobApplyEmail}">{$jobApplyEmail}</a></p>
  57. <div class="job-dji-actions">
  58. <a class="job-dji-btn job-dji-btn-primary" href="mailto:{$jobApplyEmail}?subject={$jobMailSubject}"><i class="bi bi-send"></i>{:cms_t('job_apply_now','立即申请')}</a>
  59. <button class="job-dji-btn job-dji-btn-secondary job-dji-favorite" type="button"><i class="bi bi-star"></i>{:cms_t('job_favorite','收藏')}</button>
  60. <button class="job-dji-btn job-dji-btn-secondary job-dji-share" type="button"><i class="bi bi-share"></i>{:cms_t('job_share','分享')}</button>
  61. </div>
  62. </article>
  63. </div>
  64. </section>
  65. <section class="job-dji-more-section">
  66. <div class="content-1300-wrap">
  67. <div class="job-dji-more-wrap">
  68. <div class="job-dji-more-head">
  69. <h2>{:cms_t('job_more_jobs','更多岗位')}</h2>
  70. <a href="{:getCategory($catid,'url')}">{:cms_t('job_view_all','查看全部')}</a>
  71. </div>
  72. <div class="job-dji-more-list job-simple-list-wrap">
  73. {php}$relatedWhere = "`catid` = " . (int)$catid . " AND `id` <> " . (int)$id . " AND `status` = 1";{/php}
  74. {yzn module="cms" action="lists" catid="$catid" where="$relatedWhere" order="publish_time DESC,id DESC" num="3" return="relatedJobs" moreinfo="1"}
  75. {volist name="relatedJobs" id="related"}
  76. <a class="job-card job-simple-row" href="{$related.url}">
  77. <div class="job-simple-row-title">{$related.title}</div>
  78. <div class="job-simple-row-meta">
  79. {if !empty($related.address)}<span><i class="bi bi-geo-alt"></i>{$related.address}</span>{/if}
  80. {if !empty($related.jobtype)}<span><i class="bi bi-briefcase"></i>{$related.jobtype}</span>{/if}
  81. {if !empty($related.publish_time)}<span><i class="bi bi-clock"></i>{$related.publish_time|date='Y-m-d'}</span>{/if}
  82. </div>
  83. <span class="job-simple-row-link">{:cms_t('job_view_detail','查看详情')} <i class="bi bi-arrow-right"></i></span>
  84. </a>
  85. {/volist}
  86. {/yzn}
  87. </div>
  88. </div>
  89. </div>
  90. </section>
  91. {include file="footer-links" /}
  92. </main>
  93. <div class="job-share-popover" id="jobShareModal" hidden>
  94. <button class="job-share-close" type="button" data-share-close aria-label="{:cms_t('job_share_close','关闭')}"><i class="bi bi-x-lg"></i></button>
  95. <div class="job-share-qr"><img id="jobShareQr" src="" alt="{:cms_t('job_share_qr_alt','岗位分享二维码')}"></div>
  96. <button class="job-share-copy-mini" type="button" id="jobShareCopy"><i class="bi bi-link-45deg"></i>{:cms_t('job_copy_share_link','复制分享链接')}</button>
  97. <input id="jobShareLink" type="text" readonly value="" aria-label="{:cms_t('job_share_link','分享链接')}">
  98. </div>
  99. <script>
  100. (function(){
  101. var modal = document.getElementById('jobShareModal');
  102. var qr = document.getElementById('jobShareQr');
  103. var linkInput = document.getElementById('jobShareLink');
  104. var copyBtn = document.getElementById('jobShareCopy');
  105. var activeShareBtn = null;
  106. var textCopied = "{:cms_t('job_copied_paste','已复制,可粘贴')}";
  107. var textLongPress = "{:cms_t('job_long_press_copy','长按下方链接复制')}";
  108. var textCopyLink = "{:cms_t('job_copy_share_link','复制分享链接')}";
  109. var textFavorite = "{:cms_t('job_favorite','收藏')}";
  110. var textFavoriteTip = "{:cms_t('job_favorite_tip','请按 Ctrl + D 将当前岗位加入浏览器收藏夹')}";
  111. function currentUrl(){ return window.location.href.split('#')[0]; }
  112. function setCopyText(ok){
  113. if (!copyBtn) return;
  114. copyBtn.innerHTML = ok ? '<i class="bi bi-check2"></i>' + textCopied : '<i class="bi bi-link-45deg"></i>' + textLongPress;
  115. setTimeout(function(){ copyBtn.innerHTML = '<i class="bi bi-link-45deg"></i>' + textCopyLink; }, 1800);
  116. }
  117. function placeShare(){
  118. if (!modal || !activeShareBtn || modal.hidden) return;
  119. var rect = activeShareBtn.getBoundingClientRect();
  120. var width = modal.offsetWidth || 196;
  121. var gap = 10;
  122. var left = rect.left + window.pageXOffset + rect.width / 2 - width / 2;
  123. var minLeft = window.pageXOffset + 12;
  124. var maxLeft = window.pageXOffset + window.innerWidth - width - 12;
  125. left = Math.max(minLeft, Math.min(left, maxLeft));
  126. var top = rect.bottom + window.pageYOffset + gap;
  127. modal.style.left = left + 'px';
  128. modal.style.top = top + 'px';
  129. modal.style.setProperty('--share-arrow-left', (rect.left + window.pageXOffset + rect.width / 2 - left) + 'px');
  130. }
  131. function openShare(btn){
  132. activeShareBtn = btn;
  133. var url = currentUrl();
  134. if (linkInput) linkInput.value = url;
  135. if (qr) qr.src = 'https://api.qrserver.com/v1/create-qr-code/?size=150x150&margin=8&data=' + encodeURIComponent(url);
  136. if (modal) {
  137. modal.hidden = false;
  138. placeShare();
  139. }
  140. }
  141. function closeShare(){ if (modal) modal.hidden = true; activeShareBtn = null; }
  142. function fallbackCopy(url){
  143. var ta = document.createElement('textarea');
  144. ta.value = url;
  145. ta.setAttribute('readonly', 'readonly');
  146. ta.style.position = 'fixed';
  147. ta.style.left = '0';
  148. ta.style.top = '0';
  149. ta.style.width = '1px';
  150. ta.style.height = '1px';
  151. ta.style.opacity = '0.01';
  152. ta.style.zIndex = '-1';
  153. document.body.appendChild(ta);
  154. ta.focus();
  155. ta.select();
  156. ta.setSelectionRange(0, ta.value.length);
  157. var ok = false;
  158. try { ok = document.execCommand('copy'); } catch(e) { ok = false; }
  159. document.body.removeChild(ta);
  160. return ok;
  161. }
  162. function copyLink(){
  163. var url = currentUrl();
  164. if (linkInput) linkInput.value = url;
  165. var ok = fallbackCopy(url);
  166. if (ok) { setCopyText(true); return; }
  167. if (navigator.clipboard && window.isSecureContext) {
  168. navigator.clipboard.writeText(url).then(function(){ setCopyText(true); }).catch(function(){
  169. if (linkInput) { linkInput.focus(); linkInput.select(); linkInput.setSelectionRange(0, linkInput.value.length); }
  170. setCopyText(false);
  171. });
  172. } else {
  173. if (linkInput) { linkInput.focus(); linkInput.select(); linkInput.setSelectionRange(0, linkInput.value.length); }
  174. setCopyText(false);
  175. }
  176. }
  177. document.addEventListener('click', function (event) {
  178. var shareBtn = event.target.closest('.job-dji-share');
  179. var favBtn = event.target.closest('.job-dji-favorite');
  180. var closeBtn = event.target.closest('[data-share-close]');
  181. if (shareBtn) { event.stopPropagation(); openShare(shareBtn); return; }
  182. if (favBtn) favoritePage(favBtn);
  183. if (closeBtn) { closeShare(); return; }
  184. if (modal && !modal.hidden && !event.target.closest('#jobShareModal')) closeShare();
  185. });
  186. if (copyBtn) copyBtn.addEventListener('click', function(event){ event.stopPropagation(); copyLink(); });
  187. window.addEventListener('resize', placeShare);
  188. window.addEventListener('scroll', placeShare, true);
  189. function favoritePage(btn){
  190. var url = currentUrl();
  191. var title = document.title;
  192. try {
  193. if (window.external && ('addFavorite' in window.external)) {
  194. window.external.addFavorite(url, title);
  195. return;
  196. }
  197. if (window.sidebar && window.sidebar.addPanel) {
  198. window.sidebar.addPanel(title, url, '');
  199. return;
  200. }
  201. } catch(e) {}
  202. alert(textFavoriteTip);
  203. if (btn) btn.innerHTML = '<i class="bi bi-star-fill"></i>' + textFavorite;
  204. }
  205. document.addEventListener('keydown', function(event){ if (event.key === 'Escape') closeShare(); });
  206. })();
  207. </script>
  208. {include file="footer" /}