onlineResume.vue 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186
  1. <template>
  2. <view class="online-resume" :style="{ paddingTop: (12 + statusBarHeight + 88 - 60) + 'px' }">
  3. <!-- 固定顶部导航栏 -->
  4. <view class="fixed-nav" :style="{ paddingTop: (12 + statusBarHeight) + 'px' }">
  5. <view class="navbar">
  6. <view class="navbar-content">
  7. <view class="navbar-left" @click="goBack">
  8. <u-icon name="arrow-leftward" size="38" color="#333"></u-icon>
  9. </view>
  10. <view class="navbar-title">在线简历</view>
  11. <view class="navbar-right"></view>
  12. </view>
  13. </view>
  14. </view>
  15. <!-- 用户信息区域 -->
  16. <view class="user-profile">
  17. <view class="avatar-container">
  18. <image :src="detail.userEntity&&detail.userEntity.avatar?detail.userEntity.avatar:'../../static/logo.png'" class="user-avatar" mode="aspectFill"></image>
  19. <view class="edit-avatar-icon" @click="goToBasicInfo">
  20. <image src="../../static/images/index/Combined-Shape.svg" style="width: 32rpx;height: 32rpx;" mode=""></image>
  21. </view>
  22. </view>
  23. <view class="user-name">{{detail.userEntity&&detail.userEntity.userName||'匿名'}}</view>
  24. <view class="user-info">{{detail.workExpTimes}}年经验·{{detail.userEntity&&detail.userEntity.age}}岁·{{detail.degree}}·{{detail.userEntity&&detail.userEntity.sex==1?'男':'女'}}</view>
  25. <view class="contact-info">
  26. <view class="contact-item">
  27. <image src="../../static/images/index/phone.svg" style="width: 24rpx;height: 24rpx;" mode=""></image>
  28. <text class="contact-text">{{detail.resumeList&&detail.resumeList.resumesPhone}}</text>
  29. </view>
  30. <view class="contact-item">
  31. <image src="../../static/images/index/wx.svg" style="width: 24rpx;height: 24rpx;" mode=""></image>
  32. <text class="contact-text">{{detail.userEntity&&detail.userEntity.weChatNum}}</text>
  33. </view>
  34. </view>
  35. <view class="availability">
  36. <text class="status-text">{{detail.resumeList&&detail.resumeList.resumesStatus?statusList[detail.resumeList.resumesStatus].text:statusList[0].text}}</text>
  37. <view class="status-dot"></view>
  38. </view>
  39. </view>
  40. <!-- 内容区域 -->
  41. <view class="content-section">
  42. <!-- 跨境电商工作经验 -->
  43. <view class="switch-section">
  44. <view class="switch-left">
  45. <view class="flex justify-between">
  46. <view class="switch-title">是否有跨境电商工作经验</view>
  47. <view class="template-text">不同简历模版</view>
  48. </view>
  49. <view class="section-status" v-if="hasEcommerceExperience">
  50. 是,有跨境电商工作经验
  51. </view>
  52. </view>
  53. <u-switch @change="setResume" v-model="hasEcommerceExperience" active-color="#007AFF" size="60"></u-switch>
  54. </view>
  55. <!-- 个人优势 -->
  56. <view class="section-item">
  57. <view class="section-header">
  58. <view class="section-title">个人优势</view>
  59. <view class="edit-icon">
  60. <image src="../../static/images/index/Combined-Shape.svg" style="width: 48rpx;height: 48rpx;" mode=""></image>
  61. </view>
  62. </view>
  63. <view class="advantage-content">
  64. <textarea @blur="setResume" auto-height v-model="detail.resumeList&&detail.resumeList.adv"></textarea>
  65. </view>
  66. </view>
  67. <!-- 全职期望卡片 -->
  68. <view class="expectation-card">
  69. <view class="card-header">
  70. <view class="header-left">
  71. <image src="../../static/images/index/lingdai.svg" class="header-icon" />
  72. <text class="header-title">全职期望</text>
  73. </view>
  74. <text class="progress-text">{{detail.intentions&&detail.intentions.length}}/3</text>
  75. </view>
  76. <view class="job-list">
  77. <view @longpress="commonDelete(item.intentionId,'intentions')" @click="addExpectation(item.intentionId)" class="job-item" v-for="(item,index) in detail.intentions">
  78. <view class="job-info">
  79. <view>
  80. <text class="job-title">{{item.ruleClassifyName}}</text>
  81. <view @click.stop="goToPreferenceSetting(item)">
  82. <view class="preference-btn">
  83. <text>设置求职偏好</text>
  84. </view>
  85. <u-icon name="arrow-right" color="rgba(29, 33, 41, 1)" size="28"></u-icon>
  86. </view>
  87. </view>
  88. <text class="job-details">{{item.salaryRange}}・{{item.industry||'不限'}}</text>
  89. <text class="job-location">{{item.citys}}</text>
  90. </view>
  91. </view>
  92. </view>
  93. <view class="add-expectation-btn" @click="addExpectation('')">
  94. <text>添加求职期望</text>
  95. </view>
  96. </view>
  97. <!-- 工作经历 -->
  98. <view class="work-experience-section">
  99. <view class="section-header">
  100. <view class="section-title">
  101. <text class="required-mark">*</text>
  102. <text class="required-title">工作经历</text>
  103. <view class="section-desc">请填写专属跨境行业的工作经验</view>
  104. </view>
  105. <view class="edit-icon" @click="goToWorkExperience('')">
  106. <image src="../../static/images/index/Combined-Shape.svg" style="width: 48rpx;height: 48rpx;" mode=""></image>
  107. </view>
  108. </view>
  109. <view class="experience-list">
  110. <view class="experience-item" @click.stop="goToWorkExperience(item.workExpId)" v-for="item in detail.workExps">
  111. <view class="company-logo">
  112. <image src="../../static/images/index/changsha.svg" class="logo-img" mode="aspectFit"></image>
  113. </view>
  114. <view class="experience-content">
  115. <view class="experience-box" v-for="it in item.workExpDetails">
  116. <view class="job-info-row">
  117. <view class="job-title">{{it.position}}</view>
  118. <view class="job-department">{{it.department}}</view>
  119. </view>
  120. <view class="company-period-row">
  121. <view class="company-name">{{item.companyName}}</view>
  122. <view class="work-period">{{it.startTime}}-{{it.endTime}}</view>
  123. </view>
  124. <view class="job-description">
  125. {{it.workContent}}
  126. </view>
  127. <view class="skill-tags">
  128. <view class="tag" v-for="skill in it.skills">{{skill}}</view>
  129. </view>
  130. </view>
  131. </view>
  132. <view @click.stop="commonDelete(item.workExpId,'workExps')">
  133. <image src="../../static/images/index/delete.svg" class="delete-icon" />
  134. </view>
  135. </view>
  136. </view>
  137. </view>
  138. <!-- 教育经历 -->
  139. <view class="education-section">
  140. <view class="section-header">
  141. <view class="section-title">
  142. <text>教育经历</text>
  143. </view>
  144. <view class="edit-icon" @click="goToEducationExperience('')">
  145. <image src="../../static/images/index/Combined-Shape.svg" style="width: 48rpx;height: 48rpx;" mode=""></image>
  146. </view>
  147. </view>
  148. <view class="education-list">
  149. <view class="education-item" @click.stop="goToEducationExperience(item.eduId)" v-for="(item,index) in detail.eduList">
  150. <view class="school-logo">
  151. <image src="../../static/images/index/wuhan.svg" class="logo-img" mode="aspectFit"></image>
  152. </view>
  153. <view class="education-content">
  154. <view class="school-name">{{item.school}}</view>
  155. <view class="degree-info">{{item.degree}} • {{item.profession}} • {{new Date(item.startTime).getFullYear()}}-{{new Date(item.endTime).getFullYear()}}</view>
  156. <view class="education-description">
  157. {{item.detail}}
  158. </view>
  159. </view>
  160. <view @click.stop="commonDelete(item.eduId,'eduList')">
  161. <image src="../../static/images/index/delete.svg" class="delete-icon" />
  162. </view>
  163. </view>
  164. </view>
  165. </view>
  166. <!-- 技能 -->
  167. <view class="skills-section">
  168. <view class="section-header">
  169. <view class="section-title">
  170. <text>技能</text>
  171. </view>
  172. <view class="edit-icon" @click="goToJobSkills">
  173. <image src="../../static/images/index/Combined-Shape.svg" style="width: 48rpx;height: 48rpx;" mode=""></image>
  174. </view>
  175. </view>
  176. <view class="skills-grid">
  177. <view class="skill-tag" v-for="(skill, skillIndex) in detail.skills" :key="skillIndex">{{skill.skillName}}</view>
  178. </view>
  179. </view>
  180. </view>
  181. </view>
  182. </template>
  183. <script>
  184. var intentionId=0
  185. export default {
  186. data() {
  187. return {
  188. statusBarHeight: 0, // 状态栏高度
  189. hasEcommerceExperience: false,
  190. detail:{},
  191. statusList: [
  192. {
  193. value: 'unemployed_available',
  194. text: '离职-随时到岗',
  195. },
  196. {
  197. value: 'employed_monthly',
  198. text: '在职-月内到岗',
  199. },
  200. {
  201. value: 'employed_considering',
  202. text: '在职-考虑机会',
  203. },
  204. {
  205. value: 'employed_not_considering',
  206. text: '在职-暂不考虑',
  207. }
  208. ]
  209. }
  210. },
  211. onLoad() {
  212. // 获取状态栏高度
  213. let systemInfo = uni.getSystemInfoSync();
  214. this.statusBarHeight = systemInfo.statusBarHeight || 0;
  215. this.getData()
  216. var that=this
  217. uni.$on('updateResume',()=>{
  218. console.log(2222222222222)
  219. that.getData()
  220. })
  221. // 监听技能设置更新
  222. uni.$on('skillsUpdated', (data) => {
  223. if(data.set!=1)
  224. return
  225. that.changeSkill(data.selectedTags)
  226. })
  227. uni.$on('preferenceUpdated', (data) => {
  228. if(data.set!=1)
  229. return
  230. that.changePreference(data.preferences)
  231. })
  232. },
  233. onUnload(){
  234. uni.$off('updateResume')
  235. uni.$off('preferenceUpdated')
  236. uni.$off('skillsUpdated')
  237. },
  238. methods: {
  239. goBack() {
  240. uni.navigateBack();
  241. },
  242. getData(){
  243. var that=this
  244. this.$Request.getT("/app/userFirst/getUserResumes", {}).then((res) => {
  245. if (res.code == 0) {
  246. that.detail=res.data
  247. that.hasEcommerceExperience=res.data.resumeList&&res.data.resumeList.ifExp?true:false
  248. that.detail.degree=that.$queue.getHighestEducation(res.data.eduList)
  249. res.data.workExps.forEach(function(item) {
  250. console.log(item.type);
  251. try {
  252. if (typeof item.type === 'string' && (item.type.startsWith('[') || item.type.startsWith('{'))) {
  253. item.type = JSON.parse(item.type);
  254. }
  255. } catch (e) {
  256. console.warn('item.type JSON解析失败:', item.type);
  257. }
  258. item.workExpDetails = [];
  259. res.data.workExpList.forEach(function(it) {
  260. console.log(it.skills);
  261. try {
  262. if (typeof it.skills === 'string' && (it.skills.startsWith('[') || it.skills.startsWith('{'))) {
  263. it.skills = JSON.parse(it.skills);
  264. }
  265. } catch (e) {
  266. console.warn('it.skills JSON解析失败:', it.skills);
  267. }
  268. it.startTime = it.startTime.slice(0, 7);
  269. if (that.$queue.isCurrentMonth(new Date(it.endTime)))
  270. it.endTime = '至今';
  271. else
  272. it.endTime = it.endTime.slice(0, 7);
  273. if (it.workExpId == item.workExpId)
  274. item.workExpDetails.push(it);
  275. });
  276. });
  277. console.log('最终数据')
  278. console.log(res.data.workExps);
  279. that.detail.workExps=res.data.workExps
  280. } else {
  281. uni.showToast({
  282. title: res.msg,
  283. icon: "none",
  284. });
  285. }
  286. });
  287. },
  288. addExpectation(id='') {
  289. uni.navigateTo({
  290. url: '/package/jobIntention/addExpectation?id='+id
  291. })
  292. },
  293. goToPreferenceSetting(item) {
  294. intentionId=item.intentionId
  295. if(item.ruleClassifyId==''||item.ruleClassifyId==0)
  296. return this.$queue.showToast('请先选择岗位')
  297. uni.navigateTo({
  298. url: '/package/jobIntention/preferenceSetting?set=1&jobId='+item.ruleClassifyId+'&jobTitle='+item.ruleClassifyName+'&selectedPreferences='+encodeURIComponent(JSON.stringify(item.industry==''||item.industry==null?[]:item.industry.split('/')))
  299. })
  300. },
  301. goToJobSkills() {
  302. uni.navigateTo({
  303. url: '/package/jobIntention/jobSkills?set=1&jobTitle=我的&skill='+encodeURIComponent(JSON.stringify(this.detail.skills==null?[]:this.$queue.array_column(this.detail.skills,'skillName')))
  304. })
  305. },
  306. goToWorkExperience(id='') {
  307. // 获取业务类型数据
  308. const businessTypes = this.getBusinessTypes()
  309. console.log('传递给工作经历页面的业务类型:', businessTypes)
  310. console.log('当前hasEcommerceExperience状态:', this.hasEcommerceExperience)
  311. uni.navigateTo({
  312. url: `/pages/my/workExperience?id=${id}&businessTypes=${encodeURIComponent(JSON.stringify(businessTypes))}`
  313. })
  314. },
  315. goToEducationExperience(id='') {
  316. uni.navigateTo({
  317. url: `/pages/my/educationExperience?id=${id}`
  318. })
  319. },
  320. goToBasicInfo() {
  321. uni.navigateTo({
  322. url: '/package/jobIntention/basicInfo?resumesStatus='+(this.detail.resumeList&&this.detail.resumeList.resumesStatus||0)+'&birthday='+(this.detail.resumeList&&this.detail.resumeList.birthday||'')+'&ifExp='+(this.detail.resumeList&&this.detail.resumeList.ifExp||0)+'&resumesPhone='+(this.detail.resumeList&&this.detail.resumeList.resumesPhone||'')
  323. })
  324. },
  325. getBusinessTypes() {
  326. // 根据是否有跨境电商经验返回业务类型
  327. if (this.hasEcommerceExperience) {
  328. return ['0']
  329. } else {
  330. return []
  331. }
  332. },
  333. // 设置
  334. setResume() {
  335. let data={
  336. ifExp:this.hasEcommerceExperience?1:0,
  337. adv:this.detail.resumeList&&this.detail.resumeList.adv||'',
  338. }
  339. uni.showLoading({ title: "提交中..." });
  340. this.$Request.postJson("/app/userFirst/regist", data).then((res) => {
  341. uni.hideLoading();
  342. if (res.code == 0) {
  343. // 实际开发中可以在这里添加跳转逻辑
  344. } else {
  345. uni.showToast({
  346. title: res.msg,
  347. icon: "none",
  348. });
  349. }
  350. });
  351. },
  352. changeSkill(skill) {
  353. var skills=[]
  354. for(var i in skill){
  355. skills[i]={
  356. "userId": "",
  357. "skillId": "",
  358. "skillName": skill[i],
  359. "isuse": 1
  360. }
  361. }
  362. let data={
  363. skills
  364. }
  365. var that=this
  366. this.$Request.postJson("/app/userFirst/updateSkill", skills).then((res) => {
  367. if (res.code == 0) {
  368. // 实际开发中可以在这里添加跳转逻辑
  369. that.getData()
  370. } else {
  371. uni.showToast({
  372. title: res.msg,
  373. icon: "none",
  374. });
  375. }
  376. });
  377. },
  378. changePreference(preference) {
  379. if(intentionId==0)
  380. return;
  381. var industry=preference==''||preference==null?'':preference.join('/')
  382. let data={
  383. intentionId,
  384. industry
  385. }
  386. var that=this
  387. this.$Request.postJson("/app/intention/saveUpdate", data).then((res) => {
  388. if (res.code == 0) {
  389. // 实际开发中可以在这里添加跳转逻辑
  390. that.getData()
  391. } else {
  392. uni.showToast({
  393. title: res.msg,
  394. icon: "none",
  395. });
  396. }
  397. });
  398. },
  399. commonDelete(id,modules) {
  400. var that=this
  401. var action='userFirst/deleteEdu'
  402. var params={eduId:id}
  403. if(modules=='workExps'){
  404. action='userFirst/deleteWorkExp'
  405. params={workExpId:id}
  406. }
  407. if(modules=='intentions'){
  408. action='intention/deleteIntention'
  409. params={intentionId:id}
  410. }
  411. this.$queue.appConfirm('确认删除该条内容么?',function(res){
  412. if(!res)
  413. return;
  414. that.$Request.postJson("/app/"+action, params).then((res) => {
  415. if (res.code == 0) {
  416. // 实际开发中可以在这里添加跳转逻辑
  417. var info = that.detail[modules].filter(function (item) {
  418. return item[modules=='workExps'?'workExpId':(modules=='intentions'?'intentionId':'eduId')] != id;
  419. });
  420. that.detail[modules]=info
  421. } else {
  422. uni.showToast({
  423. title: res.msg,
  424. icon: "none",
  425. });
  426. }
  427. });
  428. })
  429. },
  430. },
  431. watch: {
  432. hasEcommerceExperience(newVal, oldVal) {
  433. console.log('hasEcommerceExperience 变化:', oldVal, '->', newVal)
  434. // 只有有效的布尔值才保存到缓存
  435. }
  436. }
  437. }
  438. </script>
  439. <style lang="scss" scoped>
  440. .delete-icon{
  441. width: 40rpx;
  442. height: 40rpx;
  443. }
  444. .online-resume {
  445. // background-color: #F2F6FC;
  446. min-height: 100vh;
  447. // padding-top 已改为动态计算,在模板中通过 :style 设置
  448. }
  449. .fixed-nav {
  450. position: fixed;
  451. top: 0;
  452. left: 0;
  453. right: 0;
  454. z-index: 9999;
  455. background-color: #ffffff;
  456. padding: 0 32rpx;
  457. // padding-top 已改为动态计算,在模板中通过 :style 设置
  458. }
  459. // 顶部导航栏
  460. .navbar {
  461. background: #fff;
  462. height: 88rpx;
  463. padding: 0 8rpx;
  464. // padding: 80rpx 0 40rpx 0; // 已移除,因为现在是固定导航栏
  465. .navbar-content {
  466. display: flex;
  467. align-items: center;
  468. justify-content: space-between;
  469. padding: 0 30rpx;
  470. height: 60rpx;
  471. .navbar-left {
  472. width: 60rpx;
  473. height: 60rpx;
  474. display: flex;
  475. align-items: center;
  476. justify-content: center;
  477. }
  478. .navbar-title {
  479. color: rgba(23, 23, 37, 1);
  480. font-family: DM Sans;
  481. font-size: 36rpx;
  482. font-weight: 700;
  483. line-height: 52rpx;
  484. letter-spacing: 0%;
  485. text-align: center;
  486. }
  487. .navbar-right {
  488. width: 60rpx;
  489. height: 60rpx;
  490. }
  491. }
  492. }
  493. // 用户信息区域
  494. .user-profile {
  495. background: #fff;
  496. padding: 60rpx 30rpx 40rpx;
  497. text-align: center;
  498. border-bottom: 2px solid rgba(227, 231, 236, 1);
  499. .avatar-container {
  500. position: relative;
  501. display: inline-block;
  502. margin-bottom: 30rpx;
  503. .user-avatar {
  504. width: 180rpx;
  505. height: 180rpx;
  506. border-radius: 50%;
  507. }
  508. .edit-avatar-icon {
  509. position: absolute;
  510. bottom: 10rpx;
  511. right: 10rpx;
  512. width: 48rpx;
  513. height: 48rpx;
  514. background: #fff;
  515. border-radius: 50%;
  516. display: flex;
  517. align-items: center;
  518. justify-content: center;
  519. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.1);
  520. }
  521. }
  522. .user-name {
  523. color: rgba(21, 21, 23, 1);
  524. font-family: DM Sans;
  525. font-size: 24px;
  526. font-weight: 700;
  527. line-height: 26px;
  528. letter-spacing: 0%;
  529. text-align: center;
  530. }
  531. .user-info {
  532. color: rgba(102, 112, 122, 1);
  533. font-family: DM Sans;
  534. font-size: 28rpx;
  535. line-height: 44rpx;
  536. font-weight: 400;
  537. letter-spacing: 0%;
  538. text-align: center;
  539. margin: 30rpx auto;
  540. }
  541. .contact-info {
  542. display: flex;
  543. justify-content: center;
  544. gap: 40rpx;
  545. margin-bottom: 30rpx;
  546. .contact-item {
  547. display: flex;
  548. align-items: center;
  549. gap: 10rpx;
  550. .contact-text {
  551. color: rgba(116, 116, 116, 1);
  552. font-family: DM Sans;
  553. font-size: 16rpx;
  554. font-weight: 400;
  555. line-height: 20rpx;
  556. letter-spacing: 0%;
  557. text-align: center;
  558. }
  559. }
  560. }
  561. .availability {
  562. display: flex;
  563. align-items: center;
  564. justify-content: center;
  565. gap: 10rpx;
  566. .status-text {
  567. color: rgba(156, 164, 171, 1);
  568. font-family: DM Sans;
  569. font-size: 24rpx;
  570. font-weight: 400;
  571. line-height: 32rpx;
  572. letter-spacing: 0%;
  573. text-align: left;
  574. }
  575. .status-dot {
  576. width: 18rpx;
  577. height: 18rpx;
  578. background: rgba(0, 204, 154, 1);
  579. border-radius: 50%;
  580. }
  581. }
  582. }
  583. // 内容区域
  584. .content-section {
  585. // background: #F2F6FC;
  586. padding: 30rpx;
  587. // 开关部分样式
  588. .switch-section {
  589. display: flex;
  590. align-items: center;
  591. justify-content: space-between;
  592. background: #fff;
  593. border-radius: 12rpx;
  594. padding: 24rpx;
  595. margin-bottom: 16rpx;
  596. .switch-left {
  597. flex: 1;
  598. .switch-title {
  599. color: rgba(21, 22, 26, 1);
  600. font-family: DM Sans;
  601. font-size: 28rpx;
  602. font-weight: 500;
  603. line-height: 52rpx;
  604. letter-spacing: 0%;
  605. text-align: left;
  606. margin-bottom: 12rpx;
  607. }
  608. .template-text {
  609. color: rgba(153, 153, 153, 1);
  610. font-family: DM Sans;
  611. font-size: 20rpx;
  612. font-weight: 400;
  613. line-height: 52rpx;
  614. letter-spacing: 0%;
  615. text-align: right;
  616. }
  617. .section-status {
  618. color: rgba(1, 107, 246, 1);
  619. font-family: DM Sans;
  620. font-size: 24rpx;
  621. font-weight: 400;
  622. line-height: 40rpx;
  623. letter-spacing: 0%;
  624. text-align: left;
  625. }
  626. }
  627. }
  628. .section-item {
  629. background: #fff;
  630. border-radius: 16rpx;
  631. padding: 30rpx;
  632. margin-bottom: 20rpx;
  633. box-sizing: border-box;
  634. border: 1px solid rgba(227, 231, 236, 1);
  635. border-radius: 12px;
  636. .section-header {
  637. display: flex;
  638. align-items: center;
  639. justify-content: space-between;
  640. margin-bottom: 20rpx;
  641. .section-title {
  642. color: rgba(23, 23, 37, 1);
  643. font-family: Inter;
  644. font-size: 32rpx;
  645. font-weight: 600;
  646. line-height: 48rpx;
  647. letter-spacing: 0%;
  648. text-align: left;
  649. }
  650. .template-text {
  651. color: rgba(120, 130, 138, 1);
  652. font-family: DM Sans;
  653. font-size: 24rpx;
  654. font-weight: 400;
  655. line-height: 32rpx;
  656. letter-spacing: 0%;
  657. text-align: left;
  658. }
  659. .edit-icon {
  660. width: 40rpx;
  661. height: 40rpx;
  662. display: flex;
  663. align-items: center;
  664. justify-content: center;
  665. }
  666. }
  667. .section-status {
  668. font-size: 28rpx;
  669. color: #007AFF;
  670. font-weight: 500;
  671. }
  672. .advantage-content {
  673. font-size: 14px;
  674. color: #666;
  675. line-height: 1.6;
  676. textarea{
  677. width: 100%;
  678. height: fit-content;
  679. min-height: 44rpx;
  680. }
  681. }
  682. }
  683. // 全职期望卡片样式
  684. .expectation-card {
  685. background: #ffffff;
  686. border-radius: 12rpx;
  687. padding: 30rpx;
  688. margin-bottom: 20rpx;
  689. box-sizing: border-box;
  690. border: 0.5px solid rgba(227, 231, 236, 1);
  691. border-radius: 6px;
  692. background: rgba(253, 253, 253, 1);
  693. .card-header {
  694. display: flex;
  695. justify-content: space-between;
  696. align-items: center;
  697. .header-left {
  698. display: flex;
  699. align-items: center;
  700. .header-icon {
  701. width: 40rpx;
  702. height: 40rpx;
  703. margin-right: 20rpx;
  704. }
  705. .header-title {
  706. color: rgba(29, 33, 41, 1);
  707. font-family: DM Sans;
  708. font-size: 28rpx;
  709. font-weight: 500;
  710. line-height: 16px;
  711. letter-spacing: 0%;
  712. text-align: left;
  713. }
  714. }
  715. .progress-text {
  716. font-family: DM Sans;
  717. font-size: 24rpx;
  718. font-weight: 700;
  719. line-height: 13px;
  720. letter-spacing: 0%;
  721. text-align: right;
  722. }
  723. }
  724. .job-list {
  725. margin-bottom: 10rpx;
  726. .job-item {
  727. display: flex;
  728. justify-content: space-between;
  729. align-items: center;
  730. padding: 20rpx 0;
  731. &:last-child {
  732. border-bottom: none;
  733. }
  734. .job-info {
  735. flex: 1;
  736. > view:first-child {
  737. display: flex;
  738. justify-content: space-between;
  739. align-items: center;
  740. margin-bottom: 4rpx;
  741. }
  742. .job-title {
  743. color: rgba(29, 33, 41, 1);
  744. font-family: DM Sans;
  745. font-size: 28rpx;
  746. font-weight: 500;
  747. line-height: 16px;
  748. letter-spacing: 0%;
  749. text-align: left;
  750. }
  751. .job-details {
  752. display: block;
  753. font-size: 24rpx;
  754. color: rgba(153, 153, 153, 1);
  755. margin-bottom: 4rpx;
  756. }
  757. .job-location {
  758. font-size: 24rpx;
  759. color: rgba(153, 153, 153, 1);
  760. }
  761. }
  762. .preference-btn {
  763. display: flex;
  764. align-items: center;
  765. padding: 8rpx;
  766. border: 0.5rpx solid #007AFF;
  767. border-radius: 12rpx;
  768. margin-right: 10rpx;
  769. text {
  770. font-size: 18rpx;
  771. color: #007AFF;
  772. }
  773. }
  774. .job-info > view:first-child > view:last-child {
  775. display: flex;
  776. align-items: center;
  777. }
  778. }
  779. }
  780. .add-expectation-btn {
  781. width: 100%;
  782. height: 70rpx;
  783. border: 1rpx solid #007AFF;
  784. border-radius: 42rpx;
  785. display: flex;
  786. align-items: center;
  787. justify-content: center;
  788. text {
  789. font-size: 28rpx;
  790. color: #007AFF;
  791. font-weight: 500;
  792. }
  793. }
  794. }
  795. // 工作经历部分样式
  796. .work-experience-section {
  797. background: #fff;
  798. border-radius: 12px;
  799. padding: 30rpx;
  800. margin-bottom: 20rpx;
  801. box-sizing: border-box;
  802. border: 1px solid rgba(1, 107, 246, 1);
  803. .section-header {
  804. display: flex;
  805. align-items: center;
  806. justify-content: space-between;
  807. margin-bottom: 30rpx;
  808. .section-title {
  809. display: flex;
  810. align-items: center;
  811. .required-mark {
  812. color: #FF3B30;
  813. font-size: 18px;
  814. font-weight: 600;
  815. margin-right: 8rpx;
  816. }
  817. .required-title {
  818. font-family: DM Sans;
  819. font-size: 28rpx;
  820. font-weight: 700;
  821. line-height: 52rpx;
  822. letter-spacing: 0%;
  823. text-align: left;
  824. margin-right: 12rpx;
  825. }
  826. text {
  827. color: rgba(23, 23, 37, 1);
  828. font-family: Inter;
  829. font-size: 20px;
  830. font-weight: 600;
  831. line-height: 24px;
  832. }
  833. }
  834. .section-desc {
  835. color: rgba(1, 107, 246, 1);
  836. font-family: DM Sans;
  837. font-size: 20rpx;
  838. font-weight: 400;
  839. line-height: 44rpx;
  840. letter-spacing: 0%;
  841. text-align: left;
  842. }
  843. }
  844. .experience-list {
  845. .experience-item {
  846. display: flex;
  847. padding: 24rpx 0;
  848. border-bottom: 1rpx solid #F0F0F0;
  849. &:last-child {
  850. border-bottom: none;
  851. }
  852. .company-logo {
  853. width: 90rpx;
  854. height: 90rpx;
  855. margin-right: 24rpx;
  856. flex-shrink: 0;
  857. border-radius: 8px;
  858. background: rgba(246, 246, 246, 1);
  859. display: flex;
  860. flex-direction: column;
  861. align-items: center;
  862. justify-content: center;
  863. .logo-img {
  864. width: 50rpx;
  865. height: 50rpx;
  866. border-radius: 8rpx;
  867. }
  868. }
  869. .experience-content {
  870. flex: 1;
  871. .experience-box{
  872. margin-bottom: 20rpx;
  873. }
  874. .job-info-row {
  875. display: flex;
  876. align-items: center;
  877. margin-bottom: 4rpx;
  878. }
  879. .job-title {
  880. color: rgba(23, 23, 37, 1);
  881. font-family: DM Sans;
  882. font-size: 28rpx;
  883. font-weight: 400;
  884. line-height: 44rpx;
  885. letter-spacing: 0%;
  886. text-align: left;
  887. margin-right: 12rpx;
  888. }
  889. .job-department {
  890. color: rgba(120, 130, 138, 1);
  891. font-family: DM Sans;
  892. font-size: 20rpx;
  893. font-weight: 400;
  894. line-height: 44rpx;
  895. letter-spacing: 0%;
  896. text-align: left;
  897. }
  898. .company-period-row {
  899. display: flex;
  900. align-items: center;
  901. justify-content: flex-start;
  902. margin-bottom: 12rpx;
  903. gap: 12rpx;
  904. padding: 12rpx 0;
  905. }
  906. .company-name {
  907. color: rgba(120, 130, 138, 1);
  908. font-family: DM Sans;
  909. font-size: 20rpx;
  910. font-weight: 400;
  911. line-height: 10px;
  912. letter-spacing: 0.5%;
  913. text-align: left;
  914. }
  915. .work-period {
  916. color: rgba(120, 130, 138, 1);
  917. font-family: DM Sans;
  918. font-size: 20rpx;
  919. font-weight: 400;
  920. line-height: 10px;
  921. letter-spacing: 0.5%;
  922. text-align: left;
  923. }
  924. .job-description {
  925. color: rgba(120, 130, 138, 1);
  926. font-family: DM Sans;
  927. font-size: 16rpx;
  928. font-weight: 400;
  929. line-height: 24rpx;
  930. letter-spacing: 0%;
  931. text-align: left;
  932. }
  933. .skill-tags {
  934. display: flex;
  935. flex-wrap: wrap;
  936. gap: 8rpx;
  937. margin-top: 12rpx;
  938. .tag {
  939. background: rgba(153, 153, 153, 0.1);
  940. border-radius: 12rpx;
  941. padding: 6rpx;
  942. color: rgba(102, 102, 102, 1);
  943. font-family: DM Sans;
  944. font-size: 16rpx;
  945. font-weight: 400;
  946. letter-spacing: 0%;
  947. text-align: left;
  948. }
  949. }
  950. }
  951. }
  952. }
  953. }
  954. // 教育经历部分样式
  955. .education-section {
  956. background: #fff;
  957. border-radius: 12px;
  958. padding: 30rpx;
  959. margin-bottom: 20rpx;
  960. box-sizing: border-box;
  961. border: 1px solid rgba(227, 231, 236, 1);
  962. .section-header {
  963. display: flex;
  964. align-items: center;
  965. justify-content: space-between;
  966. margin-bottom: 30rpx;
  967. .section-title {
  968. text {
  969. color: rgba(23, 23, 37, 1);
  970. font-family: Inter;
  971. font-size: 20px;
  972. font-weight: 600;
  973. line-height: 24px;
  974. }
  975. }
  976. }
  977. .education-list {
  978. .education-item {
  979. display: flex;
  980. padding: 24rpx 0;
  981. border-bottom: 1rpx solid #F0F0F0;
  982. &:last-child {
  983. border-bottom: none;
  984. }
  985. .school-logo {
  986. width: 90rpx;
  987. height: 90rpx;
  988. margin-right: 24rpx;
  989. flex-shrink: 0;
  990. border-radius: 8px;
  991. background: rgba(246, 246, 246, 1);
  992. display: flex;
  993. flex-direction: column;
  994. align-items: center;
  995. justify-content: center;
  996. .logo-img {
  997. width: 54rpx;
  998. height: 50rpx;
  999. border-radius: 8rpx;
  1000. }
  1001. }
  1002. .education-content {
  1003. flex: 1;
  1004. .school-name {
  1005. color: rgba(23, 23, 37, 1);
  1006. font-family: DM Sans;
  1007. font-size: 18px;
  1008. font-weight: 400;
  1009. line-height: 22px;
  1010. letter-spacing: 0%;
  1011. text-align: left;
  1012. }
  1013. .degree-info {
  1014. color: rgba(120, 130, 138, 1);
  1015. font-family: DM Sans;
  1016. font-size: 20rpx;
  1017. font-weight: 500;
  1018. line-height: 24px;
  1019. letter-spacing: 0%;
  1020. text-align: left;
  1021. padding: 12rpx 0;
  1022. }
  1023. .education-description {
  1024. color: rgba(120, 130, 138, 1);
  1025. font-family: DM Sans;
  1026. font-size: 20rpx;
  1027. font-weight: 400;
  1028. line-height: 16px;
  1029. letter-spacing: 0%;
  1030. text-align: left;
  1031. }
  1032. }
  1033. }
  1034. }
  1035. }
  1036. // 技能部分样式
  1037. .skills-section {
  1038. background: #fff;
  1039. border-radius: 12px;
  1040. padding: 30rpx;
  1041. margin-bottom: 20rpx;
  1042. box-sizing: border-box;
  1043. border: 1px solid rgba(227, 231, 236, 1);
  1044. .section-header {
  1045. display: flex;
  1046. align-items: center;
  1047. justify-content: space-between;
  1048. margin-bottom: 30rpx;
  1049. .section-title {
  1050. text {
  1051. color: rgba(23, 23, 37, 1);
  1052. font-family: Inter;
  1053. font-size: 20px;
  1054. font-weight: 600;
  1055. line-height: 24px;
  1056. }
  1057. }
  1058. }
  1059. .skills-grid {
  1060. display: flex;
  1061. flex-wrap: wrap;
  1062. gap: 16rpx;
  1063. .skill-tag {
  1064. padding: 32rpx;
  1065. border: 1px solid rgba(236, 241, 246, 1);
  1066. border-radius: 64rpx;
  1067. color: rgba(23, 23, 37, 1);
  1068. font-family: DM Sans;
  1069. font-size: 14px;
  1070. font-weight: 400;
  1071. line-height: 20px;
  1072. letter-spacing: 0.5%;
  1073. text-align: right;
  1074. }
  1075. }
  1076. }
  1077. }
  1078. </style>