list_job.html 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. {include file="header" /}
  2. <link rel="stylesheet" href="/assets/xtu/job.css?v=20260506-2118">
  3. {php}
  4. $jobHeroTitle = trim((string)($category['catname'] ?? cms_t('job_join_us','加入我们')));
  5. $jobHeroDesc = trim((string)($category['description'] ?? cms_t('job_default_list_intro','与 XTU 一起探索技术与行业应用的更多可能。')));
  6. {/php}
  7. <main class="job-page job-list-page job-simple-list-page">
  8. <section class="job-simple-hero">
  9. <div class="content-1300-wrap">
  10. <nav class="job-dji-breadcrumb job-simple-breadcrumb" aria-label="breadcrumb">
  11. <a href="{:cms_lang_url(addon_url('cms/index/index'))}">{:cms_t('home','首页')}</a>
  12. <span>/</span>
  13. <em>{$jobHeroTitle}</em>
  14. </nav>
  15. <h1>{$jobHeroTitle}</h1>
  16. {if $jobHeroDesc !== ''}<p>{$jobHeroDesc}</p>{/if}
  17. </div>
  18. </section>
  19. <section class="job-simple-list-section">
  20. <div class="content-1300-wrap">
  21. <div class="job-simple-tools">
  22. <div class="job-simple-search">
  23. <i class="bi bi-search"></i>
  24. <input type="search" id="jobKeyword" placeholder="{:cms_t('job_search_placeholder','搜索岗位名称、地点或类型')}" autocomplete="off">
  25. </div>
  26. <div class="job-simple-filter" aria-label="{:cms_t('job_category_switch','招聘栏目切换')}">
  27. {if !empty($category['parentid'])}
  28. {yzn module="cms" action="category" catid="$category['parentid']" cache="3600" order="listorder DESC,id ASC" num="20" return="jobTabs"}
  29. {volist name="jobTabs" id="tab"}
  30. <a class="job-filter-chip {if $tab.id==$catid}is-active{/if}" href="{$tab.url}" target="{$tab.target|default='_self'}">{$tab.catname}</a>
  31. {/volist}
  32. {/yzn}
  33. {/if}
  34. </div>
  35. </div>
  36. <div class="job-list-wrap job-simple-list-wrap" id="jobListWrap">
  37. {yzn module="cms" action="lists" catid="$catid" order="listorder DESC,publish_time DESC,id DESC" num="12" page="$page" return="data" moreinfo="1"}
  38. {volist name="data" id="vo"}
  39. <a class="job-card job-simple-row" href="{$vo.url}" data-title="{$vo.title|default=''}" data-address="{$vo.address|default=''}" data-jobtype="{$vo.jobtype|default=''}">
  40. <div class="job-simple-row-title">{$vo.title}</div>
  41. <div class="job-simple-row-meta">
  42. {if !empty($vo.address)}<span><i class="bi bi-geo-alt"></i>{$vo.address}</span>{/if}
  43. {if !empty($vo.jobtype)}<span><i class="bi bi-briefcase"></i>{$vo.jobtype}</span>{/if}
  44. {if !empty($vo.publish_time)}<span><i class="bi bi-clock"></i>{$vo.publish_time|date='Y-m-d'}</span>{/if}
  45. </div>
  46. <span class="job-simple-row-link">{:cms_t('job_view_detail','查看详情')} <i class="bi bi-arrow-right"></i></span>
  47. </a>
  48. {/volist}
  49. {/yzn}
  50. <div class="job-empty" id="jobEmpty" hidden>
  51. <h3>{:cms_t('job_no_match','暂无匹配岗位')}</h3>
  52. <p>{:cms_t('job_no_match_desc','请尝试更换关键词或筛选条件。')}</p>
  53. </div>
  54. </div>
  55. {if !empty($pages)}
  56. <div class="job-pagination">{$pages|raw}</div>
  57. {/if}
  58. </div>
  59. </section>
  60. {include file="footer-links" /}
  61. </main>
  62. <script>
  63. (function(){
  64. var input = document.getElementById('jobKeyword');
  65. var wrap = document.getElementById('jobListWrap');
  66. var empty = document.getElementById('jobEmpty');
  67. if (!wrap) return;
  68. var cards = Array.prototype.slice.call(wrap.querySelectorAll('.job-card'));
  69. function normalize(v){ return (v || '').toString().toLowerCase().replace(/\s+/g,''); }
  70. function applyFilter(){
  71. var kw = normalize(input ? input.value : '');
  72. var visible = 0;
  73. cards.forEach(function(card){
  74. var text = normalize([card.dataset.title, card.dataset.address, card.dataset.jobtype].join(' '));
  75. var show = !kw || text.indexOf(kw) !== -1;
  76. card.style.display = show ? '' : 'none';
  77. if (show) visible++;
  78. });
  79. if (empty) empty.hidden = visible !== 0;
  80. }
  81. if (input) input.addEventListener('input', applyFilter);
  82. })();
  83. </script>
  84. {include file="footer" /}