communicationRecords.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. <template>
  2. <view class="page">
  3. <!-- Custom Navbar -->
  4. <view class="custom-navbar">
  5. <view class="navbar-content">
  6. <view class="navbar-left" @click="goBack">
  7. <u-icon name="arrow-leftward" color="color: rgba(51, 51, 51, 1);" size="36"></u-icon>
  8. </view>
  9. <view class="navbar-title">沟通记录</view>
  10. <view class="navbar-right"></view>
  11. </view>
  12. </view>
  13. <view class="tab-section-bg">沟通记录</view>
  14. <!-- Tab Navigation -->
  15. <view class="tab-section">
  16. <u-tabs
  17. :list="tabs"
  18. :current="activeTab"
  19. @change="switchTab"
  20. :is-scroll="false"
  21. :height="88"
  22. :font-size="24"
  23. active-color="rgba(1, 107, 246, 1)"
  24. inactive-color="rgba(102, 102, 102, 1)"
  25. :bar-width="80"
  26. :bar-height="4"
  27. :gutter="40"
  28. bg-color="#ffffff"
  29. :bar-style="{
  30. borderRadius: '2rpx'
  31. }"
  32. ></u-tabs>
  33. </view>
  34. <!-- Content Section -->
  35. <view class="content-section">
  36. <!-- Communication Records List -->
  37. <view class="communication-list" v-if="activeTab === 0">
  38. <!-- 有数据时显示列表 -->
  39. <view v-if="communicationRecords.length > 0">
  40. <!-- Date Group -->
  41. <view class="date-group" v-for="(group, groupIndex) in groupedRecords" :key="groupIndex">
  42. <view class="date-header">
  43. <text class="date-text">{{ group.date }}</text>
  44. </view>
  45. <!-- Records for this date -->
  46. <view
  47. class="talent-card"
  48. v-for="(record, recordIndex) in group.records"
  49. :key="recordIndex"
  50. @click="goToResumeDetail(record)"
  51. >
  52. <view class="talent-content">
  53. <!-- 头像和基本信息 -->
  54. <view class="talent-header">
  55. <image :src="record.avatar" class="talent-avatar" mode="aspectFill"></image>
  56. <view class="talent-info">
  57. <view class="talent-name-section">
  58. <view class="talent-name">{{ record.name }}</view>
  59. <view class="talent-tags">
  60. <view class="status-tag online" v-if="record.isOnline">在线</view>
  61. <view class="status-tag hot" v-if="record.isHot">热门搜索</view>
  62. <view class="status-tag active" v-if="record.lastActive">{{ record.lastActive }}</view>
  63. </view>
  64. </view>
  65. <!-- 经验和薪资 -->
  66. <view class="talent-experience">
  67. <text class="experience-text">{{ record.experience }}</text>
  68. <text class="education-salary">{{ record.education }} {{ record.salary }}</text>
  69. <text class="status-text">{{ record.jobStatus }}</text>
  70. </view>
  71. </view>
  72. </view>
  73. <!-- 当前职位 -->
  74. <view class="current-job" v-if="record.currentJob">
  75. <image src="../../static/images/aixin.svg" class="job-icon" mode="aspectFit"></image>
  76. <text class="job-text">{{ record.currentJob }}</text>
  77. <text class="work-period">{{ record.workPeriod }}</text>
  78. </view>
  79. <!-- 求职期望 -->
  80. <view class="job-expectation">
  81. <image src="../../static/images/xiangzi.svg" class="job-icon" mode="aspectFit"></image>
  82. <text class="expectation-text">求职期望: {{ record.jobExpectation }}</text>
  83. </view>
  84. <!-- 技能标签 -->
  85. <view class="skill-tags">
  86. <view
  87. class="skill-tag"
  88. v-for="(skill, skillIndex) in record.skills"
  89. :key="skillIndex"
  90. >
  91. {{ skill }}
  92. </view>
  93. </view>
  94. <!-- 工作描述 -->
  95. <view class="job-description">
  96. <text class="description-text">{{ record.description }}</text>
  97. </view>
  98. </view>
  99. </view>
  100. </view>
  101. </view>
  102. <!-- 空状态显示 -->
  103. <view class="empty-state" v-else>
  104. <view class="empty-illustration">
  105. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  106. </view>
  107. </view>
  108. </view>
  109. <!-- Interview Records List -->
  110. <view class="interview-list" v-if="activeTab === 1">
  111. <!-- Date Selector -->
  112. <view class="date-selector">
  113. <view class="week-days">
  114. <text class="day-name" v-for="day in currentWeekDays" :key="day.name">{{ day.name }}</text>
  115. </view>
  116. <view class="week-dates">
  117. <view
  118. class="date-item"
  119. :class="{ active: date.isSelected }"
  120. v-for="date in currentWeekDates"
  121. :key="date.value"
  122. @click="selectDate(date)"
  123. >
  124. <text class="date-value">{{ date.value }}</text>
  125. </view>
  126. </view>
  127. </view>
  128. <!-- Interview Records -->
  129. <view class="interview-records">
  130. <!-- 有数据时显示列表 -->
  131. <view v-if="interviewRecords.length > 0">
  132. <view
  133. class="interview-record"
  134. :class="{ 'today': record.isToday, 'tomorrow': record.isTomorrow }"
  135. v-for="(record, index) in interviewRecords"
  136. :key="index"
  137. @click="goToInterviewDetail(record)"
  138. >
  139. <view class="record-content">
  140. <view class="record-left">
  141. <text class="date-label">{{ record.dateLabel }}</text>
  142. <text class="time-label">{{ record.time }}</text>
  143. </view>
  144. <view class="record-divider"></view>
  145. <view class="record-right">
  146. <text class="candidate-name">{{ record.candidateName }}</text>
  147. <text class="candidate-details">{{ record.experience }} {{ record.education }} {{ record.salary }}</text>
  148. </view>
  149. </view>
  150. </view>
  151. </view>
  152. <!-- 空状态显示 -->
  153. <view class="empty-state" v-else>
  154. <view class="empty-illustration">
  155. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  156. </view>
  157. </view>
  158. </view>
  159. </view>
  160. <!-- 收藏标签页 -->
  161. <view class="favorite-list" v-if="activeTab === 2">
  162. <!-- 有数据时显示列表 -->
  163. <view v-if="favoriteRecords.length > 0">
  164. <!-- 收藏记录列表内容 -->
  165. </view>
  166. <!-- 空状态显示 -->
  167. <view class="empty-state" v-else>
  168. <view class="empty-illustration">
  169. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  170. </view>
  171. </view>
  172. </view>
  173. <!-- 收藏职位标签页 -->
  174. <view class="favorite-jobs-list" v-if="activeTab === 3">
  175. <!-- 有数据时显示列表 -->
  176. <view v-if="favoriteJobs.length > 0">
  177. <!-- 收藏职位列表内容 -->
  178. </view>
  179. <!-- 空状态显示 -->
  180. <view class="empty-state" v-else>
  181. <view class="empty-illustration">
  182. <image src="../../static/images/index/Hrempty.svg" class="empty-image" mode="aspectFit" />
  183. </view>
  184. </view>
  185. </view>
  186. </view>
  187. </view>
  188. </template>
  189. <script>
  190. export default {
  191. data() {
  192. return {
  193. statusBarHeight: 0,
  194. activeTab: 0,
  195. tabs: [
  196. { name: '沟通过' },
  197. { name: '面试' },
  198. { name: '收藏' },
  199. { name: '收藏职位' }
  200. ],
  201. communicationRecords: [
  202. {
  203. id: 1,
  204. name: '刘先生',
  205. avatar: '../../static/images/avator.png',
  206. isOnline: true,
  207. isHot: true,
  208. experience: '8年',
  209. education: '本科',
  210. salary: '10-15K',
  211. jobStatus: '在职&考虑机会',
  212. currentJob: '通拓集团·店铺运营',
  213. jobExpectation: '亚马逊运营',
  214. skills: ['精品', '铺货', 'TikTok', '平台运营', '投放策略', '3C数码'],
  215. description: '负责Amazon英国、欧洲站、制定推广与销售计划,达成团队要求的销售业绩;做好数据的统计分析工作,收集、分析...',
  216. workPeriod: '1年10个月',
  217. date: '07-24'
  218. },
  219. {
  220. id: 2,
  221. name: '刘先生',
  222. avatar: '../../static/images/avator.png',
  223. isOnline: true,
  224. isHot: true,
  225. experience: '8年',
  226. education: '本科',
  227. salary: '10-15K',
  228. jobStatus: '在职&考虑机会',
  229. currentJob: '通拓集团·店铺运营',
  230. jobExpectation: '亚马逊运营',
  231. skills: ['精品', '铺货', 'TikTok', '平台运营', '投放策略', '3C数码'],
  232. description: '负责Amazon英国、欧洲站、制定推广与销售计划,达成团队要求的销售业绩;做好数据的统计分析工作,收集、分析...',
  233. workPeriod: '1年10个月',
  234. date: '07-25'
  235. }
  236. ],
  237. // 面试相关数据
  238. selectedDate: null, // 当前选中的日期
  239. // 收藏相关数据
  240. favoriteRecords: [], // 收藏记录(空数组,显示空状态)
  241. favoriteJobs: [], // 收藏职位(空数组,显示空状态)
  242. interviewRecords: [
  243. {
  244. dateLabel: '今天',
  245. time: '20:40',
  246. candidateName: '刘先生',
  247. experience: '8年',
  248. education: '本科',
  249. salary: '10-15K',
  250. isToday: true,
  251. isTomorrow: false
  252. },
  253. {
  254. dateLabel: '明天',
  255. time: '20:40',
  256. candidateName: '刘先生',
  257. experience: '8年',
  258. education: '本科',
  259. salary: '10-15K',
  260. isToday: false,
  261. isTomorrow: true
  262. },
  263. {
  264. dateLabel: '8月15日',
  265. time: '20:40',
  266. candidateName: '刘先生',
  267. experience: '8年',
  268. education: '本科',
  269. salary: '10-15K',
  270. isToday: false,
  271. isTomorrow: false
  272. }
  273. ]
  274. }
  275. },
  276. computed: {
  277. groupedRecords() {
  278. const groups = {}
  279. this.communicationRecords.forEach(record => {
  280. if (!groups[record.date]) {
  281. groups[record.date] = {
  282. date: record.date,
  283. records: []
  284. }
  285. }
  286. groups[record.date].records.push(record)
  287. })
  288. return Object.values(groups)
  289. },
  290. // 当前周的星期名称
  291. currentWeekDays() {
  292. const weekDays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  293. return weekDays.map(name => ({ name }))
  294. },
  295. // 当前周的日期
  296. currentWeekDates() {
  297. const today = new Date()
  298. const currentDay = today.getDay() // 0-6,0是周日
  299. // 获取本周一的日期(周一开始)
  300. const monday = new Date(today)
  301. // 如果今天是周日(0),则往前推6天到周一
  302. // 如果今天是周一(1),则往前推0天
  303. // 如果今天是周二(2),则往前推1天
  304. const daysToMonday = currentDay === 0 ? 6 : currentDay - 1
  305. monday.setDate(today.getDate() - daysToMonday)
  306. // 生成本周7天的日期
  307. const weekDates = []
  308. for (let i = 0; i < 7; i++) {
  309. const date = new Date(monday)
  310. date.setDate(monday.getDate() + i)
  311. const isToday = date.toDateString() === today.toDateString()
  312. const isSelected = this.selectedDate ?
  313. date.toDateString() === this.selectedDate.toDateString() : isToday
  314. weekDates.push({
  315. value: date.getDate().toString(),
  316. date: date,
  317. isSelected: isSelected
  318. })
  319. }
  320. return weekDates
  321. }
  322. },
  323. onLoad() {
  324. const systemInfo = uni.getSystemInfoSync()
  325. this.statusBarHeight = systemInfo.statusBarHeight || 0
  326. },
  327. methods: {
  328. goBack() {
  329. uni.navigateBack()
  330. },
  331. switchTab(index) {
  332. this.activeTab = index
  333. },
  334. goToResumeDetail(record) {
  335. console.log('查看简历详情:', record)
  336. uni.navigateTo({
  337. url: `/pages/talentSearch/resumeDetail?resumeId=${record.id}`
  338. })
  339. },
  340. selectDate(date) {
  341. // 选中当前点击的日期
  342. this.selectedDate = date.date
  343. console.log('选中日期:', date.date)
  344. },
  345. goToInterviewDetail(record) {
  346. console.log('查看面试详情:', record)
  347. // uni.navigateTo({
  348. // url: `/pages/interview/detail?id=${record.id}`
  349. // })
  350. }
  351. }
  352. }
  353. </script>
  354. <style lang="scss" scoped>
  355. .page {
  356. height: 100vh;
  357. overflow: hidden;
  358. }
  359. .tab-section-bg {
  360. position: fixed;
  361. top: 150rpx;
  362. left: 0;
  363. right: 0;
  364. z-index: 1000;
  365. background-color: #ffffff;
  366. padding: 32rpx;
  367. color: rgba(51, 51, 51, 1);
  368. font-family: DM Sans;
  369. font-size: 48rpx;
  370. font-weight: 700;
  371. line-height: 60rpx;
  372. letter-spacing: 0px;
  373. text-align: left;
  374. }
  375. /* Custom Navbar */
  376. .custom-navbar {
  377. position: fixed;
  378. top: 0;
  379. left: 0;
  380. right: 0;
  381. z-index: 1000;
  382. background-color: #ffffff;
  383. padding-top: 80rpx;
  384. }
  385. .navbar-content {
  386. display: flex;
  387. align-items: center;
  388. justify-content: space-between;
  389. height: 44px;
  390. padding: 20rpx;
  391. }
  392. .navbar-left {
  393. width: 44px;
  394. height: 44px;
  395. display: flex;
  396. align-items: center;
  397. justify-content: center;
  398. }
  399. .navbar-title {
  400. color: rgba(51, 51, 51, 1);
  401. font-family: DM Sans;
  402. font-size: 30rpx;
  403. font-weight: 700;
  404. line-height: 52rpx;
  405. letter-spacing: 0.5%;
  406. text-align: center;
  407. }
  408. .navbar-right {
  409. width: 44px;
  410. }
  411. /* Tab Section */
  412. .tab-section {
  413. position: fixed;
  414. top: 250rpx;
  415. left: 0;
  416. right: 0;
  417. background: white;
  418. z-index: 99;
  419. }
  420. /* Content Section */
  421. .content-section {
  422. margin-top: 330rpx;
  423. padding: 20rpx;
  424. height: calc(100vh - 330rpx) !important;
  425. overflow-y: auto;
  426. }
  427. /* Date Group */
  428. .date-group {
  429. margin-bottom: 20rpx;
  430. }
  431. .date-header {
  432. margin-bottom: 16rpx;
  433. }
  434. .date-text {
  435. color: rgba(153, 153, 153, 1);
  436. font-family: DM Sans;
  437. font-size: 24rpx;
  438. font-weight: 400;
  439. line-height: 32rpx;
  440. margin-left: 32rpx;
  441. }
  442. /* Talent Card */
  443. .talent-card {
  444. background-color: #ffffff;
  445. border-radius: 16rpx;
  446. margin-bottom: 20rpx;
  447. padding: 30rpx;
  448. // box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  449. }
  450. .talent-content {
  451. .talent-header {
  452. display: flex;
  453. align-items: flex-start;
  454. .talent-avatar {
  455. width: 80rpx;
  456. height: 80rpx;
  457. border-radius: 50%;
  458. margin-right: 20rpx;
  459. }
  460. .talent-info {
  461. flex: 1;
  462. .talent-name-section {
  463. display: flex;
  464. align-items: center;
  465. justify-content: flex-start;
  466. width: 100%;
  467. margin-bottom: 6rpx;
  468. }
  469. .talent-name {
  470. color: rgba(51, 51, 51, 1);
  471. font-family: DM Sans;
  472. font-size: 28rpx;
  473. font-weight: 500;
  474. line-height: 36rpx;
  475. letter-spacing: 0.5%;
  476. text-align: left;
  477. margin-right: 16rpx;
  478. }
  479. .talent-tags {
  480. display: flex;
  481. flex-wrap: wrap;
  482. gap: 10rpx;
  483. .status-tag {
  484. padding: 8rpx;
  485. border-radius: 12rpx;
  486. font-size: 18rpx;
  487. font-family: DM Sans;
  488. font-weight: 400;
  489. line-height: 20rpx;
  490. letter-spacing: -0.5px;
  491. text-align: left;
  492. &.online {
  493. background: rgba(213, 255, 231, 1);
  494. color: rgba(29, 209, 104, 1);
  495. }
  496. &.hot {
  497. background: rgba(252, 233, 220, 1);
  498. color: rgba(1, 107, 246, 1);
  499. }
  500. &.active {
  501. color: rgba(153, 153, 153, 1);
  502. }
  503. }
  504. }
  505. }
  506. }
  507. .talent-experience {
  508. display: flex;
  509. align-items: center;
  510. margin-bottom: 12rpx;
  511. gap: 16rpx;
  512. color: rgba(156, 164, 171, 1);
  513. font-family: DM Sans;
  514. font-size: 24rpx;
  515. font-weight: 400;
  516. line-height: 32rpx;
  517. letter-spacing: 0.5%;
  518. text-align: left;
  519. }
  520. .current-job {
  521. display: flex;
  522. align-items: center;
  523. margin-bottom: 12rpx;
  524. .job-icon {
  525. width: 40rpx;
  526. height: 40rpx;
  527. margin-right: 8rpx;
  528. }
  529. .job-text {
  530. color: rgba(156, 164, 171, 1);
  531. font-family: DM Sans;
  532. font-size: 24rpx;
  533. font-weight: 400;
  534. line-height: 40rpx;
  535. letter-spacing: 0.5%;
  536. text-align: left;
  537. flex: 1;
  538. }
  539. .work-period {
  540. color: rgba(153, 153, 153, 1);
  541. font-family: DM Sans;
  542. font-size: 22rpx;
  543. font-weight: 400;
  544. line-height: 28rpx;
  545. }
  546. }
  547. .job-expectation {
  548. display: flex;
  549. align-items: center;
  550. margin-bottom: 16rpx;
  551. .job-icon {
  552. width: 40rpx;
  553. height: 40rpx;
  554. margin-right: 8rpx;
  555. }
  556. .expectation-text {
  557. color: rgba(156, 164, 171, 1);
  558. font-family: DM Sans;
  559. font-size: 24rpx;
  560. font-weight: 400;
  561. line-height: 40rpx;
  562. letter-spacing: 0.5%;
  563. text-align: left;
  564. }
  565. }
  566. .skill-tags {
  567. display: flex;
  568. flex-wrap: wrap;
  569. gap: 10rpx;
  570. margin-bottom: 16rpx;
  571. .skill-tag {
  572. padding: 8rpx;
  573. background: rgba(198, 198, 198, 0.1);
  574. border-radius: 12rpx;
  575. color: rgba(153, 153, 153, 1);
  576. font-family: DM Sans;
  577. font-size: 20rpx;
  578. font-weight: 400;
  579. line-height: 20rpx;
  580. letter-spacing: -0.5px;
  581. text-align: left;
  582. }
  583. }
  584. .job-description {
  585. margin-bottom: 12rpx;
  586. .description-text {
  587. color: rgba(97, 110, 124, 1);
  588. font-family: DM Sans;
  589. font-size: 24rpx;
  590. font-weight: 400;
  591. line-height: 32rpx;
  592. letter-spacing: 0px;
  593. text-align: left;
  594. }
  595. }
  596. }
  597. /* Interview List Styles */
  598. .interview-list {
  599. padding: 0 20rpx;
  600. }
  601. /* Date Selector */
  602. .date-selector {
  603. background: #ffffff;
  604. border-radius: 12rpx;
  605. padding: 24rpx 0;
  606. // margin-bottom: 20rpx;
  607. // border: 0.5px solid rgba(227, 231, 236, 1);
  608. }
  609. .week-days {
  610. display: flex;
  611. justify-content: space-between;
  612. margin-bottom: 16rpx;
  613. }
  614. .day-name {
  615. color: rgba(153, 153, 153, 1);
  616. font-family: DM Sans;
  617. font-size: 24rpx;
  618. font-weight: 400;
  619. line-height: 32rpx;
  620. text-align: center;
  621. flex: 1;
  622. }
  623. .week-dates {
  624. display: flex;
  625. justify-content: space-between;
  626. }
  627. .date-item {
  628. flex: 1;
  629. display: flex;
  630. justify-content: center;
  631. align-items: center;
  632. height: 60rpx;
  633. border-radius: 50%;
  634. cursor: pointer;
  635. min-width: 60rpx;
  636. max-width: 60rpx;
  637. }
  638. .date-item.active {
  639. background: rgba(1, 107, 246, 1);
  640. }
  641. .date-value {
  642. color: rgba(51, 51, 51, 1);
  643. font-family: DM Sans;
  644. font-size: 28rpx;
  645. font-weight: 400;
  646. line-height: 36rpx;
  647. text-align: center;
  648. }
  649. .date-item.active .date-value {
  650. color: #ffffff;
  651. }
  652. /* Interview Records */
  653. .interview-records {
  654. background: #ffffff;
  655. border-radius: 12rpx;
  656. padding: 24rpx 0;
  657. // border: 0.5px solid rgba(227, 231, 236, 1);
  658. }
  659. .interview-record {
  660. display: flex;
  661. position: relative;
  662. border-radius: 8rpx;
  663. margin-bottom: 16rpx;
  664. }
  665. .interview-record.today {
  666. background: rgba(250, 187, 143, 1);
  667. }
  668. .interview-record:not(.today) {
  669. background: rgba(221, 221, 221, 1);
  670. }
  671. .interview-record:last-child {
  672. margin-bottom: 0;
  673. }
  674. /* Record Content */
  675. .record-content {
  676. flex: 1;
  677. display: flex;
  678. align-items: center;
  679. gap: 24rpx;
  680. }
  681. .record-left {
  682. display: flex;
  683. flex-direction: column;
  684. min-width: 80rpx;
  685. padding: 32rpx;
  686. }
  687. .record-divider {
  688. width: 10rpx;
  689. height: 100%;
  690. background: rgba(1, 107, 246, 1);
  691. }
  692. .record-right {
  693. flex: 1;
  694. display: flex;
  695. flex-direction: column;
  696. gap: 8rpx;
  697. }
  698. .date-label {
  699. color: rgba(106, 106, 106, 1);
  700. font-family: DM Sans;
  701. font-size: 16rpx;
  702. font-weight: 400;
  703. line-height: 40rpx;
  704. letter-spacing: 0.5%;
  705. text-align: right;
  706. }
  707. .time-label {
  708. color: rgba(106, 106, 106, 1);
  709. font-family: DM Sans;
  710. font-size: 24rpx;
  711. font-weight: 400;
  712. line-height: 32rpx;
  713. letter-spacing: 0.5%;
  714. text-align: left;
  715. }
  716. .candidate-name {
  717. color: rgba(51, 51, 51, 1);
  718. font-family: DM Sans;
  719. font-size: 32rpx;
  720. font-weight: 600;
  721. line-height: 40rpx;
  722. }
  723. .candidate-details {
  724. color: rgba(102, 102, 102, 1);
  725. font-family: DM Sans;
  726. font-size: 24rpx;
  727. font-weight: 400;
  728. line-height: 32rpx;
  729. }
  730. /* Empty State - 与jobManagement页面保持一致 */
  731. .empty-state {
  732. display: flex;
  733. align-items: center;
  734. justify-content: center;
  735. padding: 40rpx;
  736. .empty-illustration {
  737. margin-bottom: 40rpx;
  738. .empty-image {
  739. width: 700rpx;
  740. height: 800rpx;
  741. }
  742. }
  743. .empty-text {
  744. color: rgba(120, 130, 138, 1);
  745. font-family: DM Sans;
  746. font-size: 28rpx;
  747. font-weight: 400;
  748. line-height: 36rpx;
  749. letter-spacing: 0.5%;
  750. text-align: center;
  751. }
  752. }
  753. </style>