From 821a950df21901c9af550fd50f9e433fc67956e2 Mon Sep 17 00:00:00 2001 From: xuxin <15279969124@163.com> Date: Wed, 1 Apr 2026 11:41:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99=E5=92=8C?= =?UTF-8?q?=E5=B2=97=E4=BD=8D=E5=88=97=E8=A1=A8=E8=81=94=E8=B0=83=EF=BC=8C?= =?UTF-8?q?=E7=AE=80=E5=8E=86=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .kiro/steering/project-guidelines.md | 25 + components.d.ts | 3 + index.html | 4 +- src/api/auth.ts | 9 + src/api/jobs.ts | 177 ++- src/assets/styles/auto.scss | 7 + src/assets/styles/components/ai-chat.scss | 10 +- .../styles/components/industry-selector.scss | 28 +- .../components/job-category-selector.scss | 43 +- .../styles/components/job-goal-dialog.scss | 10 +- .../styles/components/job-page-header.scss | 10 +- .../components/job-resume-custom-dialog.scss | 1110 ++++++++++++++ .../components/job-resume-template.scss | 149 ++ .../components/profile-page-content.scss | 25 + .../styles/components/region-selector.scss | 2 +- .../styles/components/settings-dialog.scss | 21 + src/assets/styles/index.scss | 2 + src/assets/styles/pages/home.scss | 1347 ++++++++++++++++- src/assets/styles/pages/job-detail.scss | 26 +- src/assets/styles/pages/jobs.scss | 101 +- src/assets/styles/variables.scss | 12 +- src/components/JobDislikeDialog.vue | 49 +- src/components/JobGoalDialog.vue | 273 ++-- src/components/JobPageHeader.vue | 31 +- src/components/JobResumeCustomDialog.vue | 602 ++++++++ src/components/JobResumeTemplate.vue | 238 +++ src/components/ProfileEditDrawer.vue | 22 + src/components/ProfilePageContent.vue | 22 + src/components/SettingsDialog.vue | 83 +- src/components/SideNav.vue | 39 +- src/components/tools/IndustrySelector.vue | 144 +- src/components/tools/JobCategorySelector.vue | 203 ++- src/components/tools/RegionSelector.vue | 52 +- src/router/index.ts | 30 +- src/stores/index.ts | 89 +- src/utils/industry.ts | 20 + src/utils/jobCategory.ts | 25 + src/utils/request.ts | 4 + src/views/Home.vue | 433 +++++- src/views/JobDetail.vue | 477 +++--- src/views/Jobs.vue | 697 +++++++-- src/views/Profile.vue | 29 + 42 files changed, 5935 insertions(+), 748 deletions(-) create mode 100644 .kiro/steering/project-guidelines.md create mode 100644 src/assets/styles/components/job-resume-custom-dialog.scss create mode 100644 src/assets/styles/components/job-resume-template.scss create mode 100644 src/components/JobResumeCustomDialog.vue create mode 100644 src/components/JobResumeTemplate.vue create mode 100644 src/utils/industry.ts create mode 100644 src/utils/jobCategory.ts diff --git a/.kiro/steering/project-guidelines.md b/.kiro/steering/project-guidelines.md new file mode 100644 index 0000000..5dd226e --- /dev/null +++ b/.kiro/steering/project-guidelines.md @@ -0,0 +1,25 @@ +--- +inclusion: always +--- + +# 项目开发规范与注意事项 + + + + +## 技术栈 + +- Vue 3 + TypeScript + Vite +- 状态管理:Pinia +- 样式:SCSS + +## 编码规范 + +- 颜色用尽量用variables.scss里的统一颜色变量,特别是背景,按钮,文字的颜色 +- 除了Home.vue首页外,其他页面我上传了截图要写页面或组件的,需要参考图片里文字和布局结构,在保证美观前提上自由发挥 +- 全局用1rem=100px的格式并注意对某些特殊元素组件的line-height行高影响,纵布局如非必要不用flex-direction: column布局 +- 如果是建一个组件,这个组件看我说是用在views里哪个页面的,比如用在Profile.vue里的组件,组件名字最前面要加Profile,而且整个组件的命名不能过度简化,要容易看懂组件的用途;如果检测到某种名字开头的组件数量比如Profile开头的超过15个,就在components里新建个类似profile这样的页面名字的文件夹,把这类命名的组件都移到文件夹里并查找更新组件所有被引用地方的文件地址 + +## 注意事项 + +- 页面结构和ts的常量变量和方法都要加中文注释 diff --git a/components.d.ts b/components.d.ts index 869cfac..e233fe8 100644 --- a/components.d.ts +++ b/components.d.ts @@ -22,6 +22,7 @@ declare module 'vue' { ElRadio: typeof import('element-plus/es')['ElRadio'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] HelloWorld: typeof import('./src/components/HelloWorld.vue')['default'] IndustrySelector: typeof import('./src/components/tools/IndustrySelector.vue')['default'] JobCategorySelector: typeof import('./src/components/tools/JobCategorySelector.vue')['default'] @@ -29,6 +30,8 @@ declare module 'vue' { JobFeedbackDialog: typeof import('./src/components/JobFeedbackDialog.vue')['default'] JobGoalDialog: typeof import('./src/components/JobGoalDialog.vue')['default'] JobPageHeader: typeof import('./src/components/JobPageHeader.vue')['default'] + JobResumeCustomDialog: typeof import('./src/components/JobResumeCustomDialog.vue')['default'] + JobResumeTemplate: typeof import('./src/components/JobResumeTemplate.vue')['default'] LoginDialog: typeof import('./src/components/LoginDialog.vue')['default'] MemberDialog: typeof import('./src/components/MemberDialog.vue')['default'] ProfileEditDrawer: typeof import('./src/components/ProfileEditDrawer.vue')['default'] diff --git a/index.html b/index.html index 954406e..1d491e5 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,9 @@ - jobassistantweb + Offer派 - 大学生AI求职平台 | 智能岗位匹配·一键自动网申·AI简历优化 + +
diff --git a/src/api/auth.ts b/src/api/auth.ts index 0891ab3..dee6ecc 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -40,6 +40,15 @@ export function smsLogin(mobileNumber: string, code: string, inviteCode?: string }) } +/** + * 检查登录状态 + * GET /public/checkLogin + * 有 Cookie 且认证通过返回 data: true,否则返回 data: false + */ +export function checkLogin() { + return request.get>('/public/checkLogin') +} + /** * 退出登录 * POST /public/logout diff --git a/src/api/jobs.ts b/src/api/jobs.ts index 3a7361f..74d7f76 100644 --- a/src/api/jobs.ts +++ b/src/api/jobs.ts @@ -6,7 +6,7 @@ import type { ApiResult } from '@/api/auth' /** 匹配度详情 */ export interface MatchDetail { /** 行业匹配分 */ - industryScore: number + educationScore: number /** 技能匹配分 */ skillScore: number /** 经验匹配分 */ @@ -79,6 +79,38 @@ export interface JobListParams { jobIds?: number[] /** 岗位状态过滤(0=有效 1=已下架 2=已过期,可多选,null或空=查所有) */ statusFilter?: number[] + /** 搜索关键词 */ + keyword?: string +} + +// ==================== 求职意向 ==================== + +/** 求职意向出参/入参 */ +export interface JobIntention { + /** 期望岗位分类 ID 列表 */ + categoryIds?: number[] + /** 期望地区编码列表 */ + regionCodes?: string[] + /** 期望行业 ID 列表 */ + industryIds?: number[] + /** 就业类型:0=全职,1=实习 */ + employmentType?: number +} + +/** + * 查询求职意向 + * GET /job-intention + */ +export function fetchJobIntention() { + return request.get>('/job-intention') +} + +/** + * 保存求职意向 + * POST /job-intention + */ +export function saveJobIntention(data: JobIntention) { + return request.post>('/job-intention', data) } // ==================== 接口方法 ==================== @@ -96,12 +128,128 @@ export function fetchJobList(params: JobListParams = {}) { }) } +// ==================== 收藏列表 ==================== + +/** 收藏列表请求参数 */ +export interface FavoriteListParams { + /** 当前页码,从1开始,默认1 */ + pageNum?: number + /** 每页条数,默认10 */ + pageSize?: number + /** 是否只查询有效收藏(true=只查有效岗位,false=只查失效岗位,null=查所有) */ + valid?: boolean | null +} + +/** + * 获取收藏列表 + * POST /job/favorite/list + */ +export function fetchFavoriteList(params: FavoriteListParams = {}) { + return request.post>('/job/favorite/list', { + pageNum: params.pageNum ?? 1, + pageSize: params.pageSize ?? 10, + ...params, + }) +} + +/** + * 收藏/取消收藏岗位 + * POST /job/favorite?jobId=xxx + * @param jobId 岗位 ID + */ +export function toggleJobFavorite(jobId: string) { + return request.post>('/job/favorite', null, { + params: { jobId }, + }) +} + +/** + * 取消收藏岗位 + * DELETE /job/favorite?jobId=xxx + * @param jobId 岗位 ID + */ +export function removeJobFavorite(jobId: string) { + return request.delete>('/job/favorite', { + params: { jobId }, + }) +} + +// ==================== 收藏统计 ==================== + +/** 收藏统计结果 */ +export interface FavoriteCountData { + /** 收藏总数 */ + totalCount: number + /** 有效收藏数(岗位status=0) */ + validCount: number + /** 失效收藏数(岗位status!=0或已删除) */ + invalidCount: number +} + +/** + * 获取收藏统计 + * GET /job/favorite/count + */ +export function fetchFavoriteCount() { + return request.get>('/job/favorite/count') +} + +// ==================== 投递列表 ==================== + +/** 投递列表请求参数 */ +export interface ApplyListParams { + /** 当前页码,从1开始,默认1 */ + pageNum?: number + /** 每页条数,默认10 */ + pageSize?: number + /** 投递状态筛选(0=已投递 1=面试中 2=有Offer 3=未通过 4=已结束) */ + status?: number | null +} + +/** + * 获取投递列表 + * POST /job/apply/list + */ +export function fetchApplyList(params: ApplyListParams = {}) { + return request.post>('/job/apply/list', { + pageNum: params.pageNum ?? 1, + pageSize: params.pageSize ?? 10, + ...(params.status !== null && params.status !== undefined ? { status: params.status } : {}), + }) +} + +// ==================== 投递统计 ==================== + +/** 投递统计结果 */ +export interface ApplyCountData { + /** 投递总数 */ + totalCount: number + /** 已投递数(status=0) */ + appliedCount: number + /** 面试中数(status=1) */ + interviewingCount: number + /** 有Offer数(status=2) */ + offerCount: number + /** 未通过数(status=3) */ + rejectedCount: number + /** 已结束数(status=4) */ + closedCount: number +} + +/** + * 获取投递统计 + * GET /job/apply/count + */ +export function fetchApplyCount() { + return request.get>('/job/apply/count') +} + // ==================== 岗位详情 ==================== /** 匹配度详情(岗位详情用) */ export interface JobMatchScoreDto { /** 行业得分(0-100) */ - industryScore: number + educationScore: number /** 技能得分(0-100) */ skillScore: number /** 经验得分(0-100) */ @@ -180,6 +328,31 @@ export interface JobDetailData { isFavorite: boolean } +/** + * 从推荐列表中移除岗位 + * TODO: 接口待后端提供,当前仅做前端列表移除 + * POST /job/remove?jobId=xxx + * @param jobId 岗位 ID + */ +export function removeJobFromList(jobId: string) { + // TODO: 接口待对接,暂时返回模拟成功结果 + return Promise.resolve({ code: '0', msg: '', data: null, timestamp: '', uuid: '' } as ApiResult) + // 对接时替换为: + // return request.post>('/job/remove', null, { params: { jobId } }) +} + +/** + * 不感兴趣 + * POST /job/dislike?jobId=xxx + * @param jobId 岗位 ID + * @param reason 不感兴趣原因 0-5 + */ +export function dislikeJob(jobId: string, reason: number) { + return request.post>('/job/dislike', { reason }, { + params: { jobId }, + }) +} + /** * 获取岗位详情 * GET /job/detail?jobId=xxx diff --git a/src/assets/styles/auto.scss b/src/assets/styles/auto.scss index e1fef53..fad89a6 100644 --- a/src/assets/styles/auto.scss +++ b/src/assets/styles/auto.scss @@ -1,3 +1,4 @@ +@use './variables' as *; html{ font-size: 100px; } @@ -602,6 +603,12 @@ body:not(#_) { .bgccc{ background: #ccc; } +.bg-main{ + background: $bg-main; +} +.bg-white{ + background: $bg-white; +} /*文字超出隐藏*/ .text-over-h{ diff --git a/src/assets/styles/components/ai-chat.scss b/src/assets/styles/components/ai-chat.scss index eeba75c..ee7a77b 100644 --- a/src/assets/styles/components/ai-chat.scss +++ b/src/assets/styles/components/ai-chat.scss @@ -1,5 +1,8 @@ +// 颜色变量已移至全局 variables.scss +@use '../variables' as *; + .ai-chat { - width: 3.6rem; + width: 4.0rem; height: 100vh; background: #f3f4f6; display: flex; @@ -14,7 +17,7 @@ display: flex; align-items: center; justify-content: space-between; - background: linear-gradient(135deg, #4FC2C9 0%, #42A8B3 100%); + background: linear-gradient(90deg, #94EF9E , #53D9C8 ); color: #fff; padding: 0.1rem 0.16rem; font-size: 0.13rem; @@ -120,6 +123,7 @@ flex-direction: column; gap: 0.08rem; margin-top: 0.12rem; + padding-right: 0.5rem; } &__quick-item { @@ -127,7 +131,7 @@ border: 1px solid #e5e7eb; border-radius: 0.08rem; padding: 0.1rem 0.14rem; - color: #6b7280; + color: $text-middle; font-size: 0.12rem; cursor: pointer; transition: background 0.2s; diff --git a/src/assets/styles/components/industry-selector.scss b/src/assets/styles/components/industry-selector.scss index 6eab23e..bb25e49 100644 --- a/src/assets/styles/components/industry-selector.scss +++ b/src/assets/styles/components/industry-selector.scss @@ -7,7 +7,7 @@ .industry-selector { position: relative; - display: inline-block; + //display: inline-block; // ==================== 触发按钮 ==================== &__trigger { @@ -38,7 +38,7 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - max-width: 1.6rem; + max-width: 1.2rem; } // 下拉箭头图标 @@ -66,6 +66,11 @@ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); z-index: 100; padding: 0.1rem; + + // 只显示一栏时缩窄面板 + &--one-col { + width: 2.4rem; + } } // ==================== 选中区(已选标签) ==================== @@ -191,6 +196,15 @@ } // ==================== 分栏联动选择区 ==================== + + // 双击提示文字 + &__hint { + font-size: 0.11rem; + color: $text-light; + margin-bottom: 0.06rem; + line-height: 1; + } + &__columns { display: flex; border: 1px solid $border-color; @@ -204,12 +218,13 @@ overflow-y: auto; height: 100%; - // 左栏:一级行业列表 + // 左栏:一级行业列表(禁止双击选中文字) &--left { width: 1.2rem; flex-shrink: 0; border-right: 1px solid $border-color; background: $bg-main; + user-select: none; } // 右栏:二级行业列表 @@ -217,6 +232,13 @@ flex: 1; background: $bg-white; } + + // 单栏模式:左栏占满 + &--full { + flex: 1; + width: auto; + border-right: none; + } } // 栏内每一行 diff --git a/src/assets/styles/components/job-category-selector.scss b/src/assets/styles/components/job-category-selector.scss index d7cd2bf..3b453ce 100644 --- a/src/assets/styles/components/job-category-selector.scss +++ b/src/assets/styles/components/job-category-selector.scss @@ -8,7 +8,7 @@ .job-category-selector { position: relative; - display: inline-block; + //display: inline-block; // ==================== 触发按钮 ==================== &__trigger { @@ -39,7 +39,7 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - max-width: 1.6rem; + max-width: 1.2rem; } // 下拉箭头图标 @@ -67,6 +67,16 @@ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1); z-index: 100; padding: 0.1rem; + + // 只显示一栏时缩窄面板 + &--one-col { + width: 2.4rem; + } + + // 只显示两栏时缩窄面板 + &--two-col { + width: 3.6rem; + } } // ==================== 选中区(已选标签) ==================== @@ -192,6 +202,15 @@ } // ==================== 三栏联动选择区 ==================== + + // 双击提示文字 + &__hint { + font-size: 0.11rem; + color: $text-light; + margin-bottom: 0.06rem; + line-height: 1; + } + &__columns { display: flex; border: 1px solid $border-color; @@ -205,20 +224,29 @@ overflow-y: auto; height: 100%; - // 左栏:一级分类 + // 左栏:一级分类(禁止双击选中文字) &--left { width: 1.2rem; flex-shrink: 0; border-right: 1px solid $border-color; background: $bg-main; + user-select: none; } - // 中栏:二级分类 + // 中栏:二级分类(禁止双击选中文字) &--mid { width: 1.4rem; flex-shrink: 0; border-right: 1px solid $border-color; background: $bg-white; + user-select: none; + } + + // 中栏作为末级栏时展开 + &--mid-end { + flex: 1; + width: auto; + border-right: none; } // 右栏:三级分类(末级可选中) @@ -226,6 +254,13 @@ flex: 1; background: $bg-white; } + + // 单栏模式:左栏占满 + &--full { + flex: 1; + width: auto; + border-right: none; + } } // 栏内每一行 diff --git a/src/assets/styles/components/job-goal-dialog.scss b/src/assets/styles/components/job-goal-dialog.scss index 15ca4d5..1350d46 100644 --- a/src/assets/styles/components/job-goal-dialog.scss +++ b/src/assets/styles/components/job-goal-dialog.scss @@ -113,8 +113,8 @@ } &--active { - background: $text-light; - border-color: $text-light; + background: $btn-dark; + border-color: $btn-dark; color: $bg-white; font-weight: 500; } @@ -127,9 +127,9 @@ } &__save-btn { - width: 60%; + width: 100%; padding: 0.12rem 0; - background: $btn-dark; + background: $accent; color: $bg-white; border: none; border-radius: 0.24rem; @@ -139,7 +139,7 @@ transition: background 0.2s; &:hover { - background: $btn-dark-hover; + background: $accent-hover; } } } diff --git a/src/assets/styles/components/job-page-header.scss b/src/assets/styles/components/job-page-header.scss index 8046678..bbfe2f1 100644 --- a/src/assets/styles/components/job-page-header.scss +++ b/src/assets/styles/components/job-page-header.scss @@ -31,17 +31,19 @@ } &__goal-btn { - font-size: 0.18rem; + font-size: 0.12rem; font-weight: 700; color: $text-dark; - background: none; - border: none; + background: $bg-main; + border-radius: 0.2rem; + border: 0.01rem solid $border-color; cursor: pointer; padding: 0.04rem 0.16rem; white-space: nowrap; transition: color 0.2s; margin-left: auto; + &:hover { color: $accent-hover; } @@ -51,7 +53,7 @@ font-size: 0.13rem; color: $text-light; cursor: pointer; - padding: 0.06rem 0.22rem; + padding: 0.06rem 0.16rem; border-radius: 0.18rem; transition: all 0.25s ease; user-select: none; diff --git a/src/assets/styles/components/job-resume-custom-dialog.scss b/src/assets/styles/components/job-resume-custom-dialog.scss new file mode 100644 index 0000000..e8b287d --- /dev/null +++ b/src/assets/styles/components/job-resume-custom-dialog.scss @@ -0,0 +1,1110 @@ +@use '../variables' as *; + +// ==================== 岗位专属简历定制弹窗 ==================== +.job-resume-custom-dialog { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + + // 遮罩层 + &__overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: $overlay-bg; + } + + // 弹窗面板 + &__panel { + position: relative; + background: $bg-white; + border-radius: 0.16rem; + width: 5.6rem; + max-height: 80vh; + overflow-y: auto; + padding: 0.36rem 0.4rem; + box-sizing: border-box; + } + + // 标题栏 + &__header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.28rem; + } + + &__title { + font-size: 0.22rem; + font-weight: 700; + color: $text-dark; + margin: 0; + line-height: 1.2; + } + + &__close-btn { + width: 0.3rem; + height: 0.3rem; + border: none; + background: none; + color: $text-dark; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: background 0.2s; + flex-shrink: 0; + + &:hover { + background: $bg-main; + } + } + + &__close-icon { + width: 0.16rem; + height: 0.16rem; + } + + // 匹配度提示条 + &__tip-bar { + background: $bg-main; + border-radius: 0.08rem; + padding: 0.14rem 0.2rem; + font-size: 0.13rem; + color: $text-middle; + text-align: center; + margin-bottom: 0.3rem; + line-height: 1.4; + } + + // 岗位信息卡片 + &__job-card { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 0.3rem; + padding: 0 0.04rem; + } + + &__job-left { + display: flex; + align-items: center; + gap: 0.14rem; + } + + &__company-icon { + width: 0.44rem; + height: 0.44rem; + border-radius: 0.1rem; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid $border-color; + flex-shrink: 0; + } + + &__company-logo-img { + width: 100%; + height: 100%; + border-radius: 0.1rem; + object-fit: cover; + } + + &__company-svg { + width: 0.24rem; + height: 0.24rem; + color: $text-light; + } + + &__job-info { + display: flex; + flex-direction: column; + gap: 0.04rem; + } + + &__job-title { + font-size: 0.16rem; + font-weight: 600; + color: $text-dark; + line-height: 1.2; + } + + &__job-sub { + font-size: 0.12rem; + color: $text-light; + line-height: 1.2; + } + + // 匹配度分数 + &__match-area { + display: flex; + flex-direction: column; + align-items: center; + flex-shrink: 0; + } + + &__match-ring { + position: relative; + width: 0.56rem; + height: 0.56rem; + display: flex; + align-items: center; + justify-content: center; + } + + &__ring-svg { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + &__match-score { + font-size: 0.18rem; + font-weight: 700; + color: $text-dark; + position: relative; + z-index: 1; + } + + &__match-label { + font-size: 0.1rem; + color: $text-middle; + margin-top: 0.04rem; + background: $bg-main; + border-radius: 0.04rem; + padding: 0.02rem 0.08rem; + } + + // 缺少技能区域 + &__skills-section { + margin-bottom: 0.36rem; + padding: 0 0.04rem; + } + + &__skills-title { + font-size: 0.15rem; + font-weight: 600; + color: $text-dark; + margin: 0 0 0.14rem 0; + line-height: 1.2; + } + + &__skills-list { + display: flex; + flex-wrap: wrap; + gap: 0.1rem; + } + + &__skill-tag { + font-size: 0.13rem; + color: $text-dark; + background: $bg-main; + border: 1px solid $border-color; + border-radius: 0.06rem; + padding: 0.07rem 0.18rem; + line-height: 1.2; + } + + // 底部按钮区域 + &__footer { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.14rem; + } + + &__primary-btn { + width: 100%; + height: 0.48rem; + background: $btn-dark; + color: $bg-white; + border: none; + border-radius: 0.24rem; + font-size: 0.15rem; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: $btn-dark-hover; + } + } + + &__skip-link { + font-size: 0.13rem; + color: $text-middle; + cursor: pointer; + text-decoration: underline; + transition: color 0.2s; + + &:hover { + color: $text-dark; + } + } + + // 占位内容(步骤3-4待开发) + &__placeholder { + font-size: 0.14rem; + color: $text-light; + text-align: center; + padding: 0.6rem 0; + } + + // 标题栏占位(步骤2+用于左右对称布局) + &__header-placeholder { + width: 0.3rem; + flex-shrink: 0; + } + + // ==================== 步骤指示器 ==================== + &__steps { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + margin-bottom: 0.32rem; + } + + &__step { + display: flex; + align-items: center; + gap: 0.08rem; + font-size: 0.13rem; + color: $text-light; + } + + &__step--active { + color: $text-dark; + font-weight: 600; + } + + &__step-num { + width: 0.22rem; + height: 0.22rem; + border-radius: 50%; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.11rem; + font-weight: 600; + line-height: 1; + } + + &__step--active &__step-num { + background: $text-dark; + color: $bg-white; + } + + // ==================== 差距分析头部 ==================== + &__gap-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 0.28rem; + } + + &__gap-left { + flex: 1; + min-width: 0; + } + + &__gap-title { + font-size: 0.2rem; + font-weight: 700; + color: $text-dark; + margin: 0 0 0.1rem 0; + line-height: 1.3; + } + + &__gap-warn { + display: flex; + align-items: flex-start; + gap: 0.06rem; + font-size: 0.12rem; + color: $text-middle; + line-height: 1.5; + } + + &__warn-icon { + width: 0.14rem; + height: 0.14rem; + flex-shrink: 0; + margin-top: 0.02rem; + color: $text-middle; + } + + &__gap-score-area { + display: flex; + flex-direction: column; + align-items: center; + flex-shrink: 0; + margin-left: 0.2rem; + } + + // ==================== 对比卡片表格 ==================== + &__gap-table { + margin-bottom: 0.36rem; + display: flex; + flex-direction: column; + gap: 0.06rem; + } + + &__gap-row { + display: flex; + gap: 0.06rem; + } + + &__gap-cell { + flex: 1; + padding: 0.18rem 0.16rem; + font-size: 0.13rem; + color: $text-dark; + background: $bg-main; + border-radius: 0.08rem; + display: flex; + align-items: center; + min-height: 0.6rem; + } + + &__gap-cell--label { + flex: 0 0 1.2rem; + font-weight: 600; + justify-content: flex-start; + } + + &__gap-cell-title { + font-size: 0.18rem; + font-weight: 700; + } + + // 关键词列横跨两列 + &__gap-cell--keywords { + flex: 2.06; + } + + // 概览行岗位信息 + &__gap-job-info { + display: flex; + align-items: center; + gap: 0.12rem; + } + + &__gap-company-icon { + width: 0.36rem; + height: 0.36rem; + border-radius: 0.06rem; + background: $bg-white; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + } + + &__gap-company-logo { + width: 100%; + height: 100%; + border-radius: 0.06rem; + object-fit: cover; + } + + &__gap-company-svg { + width: 0.2rem; + height: 0.2rem; + color: $text-dark; + } + + &__gap-job-text { + display: flex; + flex-direction: column; + gap: 0.04rem; + } + + &__gap-job-title { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + line-height: 1.2; + } + + &__gap-job-sub { + font-size: 0.11rem; + color: $text-light; + line-height: 1.2; + } + + // 岗位名称/简历目标值 + &__gap-value { + font-size: 0.14rem; + font-weight: 500; + color: $text-dark; + } + + // ==================== 简历选择器 ==================== + &__resume-selector { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + position: relative; + } + + &__resume-info { + display: flex; + align-items: center; + gap: 0.1rem; + } + + &__resume-file-icon { + width: 0.2rem; + height: 0.2rem; + color: $text-dark; + flex-shrink: 0; + } + + &__resume-text { + display: flex; + flex-direction: column; + gap: 0.02rem; + } + + &__resume-label { + font-size: 0.1rem; + color: $text-light; + line-height: 1.2; + } + + &__resume-name { + font-size: 0.12rem; + color: $text-dark; + font-weight: 500; + line-height: 1.2; + } + + &__resume-select-btn { + display: flex; + align-items: center; + gap: 0.04rem; + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.14rem; + padding: 0.05rem 0.12rem; + font-size: 0.11rem; + color: $text-dark; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; + + &:hover { + border-color: $accent; + color: $accent; + } + } + + &__dropdown-arrow { + width: 0.1rem; + height: 0.1rem; + } + + &__resume-dropdown { + position: absolute; + top: 100%; + right: 0; + margin-top: 0.04rem; + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.08rem; + box-shadow: 0 0.04rem 0.12rem rgba(0, 0, 0, 0.1); + z-index: 10; + min-width: 1.6rem; + overflow: hidden; + } + + &__resume-option { + padding: 0.1rem 0.14rem; + font-size: 0.12rem; + color: $text-dark; + cursor: pointer; + transition: background 0.15s; + + &:hover { + background: $bg-main; + } + } + + &__resume-option--active { + color: $accent; + font-weight: 500; + background: $theme-color; + } + + // ==================== 岗位关键词标签 ==================== + &__gap-keywords { + display: flex; + flex-wrap: wrap; + gap: 0.08rem; + } + + &__gap-kw-tag { + font-size: 0.12rem; + background: $text-middle; + color: $bg-white; + border-radius: 0.04rem; + padding: 0.04rem 0.12rem; + line-height: 1.2; + } + + // ==================== 步骤三:定制简历 ==================== + + // 定制简历左右两栏布局 + &__custom { + display: flex; + gap: 0.16rem; + height: 100%; + } + + // 左右面板 + &__custom-panel { + flex: 1; + background: $bg-main; + border-radius: 0.12rem; + padding: 0.28rem 0.24rem; + overflow: hidden; + } + + // 面板标题 + &__custom-panel-title { + font-size: 0.17rem; + font-weight: 700; + color: $text-dark; + margin: 0 0 0.24rem 0; + line-height: 1.2; + } + + // 选项列表 + &__custom-options { + display: flex; + flex-direction: column; + gap: 0.2rem; + } + + // 单个复选框行 + &__custom-checkbox { + display: flex; + align-items: center; + gap: 0.1rem; + cursor: pointer; + position: relative; + } + + // 隐藏原生 checkbox + &__custom-input { + position: absolute; + opacity: 0; + width: 0; + height: 0; + pointer-events: none; + } + + // 自定义复选框样式 + &__custom-checkmark { + width: 0.18rem; + height: 0.18rem; + border: 1.5px solid $border-color; + border-radius: 0.04rem; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s; + background: $bg-white; + } + + // 选中态 + &__custom-input:checked + &__custom-checkmark { + background: $accent; + border-color: $accent; + + &::after { + content: ''; + display: block; + width: 0.05rem; + height: 0.09rem; + border: solid $bg-white; + border-width: 0 2px 2px 0; + transform: rotate(45deg); + margin-top: -0.04rem; + } + } + + // 选项文字 + &__custom-label { + font-size: 0.14rem; + color: $text-dark; + line-height: 1.2; + user-select: none; + } + + // 问号提示触发器 + &__custom-tooltip-trigger { + display: flex; + align-items: center; + margin-left: 0.04rem; + //cursor: help; + cursor: pointer; + } + + // 问号图标 + &__custom-tooltip-icon { + width: 0.15rem; + height: 0.15rem; + color: $text-light; + transition: color 0.2s; + + &:hover { + color: $text-middle; + } + } + + // ==================== 抽屉模式(步骤2+) ==================== + + // 抽屉模式下,遮罩和布局调整为右侧对齐 + &--drawer { + justify-content: flex-end; + } + + // 右侧抽屉面板 + &__drawer { + position: relative; + background: $bg-white; + width: 9.4rem; + height: 100vh; + box-sizing: border-box; + display: flex; + flex-direction: column; + animation: slideInRight 0.3s ease; + } + + // 抽屉头部 + &__drawer-header { + display: flex; + align-items: center; + gap: 0.12rem; + padding: 0.2rem 0.1rem; + border-bottom: 1px solid $border-color; + flex-shrink: 0; + } + + &__drawer-title { + font-size: 0.15rem; + font-weight: 600; + color: $text-dark; + margin: 0; + line-height: 1.2; + } + + // 抽屉内容区(可滚动) + &__drawer-body { + flex: 1; + overflow-y: auto; + padding: 0.28rem 0.2rem; + } + + // 抽屉底部按钮 + &__drawer-footer { + padding: 0.2rem 0.32rem; + border-top: 1px solid $border-color; + flex-shrink: 0; + } + + // ==================== 步骤四:返回按钮 ==================== + &__back-btn { + position: absolute; + top: 0.7rem; + left: 0.2rem; + z-index: 5; + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.2rem; + padding: 0.06rem 0.2rem; + font-size: 0.13rem; + color: $text-dark; + cursor: pointer; + transition: all 0.2s; + + &:hover { + background: $bg-main; + } + } + + // ==================== 步骤四:预览布局 ==================== + &__preview { + display: flex; + gap: 0.2rem; + height: 100%; + min-height: 0; + } + + // 左侧简历预览区 + &__preview-left { + flex: 1; + overflow-y: auto; + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.08rem; + min-width: 0; + } + + // 右侧AI帮写/编辑区 + &__preview-right { + width: 3.6rem; + flex-shrink: 0; + display: flex; + flex-direction: column; + min-height: 0; + } + + // Tab 切换栏 + &__preview-tabs { + display: flex; + border-bottom: 1px solid $border-color; + flex-shrink: 0; + } + + &__preview-tab { + flex: 1; + padding: 0.12rem 0; + font-size: 0.14rem; + color: $text-middle; + background: none; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all 0.2s; + text-align: center; + + &--active { + color: $text-dark; + font-weight: 600; + border-bottom-color: $text-dark; + } + + &:hover { + color: $text-dark; + } + } + + // AI帮写内容区 + &__preview-ai { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; + } + + // AI优化结果卡片 + &__ai-result { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 0.2rem; + gap: 0.16rem; + flex-shrink: 0; + } + + &__ai-result-text { + flex: 1; + min-width: 0; + } + + &__ai-result-title { + font-size: 0.15rem; + font-weight: 700; + color: $text-dark; + margin: 0 0 0.12rem 0; + line-height: 1.5; + } + + &__ai-result-detail { + margin: 0; + } + + &__ai-result-subtitle { + font-size: 0.12rem; + font-weight: 600; + color: $text-dark; + margin: 0 0 0.06rem 0; + line-height: 1.4; + } + + &__ai-result-list { + list-style: none; + margin: 0; + padding: 0; + + li { + font-size: 0.12rem; + color: $text-dark; + line-height: 1.6; + } + } + + &__ai-result-score { + display: flex; + flex-direction: column; + align-items: center; + flex-shrink: 0; + } + + // 大号匹配度环 + &__match-ring--large { + width: 0.64rem; + height: 0.64rem; + } + + // 高匹配标签 + &__match-label--high { + background: $text-dark; + color: $bg-white; + font-weight: 600; + } + + // 快捷操作按钮区 + &__ai-quick-actions { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 0.08rem; + padding: 0 0.2rem 0.16rem; + flex-shrink: 0; + } + + &__ai-quick-btn { + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.16rem; + padding: 0.08rem 0.16rem; + font-size: 0.12rem; + color: $text-dark; + cursor: pointer; + transition: all 0.2s; + white-space: nowrap; + + &:hover { + background: $bg-main; + border-color: $accent; + } + } + + // AI聊天消息区 + &__ai-messages { + flex: 1; + overflow-y: auto; + padding: 0 0.2rem; + min-height: 0; + } + + &__ai-msg { + margin-bottom: 0.1rem; + display: flex; + + &--ai { + justify-content: flex-start; + } + + &--user { + justify-content: flex-end; + } + } + + &__ai-msg-bubble { + border-radius: 0.1rem; + padding: 0.1rem 0.14rem; + font-size: 0.12rem; + line-height: 1.6; + max-width: 85%; + } + + &__ai-msg--ai &__ai-msg-bubble { + background: $bg-main; + color: $text-dark; + } + + &__ai-msg--user &__ai-msg-bubble { + background: $text-dark; + color: $bg-white; + } + + // AI输入框区域 + &__ai-input-area { + display: flex; + align-items: center; + gap: 0.08rem; + padding: 0.12rem 0.2rem; + border-top: 1px solid $border-color; + flex-shrink: 0; + } + + &__ai-input { + flex: 1; + background: $bg-main; + border: 1px solid $border-color; + border-radius: 0.2rem; + padding: 0.1rem 0.14rem; + font-size: 0.12rem; + color: $text-dark; + outline: none; + + &::placeholder { + color: $text-light; + } + + &:focus { + border-color: $accent; + } + } + + &__ai-send-btn { + width: 0.34rem; + height: 0.34rem; + border-radius: 50%; + background: $text-dark; + border: none; + color: $bg-white; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.2s; + flex-shrink: 0; + + &:hover { + background: $btn-dark-hover; + } + } + + &__ai-send-icon { + width: 0.16rem; + height: 0.16rem; + } + + // 编辑tab占位 + &__preview-edit { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + } + + // ==================== 步骤四:底部按钮区 ==================== + &__preview-footer { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.2rem 0.32rem; + border-top: 1px solid $border-color; + flex-shrink: 0; + gap: 0.2rem; + } + + // 下载简历按钮容器 + &__download-wrap { + position: relative; + flex: 1; + } + + &__download-btn { + width: 100%; + height: 0.48rem; + background: $bg-white; + color: $text-dark; + border: 1px solid $border-color; + border-radius: 0.24rem; + font-size: 0.15rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + + &:hover { + background: $bg-main; + border-color: $text-middle; + } + } + + // 下载下拉菜单(向上弹出) + &__download-menu { + position: absolute; + bottom: 100%; + left: 0; + right: 0; + margin-bottom: 0.06rem; + background: $bg-white; + border: 1px solid $border-color; + border-radius: 0.08rem; + box-shadow: 0 -0.04rem 0.12rem rgba(0, 0, 0, 0.1); + overflow: hidden; + z-index: 10; + } + + &__download-option { + display: block; + width: 100%; + padding: 0.12rem 0; + font-size: 0.13rem; + color: $text-dark; + background: none; + border: none; + cursor: pointer; + text-align: center; + transition: background 0.15s; + + &:hover { + background: $bg-main; + } + + & + & { + border-top: 1px solid $border-color; + } + } + + // 立即去投递按钮 + &__submit-btn { + flex: 1; + height: 0.48rem; + background: $btn-dark; + color: $bg-white; + border: none; + border-radius: 0.24rem; + font-size: 0.15rem; + font-weight: 500; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: $btn-dark-hover; + } + } +} + +// 右侧滑入动画 +@keyframes slideInRight { + from { + transform: translateX(100%); + } + to { + transform: translateX(0); + } +} diff --git a/src/assets/styles/components/job-resume-template.scss b/src/assets/styles/components/job-resume-template.scss new file mode 100644 index 0000000..3cc8a68 --- /dev/null +++ b/src/assets/styles/components/job-resume-template.scss @@ -0,0 +1,149 @@ +@use '../variables' as *; + +// ==================== 简历HTML模板组件 ==================== +// 注意:此组件样式全部使用 px 单位,不用 rem +// 原因:后续需要提取简历 HTML 生成 PDF/Word,脱离页面环境后 +// rem 会按浏览器默认 16px 计算导致尺寸错乱,px 可保证一致性 + +.job-resume-template { + width: 100%; + max-width: 1668px; + background: $bg-white; + box-sizing: border-box; +} + +// 简历HTML内容区 +.resume-html { + padding: 50px 60px; + font-family: 'SimSun', 'Songti SC', serif; + color: $text-dark; + line-height: 1.6; + + // 姓名 + &__name { + font-size: 28px; + font-weight: 700; + margin: 0 0 6px 0; + line-height: 1.3; + } + + // 联系方式 + &__contact { + font-size: 12px; + color: $text-dark; + margin-bottom: 4px; + line-height: 1.5; + } + + &__contact-row { + display: flex; + align-items: center; + gap: 0; + } + + &__separator { + margin: 0 6px; + color: $text-middle; + } + + // 板块标题 + &__section-title { + font-size: 15px; + font-weight: 700; + color: $text-dark; + margin-top: 16px; + margin-bottom: 2px; + line-height: 1.3; + } + + // 分割线 + &__divider { + height: 1.5px; + background: $text-dark; + margin-bottom: 10px; + } + + // 个人概述 + &__summary { + font-size: 12px; + line-height: 1.7; + margin-bottom: 6px; + } + + // 经历条目 + &__item { + margin-bottom: 12px; + } + + &__item-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 4px; + } + + &__item-left { + display: flex; + flex-direction: column; + gap: 2px; + } + + &__item-main { + font-size: 13px; + font-weight: 600; + color: $text-dark; + line-height: 1.4; + } + + &__item-right { + display: flex; + align-items: center; + gap: 6px; + flex-shrink: 0; + text-align: right; + } + + &__item-location { + font-size: 12px; + color: $text-dark; + } + + &__item-date { + font-size: 12px; + color: $text-dark; + white-space: nowrap; + } + + &__item-desc { + font-size: 12px; + color: $text-dark; + line-height: 1.5; + } + + // 描述列表 + &__desc-list { + margin: 0; + padding-left: 16px; + list-style: disc; + + li { + font-size: 12px; + line-height: 1.7; + color: $text-dark; + } + } + + // 技能区域 + &__skills { + font-size: 12px; + line-height: 1.7; + } + + &__skill-row { + margin-bottom: 2px; + } + + &__skill-label { + font-weight: 600; + } +} diff --git a/src/assets/styles/components/profile-page-content.scss b/src/assets/styles/components/profile-page-content.scss index 4702637..b18513b 100644 --- a/src/assets/styles/components/profile-page-content.scss +++ b/src/assets/styles/components/profile-page-content.scss @@ -13,6 +13,8 @@ background: $bg-white; border-radius: 0.12rem; padding: 0.2rem 0.24rem; + font-size: 14px; + line-height: 1.5; } &__card-header { @@ -140,6 +142,29 @@ } } + // 作品集链接 + &__portfolio-link { + font-size: 0.13rem; + line-height: 1.6; + color: $accent; + word-break: break-all; + text-decoration: none; + transition: color 0.2s; + display: inline-block; + + &:hover { + color: $accent-hover; + text-decoration: underline; + } + } + + // 作品集空状态提示 + &__portfolio-empty { + font-size: 0.12rem; + line-height: 1.5; + color: $text-light; + } + // 标签(技能 / 证书) &__tags { display: flex; diff --git a/src/assets/styles/components/region-selector.scss b/src/assets/styles/components/region-selector.scss index 23205c1..79c569e 100644 --- a/src/assets/styles/components/region-selector.scss +++ b/src/assets/styles/components/region-selector.scss @@ -38,7 +38,7 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - max-width: 1.6rem; + max-width: 1.2rem; } &__arrow { diff --git a/src/assets/styles/components/settings-dialog.scss b/src/assets/styles/components/settings-dialog.scss index 6018828..39edfa5 100644 --- a/src/assets/styles/components/settings-dialog.scss +++ b/src/assets/styles/components/settings-dialog.scss @@ -331,9 +331,30 @@ } &__reminder-target { + display: flex; + flex-direction: column; + gap: 0.12rem; + } + + &__reminder-group { + display: flex; + align-items: flex-start; + gap: 0.1rem; + } + + &__reminder-group-label { + flex-shrink: 0; + font-size: 0.12rem; + color: $text-light; + line-height: 0.28rem; + min-width: 0.32rem; + } + + &__reminder-block-title-row { display: flex; align-items: center; justify-content: space-between; + margin-bottom: 0.14rem; } &__reminder-tags { diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 0e60222..6d4484a 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -22,6 +22,8 @@ @use './components/industry-selector.scss'; @use './components/job-category-selector.scss'; @use './components/region-selector.scss'; +@use './components/job-resume-custom-dialog.scss'; +@use './components/job-resume-template.scss'; // 全局样式(优先级最高) @use './auto.scss'; diff --git a/src/assets/styles/pages/home.scss b/src/assets/styles/pages/home.scss index 0e822c5..758ddd5 100644 --- a/src/assets/styles/pages/home.scss +++ b/src/assets/styles/pages/home.scss @@ -1,7 +1,1344 @@ -// Home 页面样式 +@use '../variables' as *; + +// ======================================== +// Home 首页样式 +// 注意:项目 html { font-size: 100px },即 1rem = 100px +// 所有文字元素必须显式设置 line-height,否则浏览器默认 normal(约 1.2em) +// 在 rem 体系下会导致行高异常 +// ======================================== .home-page { - // 在这里添加 Home 页面的样式 - h1{ - color: blue; + width: 100%; + overflow-x: hidden; + background: #fff; + color: #111; + font-family: system-ui, -apple-system, sans-serif; + // 全局基础行高重置,防止 1rem=100px 导致子元素继承异常行高 + line-height: 1.5; + + // ==================== 顶部导航栏 ==================== + .home-nav { + position: sticky; + top: 0; + z-index: 50; + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(100px); + border-bottom: 1px solid rgba(243, 244, 246, 0.5); + + // 导航内容容器 — 居中 12rem 宽 + &__inner { + width: 12rem; + margin: 0 auto; + height: 0.8rem; + display: flex; + align-items: center; + justify-content: space-between; + } + + // Logo 区域 + &__logo { + display: flex; + align-items: center; + } + + // Logo 文字 + &__logo-text { + font-size: 0.22rem; + font-weight: 700; + line-height: 0.34rem; + color: $accent; + letter-spacing: -0.01rem; + } + + // 导航右侧 CTA 按钮 + &__btn { + padding: 0.1rem 0.32rem; + border-radius: 9999px; + background: $accent; + color: #fff; + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 600; + border: none; + cursor: pointer; + transition: background 0.2s; + &:hover { background: $accent-hover; } + } } -} + + // ==================== Hero 主视觉区 ==================== + .home-hero { + background: #fff; + position: relative; + overflow: hidden; + + // Hero 内容容器 — 左右两栏布局 + &__inner { + width: 12rem; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: space-between; + padding: 1.5rem 0 1.2rem; + gap: 0.5rem; + } + + // 左侧文字区 + &__left { + flex-shrink: 0; + max-width: 5.5rem; + } + + // 主标题 + &__title { + font-size: 0.72rem; + font-weight: 600; + line-height: 0.9rem; + letter-spacing: -0.03rem; + color: #111; + margin: 0; + } + + // 副标题描述 + &__desc { + font-size: 0.2rem; + line-height: 0.325rem; + color: #9ca3af; + margin-top: 0.2rem; + max-width: 4.74rem; + } + + // 免费体验按钮 + &__cta { + margin-top: 0.4rem; + padding: 0.2rem 0.56rem; + border-radius: 9999px; + background: $accent; + color: #fff; + font-size: 0.18rem; + line-height: 0.28rem; + font-weight: 600; + border: none; + cursor: pointer; + box-shadow: 0 25px 50px -12px rgba(82, 202, 209, 0.2); + transition: background 0.2s; + &:hover { background: $accent-hover; } + } + + // 右侧卡片区 + &__right { + flex-shrink: 0; + } + + // 模拟匹配卡片容器 + &__card { + width: 6.5rem; + border-radius: 0.4rem; + background: #f8fffe; + box-shadow: 0 0 20px rgba(82, 202, 209, 0.1); + overflow: hidden; + } + + // 窗口装饰圆点 + &__card-dots { + display: flex; + gap: 0.08rem; + padding: 0.27rem 0.4rem; + .dot { + width: 0.1rem; + height: 0.1rem; + border-radius: 50%; + &--red { background: #f87171; } + &--yellow { background: #fbbf24; } + &--green { background: #34d399; } + } + } + + // 卡片内容区 + &__card-body { + padding: 0.3rem 0.4rem 0.4rem; + background: linear-gradient(135deg, rgba(82, 202, 209, 0.03), rgba(82, 202, 209, 0.08)); + } + + // 用户信息行 + &__card-user { + display: flex; + align-items: center; + gap: 0.16rem; + margin-bottom: 0.24rem; + } + + // 用户头像 + &__card-avatar { + width: 0.64rem; + height: 0.64rem; + border-radius: 50%; + background: linear-gradient(135deg, $accent, #a7f3d0); + } + + // 用户名称 + &__card-info { + h4 { + font-size: 0.2rem; + line-height: 0.28rem; + font-weight: 400; + margin: 0; + } + } + + // 技能标签 + &__card-tags { + display: flex; + gap: 0.08rem; + margin-top: 0.04rem; + .tag { + font-size: 0.1rem; + line-height: 0.15rem; + background: rgba(82, 202, 209, 0.15); + color: $accent; + padding: 0.02rem 0.08rem; + border-radius: 0.04rem; + } + } + + // 匹配度徽章 + &__card-match { + margin-left: auto; + background: $accent; + color: #fff; + padding: 0.12rem 0.16rem; + border-radius: 9999px; + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 600; + } + + // 骨架线条 — 纵向排列用 block 即可,无需 flex-direction: column + &__card-lines { + .line-full { + height: 0.08rem; + background: #e5e7eb; + border-radius: 9999px; + } + .line-3q { + height: 0.08rem; + width: 75%; + background: #e5e7eb; + border-radius: 9999px; + margin-top: 0.12rem; + } + } + + // 匹配结果提示条 + &__card-result { + margin-top: 0.32rem; + background: $accent; + color: #fff; + text-align: center; + padding: 0.16rem; + border-radius: 0.16rem; + font-size: 0.16rem; + line-height: 0.24rem; + font-weight: 600; + } + } + + // ==================== 数据统计区 ==================== + .home-stats { + padding: 1rem 0; + background: #fff; + + // 统计区内容容器 + &__inner { + width: 12rem; + margin: 0 auto; + } + + // 标题区 + &__header { + margin-bottom: 0.6rem; + h2 { + font-size: 0.48rem; + font-weight: 600; + letter-spacing: -0.015rem; + line-height: 0.7rem; + } + } + + // 标题下方装饰线 + &__divider { + width: 0.8rem; + height: 0.06rem; + border-radius: 9999px; + background: rgba(82, 202, 209, 0.3); + margin-top: 0.2rem; + } + + // 三个统计卡片横向排列 + &__cards { + display: flex; + gap: 0.24rem; + } + } + + // 单个统计卡片 + .stat-card { + flex: 1; + background: #fff; + border-radius: 0.48rem; + padding: 0.5rem; + text-align: center; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.04); + + // 大数字 + &__num { + font-size: 0.64rem; + font-weight: 900; + color: $accent; + line-height: 0.85rem; + } + + // 描述文字 + &__label { + font-size: 0.14rem; + line-height: 0.2rem; + color: #9ca3af; + margin-top: 0.12rem; + letter-spacing: 0.0035rem; + } + } + + // ==================== 岗位展示区 ==================== + .home-jobs-showcase { + padding: 1rem 0; + background: rgba(82, 202, 209, 0.05); + + // 内容容器 + &__inner { + width: 12rem; + margin: 0 auto; + text-align: center; + + h2 { + font-size: 0.48rem; + font-weight: 600; + line-height: 0.576rem; + } + } + + // 副标题 + &__sub { + font-size: 0.2rem; + line-height: 0.28rem; + color: #999; + margin-top: 0.2rem; + } + + // 玻璃态展示盒子 + &__box { + margin-top: 0.6rem; + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(255, 255, 255, 0.9); + box-shadow: 0 10px 40px rgba(82, 202, 209, 0.12); + backdrop-filter: blur(100px); + border-radius: 0.4rem; + padding: 0.64rem; + } + + // 岗位数量统计 — 横向排列 + &__stats { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 0.6rem; + } + + // 岗位滚动卡片容器 + &__scroll { + display: flex; + gap: 0.16rem; + overflow-x: auto; + padding-bottom: 0.1rem; + &::-webkit-scrollbar { display: none; } + } + } + + // 岗位数量统计项 + .showcase-stat { + text-align: center; + &__num { + font-size: 0.6rem; + line-height: 0.6rem; + font-weight: 900; + color: #1d1d1d; + .accent { color: $accent; } + } + &__label { + font-size: 0.18rem; + line-height: 0.28rem; + color: #64748b; + margin-top: 0.08rem; + } + } + + // 单个岗位滚动卡片 + .job-ticker { + flex-shrink: 0; + background: rgba(30, 30, 46, 0.9); + backdrop-filter: blur(36px); + border-radius: 0.12rem; + padding: 0.2rem 0.24rem; + min-width: 2.8rem; + + // 公司名 + 时间 + &__company { + display: block; + font-size: 0.16rem; + line-height: 0.2rem; + font-weight: 600; + color: $accent; + } + + // 岗位名称 + &__title { + display: block; + font-size: 0.16rem; + line-height: 0.24rem; + color: #fff; + margin-top: 0.04rem; + } + } + + // ==================== 功能介绍区(通用样式) ==================== + .home-feature { + padding: 1rem 0; + + // 内容容器 — 左右两栏 + &__inner { + width: 12rem; + margin: 0 auto; + display: flex; + align-items: center; + gap: 0.8rem; + } + + // 文字描述区 + &__text { + flex: 1; + min-width: 0; + + h2 { + font-size: 0.52rem; + font-weight: 600; + line-height: 0.65rem; + color: #111; + margin: 0; + } + + p { + font-size: 0.2rem; + line-height: 0.325rem; + color: #999; + margin-top: 0.24rem; + max-width: 4.5rem; + } + } + + // 深色圆角按钮(带图标) + &__btn { + margin-top: 0.4rem; + display: inline-flex; + align-items: center; + gap: 0.12rem; + padding: 0.2rem 0.4rem; + border-radius: 9999px; + background: $btn-dark; + color: #fff; + font-size: 0.18rem; + line-height: 0.28rem; + font-weight: 600; + border: none; + cursor: pointer; + transition: background 0.2s; + &:hover { background: $btn-dark-hover; } + svg { flex-shrink: 0; } + } + + // 视觉展示区(右侧/左侧) + &__visual { + flex: 1; + min-width: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(82, 202, 209, 0.05); + border-radius: 0.48rem; + padding: 0.48rem; + min-height: 3.87rem; + } + + // 反向布局 — 图在左文在右 + &--reverse { + .home-feature__inner { + flex-direction: row-reverse; + } + } + } + + // ---- 功能1:匹配卡片 ---- + .feature-match-card { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(255, 255, 255, 0.4); + box-shadow: 0 20px 50px rgba(0, 0, 0, 0.04); + backdrop-filter: blur(60px); + border-radius: 0.32rem; + padding: 0.4rem; + width: 100%; + max-width: 5rem; + + // 用户信息行 + &__header { + display: flex; + align-items: center; + gap: 0.16rem; + margin-bottom: 0.24rem; + } + + // 头像 + &__avatar { + width: 0.64rem; + height: 0.64rem; + border-radius: 50%; + background: linear-gradient(135deg, $accent, #a7f3d0); + flex-shrink: 0; + } + + // 用户名 + &__info { + h4 { + font-size: 0.2rem; + line-height: 0.28rem; + font-weight: 400; + margin: 0; + } + } + + // 技能标签 + &__tags { + display: flex; + gap: 0.08rem; + margin-top: 0.04rem; + span { + font-size: 0.1rem; + line-height: 0.15rem; + background: rgba(82, 202, 209, 0.15); + color: $accent; + padding: 0.02rem 0.08rem; + border-radius: 0.04rem; + } + } + + // 匹配度分数 + &__score { + margin-left: auto; + background: $accent; + color: #fff; + padding: 0.12rem 0.16rem; + border-radius: 9999px; + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 600; + } + + // 骨架进度条 — block 自然纵排,无需 flex-direction: column + &__bars { + .bar { + height: 0.08rem; + border-radius: 9999px; + background: #e5e7eb; + &--full { width: 100%; } + &--3q { width: 75%; margin-top: 0.1rem; } + } + } + + // 匹配结果 + &__result { + margin-top: 0.32rem; + background: $accent; + color: #fff; + text-align: center; + padding: 0.16rem; + border-radius: 0.16rem; + font-size: 0.16rem; + line-height: 0.24rem; + font-weight: 600; + } + } + + // ---- 功能2:自动投递卡片 ---- + .feature-apply-card { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(255, 255, 255, 0.4); + box-shadow: 0 20px 50px rgba(0, 0, 0, 0.04); + backdrop-filter: blur(60px); + border-radius: 0.32rem; + padding: 0.32rem; + width: 100%; + max-width: 5.6rem; + transform: rotate(-2deg); + + // 顶部状态栏 + &__header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #f3f4f6; + padding-bottom: 0.16rem; + margin-bottom: 0.24rem; + } + + // 状态文字 + &__status { + font-size: 0.14rem; + line-height: 0.2rem; + color: #9ca3af; + } + + // 窗口装饰圆点 + &__dots { + display: flex; + gap: 0.04rem; + .dot { + width: 0.08rem; + height: 0.08rem; + border-radius: 50%; + &--red { background: #f87171; } + &--yellow { background: #fbbf24; } + &--green { background: #34d399; } + } + } + + // 投递列表 — 子项是 block 级,自然纵排 + &__list { + .apply-item + .apply-item { + margin-top: 0.16rem; + } + } + } + + // 单个投递项 + .apply-item { + display: flex; + align-items: center; + gap: 0.16rem; + background: rgba(255, 255, 255, 0.5); + padding: 0.16rem; + border-radius: 0.16rem; + border: 1px solid rgba(255, 255, 255, 1); + + // 图标 + &__icon { + width: 0.4rem; + height: 0.4rem; + background: $accent; + border-radius: 0.12rem; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 0.18rem; + line-height: 1; + flex-shrink: 0; + + // 脉冲动画 + &--pulse { + animation: pulse 2s infinite; + } + } + + // 投递标题 + &__title { + font-size: 0.14rem; + line-height: 0.2rem; + font-weight: 600; + color: #111; + margin: 0; + } + + // 投递副标题 + &__sub { + font-size: 0.12rem; + line-height: 0.16rem; + color: #9ca3af; + margin: 0.02rem 0 0; + } + } + + @keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } + } + + // ---- 功能3:简历文档模拟卡片 ---- + .feature-resume-card { + position: relative; + display: flex; + align-items: center; + justify-content: center; + + // 简历文档 + &__doc { + width: 2rem; + aspect-ratio: 3/4; + background: #fff; + border: 1.2px dashed #e5e7eb; + border-radius: 0.16rem; + padding: 0.16rem; + } + + // ATS 优化徽章 + &__badge { + position: absolute; + bottom: -0.1rem; + left: -0.1rem; + background: $btn-dark; + color: #fff; + padding: 0.12rem 0.2rem; + border-radius: 0.24rem; + display: flex; + align-items: center; + gap: 0.08rem; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); + + span { + font-size: 0.09rem; + line-height: 0.09rem; + font-weight: 900; + letter-spacing: 0.01rem; + } + } + } + + // 简历文档头部 + .doc-header { + display: flex; + gap: 0.12rem; + align-items: center; + margin-bottom: 0.2rem; + } + + // 简历头像占位 + .doc-avatar { + width: 0.25rem; + height: 0.25rem; + border-radius: 0.05rem; + background: #f3f4f6; + flex-shrink: 0; + } + + // 简历文字行占位 — block 自然纵排 + .doc-lines { + flex: 1; + } + + .doc-line { + height: 0.05rem; + background: #e5e7eb; + border-radius: 0.02rem; + &--half { width: 50%; } + &--third { width: 33%; margin-top: 0.05rem; } + } + + // 简历内容条占位 — block 自然纵排 + .doc-bar { + height: 0.075rem; + border-radius: 0.025rem; + &--1 { width: 100%; background: rgba(82, 202, 209, 0.3); } + &--2 { width: 100%; background: rgba(82, 202, 209, 0.2); margin-top: 0.1rem; } + &--3 { width: 83%; background: rgba(82, 202, 209, 0.1); margin-top: 0.1rem; } + } + + // ---- 功能4:内推人脉网格 ---- + .referral-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.16rem; + width: 100%; + max-width: 3.5rem; + } + + // 单个内推卡片 + .referral-card { + background: rgba(255, 255, 255, 0.9); + border: 0.8px solid rgba(255, 255, 255, 0.5); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.03); + backdrop-filter: blur(56px); + border-radius: 0.32rem; + padding: 0.2rem; + + // 奇数列偏移效果 + &--offset { + transform: translateY(0.25rem); + } + + // 公司首字母图标 + &__icon { + width: 0.32rem; + height: 0.32rem; + border-radius: 0.12rem; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 0.13rem; + line-height: 1; + font-weight: 900; + margin-bottom: 0.12rem; + } + + // 公司名 + &__company { + font-size: 0.1rem; + line-height: 0.125rem; + color: #9ca3af; + margin: 0; + } + + // 岗位名 + &__role { + font-size: 0.11rem; + line-height: 0.156rem; + font-weight: 900; + color: #111; + margin: 0.03rem 0 0; + } + + // 内推码标签 + &__code { + display: inline-block; + margin-top: 0.12rem; + font-size: 0.08rem; + line-height: 0.117rem; + background: rgba(82, 202, 209, 0.1); + color: $accent; + padding: 0.015rem 0.06rem; + border-radius: 9999px; + } + } + + // ---- 功能5:AI 对话模拟 ---- + .feature-ai-chat { + width: 100%; + max-width: 5rem; + // 气泡纵向排列 — 子元素是 block 级 div,自然纵排 + .ai-bubble + .ai-bubble { + margin-top: 0.22rem; + } + } + + // 对话气泡 + .ai-bubble { + padding: 0.22rem; + font-size: 0.13rem; + line-height: 0.21rem; + max-width: 80%; + + // 机器人气泡 + &--bot { + background: rgba(255, 255, 255, 0.9); + border: 0.9px solid rgba(255, 255, 255, 0.5); + box-shadow: 0 18px 46px rgba(0, 0, 0, 0.03); + backdrop-filter: blur(66px); + border-radius: 0.32rem; + border-top-left-radius: 0; + color: #111; + } + + // 用户气泡 + &--user { + background: $accent; + color: #fff; + border-radius: 0.32rem; + border-top-right-radius: 0; + margin-left: auto; + box-shadow: 0 4px 14px rgba(82, 202, 209, 0.2); + } + + // 气泡内标题 + &__title { + font-weight: 600; + margin: 0 0 0.12rem; + line-height: 0.18rem; + } + + // 面试标签网格 + &__tags { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 0.1rem; + + span { + background: rgba(255, 255, 255, 0.5); + border: 0.9px solid rgba(255, 255, 255, 0.4); + border-radius: 0.16rem; + padding: 0.1rem 0.12rem; + font-size: 0.11rem; + line-height: 0.147rem; + color: #111; + } + } + } + + // ==================== 用户评价区 ==================== + .home-testimonials { + padding: 1.2rem 0; + background: rgba(82, 202, 209, 0.03); + backdrop-filter: blur(100px); + overflow: hidden; + + // 标题区 + &__header { + text-align: center; + margin-bottom: 0.8rem; + + h2 { + font-size: 0.48rem; + line-height: 0.48rem; + font-weight: 600; + letter-spacing: -0.012rem; + } + + p { + font-size: 0.16rem; + line-height: 0.24rem; + color: #9ca3af; + letter-spacing: 0.016rem; + text-transform: uppercase; + margin-top: 0.12rem; + } + } + + // 创始人引言卡片 + &__founder { + width: 12rem; + margin: 0 auto 0.8rem; + background: $btn-dark; + color: #fff; + border-radius: 0.48rem; + padding: 0.48rem; + display: flex; + align-items: center; + gap: 0.48rem; + position: relative; + overflow: hidden; + + // 创始人头像 + &-img { + width: 1.28rem; + height: 1.28rem; + border-radius: 0.24rem; + background: rgba(255, 255, 255, 0.1); + display: flex; + align-items: center; + justify-content: center; + font-size: 0.6rem; + line-height: 1; + flex-shrink: 0; + } + + // 引言文字 + blockquote { + font-size: 0.24rem; + line-height: 0.39rem; + margin: 0; + } + + // 署名 + cite { + display: block; + margin-top: 0.24rem; + font-style: normal; + line-height: 0.28rem; + .cite-name { + font-size: 0.2rem; + color: $accent; + font-weight: 600; + } + .cite-role { + font-size: 0.14rem; + color: #999; + margin-left: 0.08rem; + } + } + } + + // 评价卡片横向滚动容器 + &__scroll { + display: flex; + gap: 0.24rem; + padding: 0 1.2rem; + overflow-x: auto; + &::-webkit-scrollbar { display: none; } + } + } + + // 单个评价卡片 + .testimonial-card { + flex-shrink: 0; + min-width: 3.71rem; + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 20px 50px rgba(0, 0, 0, 0.05); + border-radius: 0.4rem; + padding: 0.3rem; + position: relative; + + // 引号装饰 + &__quote { + position: absolute; + right: 0.3rem; + top: 0.3rem; + opacity: 0.3; + } + + // 评价文字 + &__text { + font-size: 0.16rem; + line-height: 0.26rem; + color: #4b5563; + margin: 0; + } + + // 作者信息行 + &__author { + display: flex; + align-items: center; + gap: 0.16rem; + margin-top: 0.3rem; + } + + // 作者头像 + &__avatar { + width: 0.48rem; + height: 0.48rem; + border-radius: 50%; + background: linear-gradient(135deg, $accent, #a7f3d0); + border: 2px solid #fff; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); + } + + // 作者姓名 + &__name { + font-size: 0.16rem; + line-height: 0.24rem; + font-weight: 600; + color: #111; + margin: 0; + } + + // 学校 + &__school { + font-size: 0.12rem; + line-height: 0.16rem; + color: #9ca3af; + margin: 0; + } + } + + // ==================== 岗位搜索入口 ==================== + .home-job-search { + padding: 0.8rem 0; + + // 内容容器 + &__inner { + width: 12rem; + margin: 0 auto; + + h3 { + font-size: 0.3rem; + line-height: 0.36rem; + font-weight: 600; + text-align: center; + margin-bottom: 0.4rem; + } + } + + // 筛选条件横向排列 + &__filters { + display: flex; + gap: 0.24rem; + justify-content: center; + align-items: center; + } + } + + // 筛选下拉框 + .filter-select { + display: flex; + align-items: center; + justify-content: space-between; + width: 2.35rem; + height: 0.48rem; + border-radius: 0.24rem; + border: 1px solid #e5e7eb; + padding: 0 0.2rem; + cursor: pointer; + + span { + font-size: 0.16rem; + line-height: 0.24rem; + color: rgba(0, 0, 0, 0.45); + } + + svg { color: #9ca3af; } + } + + // 搜索按钮 + .filter-btn { + height: 0.48rem; + padding: 0 0.4rem; + border-radius: 0.24rem; + background: $accent; + color: #fff; + font-size: 0.16rem; + line-height: 0.26rem; + font-weight: 600; + border: none; + cursor: pointer; + transition: background 0.2s; + &:hover { background: $accent-hover; } + } + + // ==================== 常见问题(FAQ) ==================== + .home-faq { + padding: 1rem 0; + + // 内容容器 + &__inner { + width: 12rem; + margin: 0 auto; + } + + // 标题区 + &__header { + text-align: center; + margin-bottom: 0.6rem; + + h2 { + font-size: 0.48rem; + line-height: 0.48rem; + font-weight: 600; + } + + p { + font-size: 0.16rem; + line-height: 0.24rem; + color: #9ca3af; + margin-top: 0.1rem; + } + } + + // FAQ 列表 — 子项是 block 级 div,自然纵排,用 margin 间距 + &__list { + max-width: 8.96rem; + margin: 0 auto; + + .faq-item + .faq-item { + margin-top: 0.16rem; + } + } + } + + // 单个 FAQ 项 + .faq-item { + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.04); + border-radius: 0.24rem; + cursor: pointer; + transition: all 0.3s; + overflow: hidden; + + // 问题行 + &__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.3rem 0.24rem; + } + + // 问题文字 + &__question { + font-size: 0.2rem; + line-height: 0.3rem; + font-weight: 500; + color: #111; + } + + // 展开/收起图标按钮 + &__icon { + width: 0.4rem; + height: 0.4rem; + background: #f3f4f6; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: #111; + transition: all 0.3s; + } + + // 答案内容 + &__answer { + padding: 0 0.24rem 0.3rem; + + p { + font-size: 0.16rem; + line-height: 0.3rem; + color: #4b5563; + } + } + + // 悬停态 — 图标变品牌色 + &:hover { + .faq-item__icon { + background: $accent; + color: #fff; + } + } + + // 展开态 — 图标变品牌色 + &--open { + .faq-item__icon { + background: $accent; + color: #fff; + } + } + } + + // ==================== 底部 CTA 行动号召 ==================== + .home-cta { + padding: 0 1.2rem 1.2rem; + + // CTA 内容区 + &__inner { + background: $accent; + border-radius: 0.6rem; + padding: 1.28rem 0; + text-align: center; + position: relative; + overflow: hidden; + + h2 { + font-size: 0.52rem; + font-weight: 600; + color: #fff; + line-height: 0.65rem; + position: relative; + z-index: 1; + } + } + + // CTA 按钮 + &__btn { + margin-top: 0.4rem; + padding: 0.24rem 0.64rem; + border-radius: 9999px; + background: $btn-dark; + color: #fff; + font-size: 0.2rem; + line-height: 0.28rem; + font-weight: 600; + border: none; + cursor: pointer; + position: relative; + z-index: 1; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + transition: background 0.2s; + &:hover { background: $btn-dark-hover; } + } + } + + // ==================== 页脚 ==================== + .home-footer { + background: #fff; + border-top: 1px solid #f3f4f6; + padding: 0.8rem 0 0.4rem; + + // 页脚内容 — 四列横向排列 + &__inner { + width: 12rem; + margin: 0 auto; + display: flex; + gap: 1.2rem; + } + + // 单列 + &__col { + &:first-child { + min-width: 2.6rem; + } + + // 列标题 + h5 { + font-size: 0.16rem; + line-height: 0.24rem; + font-weight: 500; + color: #111; + margin: 0 0 0.32rem; + } + + // 链接列表 — ul > li 自然纵排,无需 flex-direction: column + ul { + list-style: none; + padding: 0; + margin: 0; + + li { + font-size: 0.16rem; + line-height: 0.24rem; + color: #999; + cursor: pointer; + &:hover { color: $accent; } + } + + li + li { + margin-top: 0.16rem; + } + } + } + + // Logo + &__logo { + margin-bottom: 0.16rem; + } + + // Logo 文字 + &__logo-text { + font-size: 0.22rem; + line-height: 0.34rem; + font-weight: 700; + color: $accent; + } + + // 品牌标语 + &__slogan { + font-size: 0.16rem; + line-height: 0.24rem; + color: #9ca3af; + } + + // 版权信息 + &__bottom { + width: 12rem; + margin: 0.6rem auto 0; + text-align: center; + border-top: 1px solid #f3f4f6; + padding-top: 0.4rem; + + p { + font-size: 0.12rem; + line-height: 0.16rem; + color: #9ca3af; + } + } + } +} // end .home-page diff --git a/src/assets/styles/pages/job-detail.scss b/src/assets/styles/pages/job-detail.scss index bee2c4f..f27cb53 100644 --- a/src/assets/styles/pages/job-detail.scss +++ b/src/assets/styles/pages/job-detail.scss @@ -4,7 +4,7 @@ .job-detail { &__content { margin-left: 2rem; - margin-right: 3.2rem; + margin-right: 3.6rem; flex: 1; padding: 0.12rem 0.56rem 0.12rem 0.18rem; height: 100vh; @@ -13,6 +13,23 @@ background: $bg-main; display: flex; flex-direction: column; + + // 手动包裹的两层 div,需要撑满剩余高度并允许内部滚动 + > .bg-white { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + overflow: hidden; + + > .bg-main { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + overflow: hidden; + } + } } // ---- 页面标题 ---- @@ -138,7 +155,7 @@ } &__apply-btn { - background: $btn-dark; + background: $accent; color: $bg-white; border: none; border-radius: 0.2rem; @@ -379,7 +396,7 @@ display: flex; align-items: center; justify-content: space-between; - background: $btn-dark; + background: linear-gradient(90deg, #94EF9E , #53D9C8 ); color: $bg-white; border-radius: 0.1rem; padding: 0.14rem 0.2rem; @@ -563,6 +580,7 @@ display: flex; flex-direction: column; gap: 0.08rem; + max-width: 45%; } &__company-meta-item { @@ -621,7 +639,7 @@ &__news-desc { font-size: 0.11rem; - color: $text-light; + color: $text-middle; line-height: 1.6; margin: 0; display: -webkit-box; diff --git a/src/assets/styles/pages/jobs.scss b/src/assets/styles/pages/jobs.scss index bd44a22..1fe902b 100644 --- a/src/assets/styles/pages/jobs.scss +++ b/src/assets/styles/pages/jobs.scss @@ -5,7 +5,7 @@ .jobs-page { &__content { margin-left: 2rem; - margin-right: 3.6rem; + margin-right: 4.0rem; flex: 1; padding: 0.12rem 0.18rem; height: 100vh; @@ -89,6 +89,7 @@ display: flex; align-items: center; gap: 0.12rem; + flex-wrap: wrap; } &__filter-group { @@ -111,6 +112,7 @@ transition: all 0.2s ease; white-space: nowrap; position: relative; + height: 0.234rem; &:hover { border-color: $accent; @@ -219,7 +221,7 @@ &:hover { box-shadow: 0 0.04rem 0.16rem rgba(0, 0, 0, 0.06); background: #fbfbfb; - transform: translateY(-0.01rem); + //transform: translateY(-0.01rem); } &--selected { @@ -237,14 +239,12 @@ &__job-left { flex: 1; - display: flex; - gap: 0.16rem; min-width: 0; } &__job-icon { - width: 0.44rem; - height: 0.44rem; + width: 0.54rem; + height: 0.54rem; border-radius: 0.1rem; background: $theme-color; display: flex; @@ -300,9 +300,31 @@ height: 0.16rem; } - &__job-meta { - font-size: 0.12rem; + &__job-remove { color: $text-light; + cursor: pointer; + background: none; + border: none; + padding: 0.04rem; + border-radius: 0.04rem; + transition: all 0.2s; + display: flex; + align-items: center; + + &:hover { + color: $danger; + background: #FFF0ED; + } + } + + &__remove-svg { + width: 0.14rem; + height: 0.14rem; + } + + &__job-meta { + font-size: 0.14rem; + color: $text-middle; margin-top: 0.04rem; line-height: 1.4; } @@ -414,8 +436,8 @@ display: flex; align-items: center; gap: 0.04rem; - background: none; - border: none; + background: $bg-main; + border: 1px solid #E8E8E8; padding: 0.04rem 0.08rem; border-radius: 0.14rem; @@ -431,20 +453,18 @@ } &__job-apply-btn { - background: $bg-main; - border: 1px solid #E8E8E8; + background: $btn-dark; + border: 0.02rem solid $btn-dark; border-radius: 0.2rem; - padding: 0.06rem 0.2rem; - color: $text-dark; + padding: 0.04rem 0.2rem; + color: $bg-white; font-size: 0.12rem; cursor: pointer; transition: all 0.2s; font-weight: 500; &:hover { - border-color: $accent; - color: $accent; - background: $theme-color; + background: $btn-dark-hover; } &--active { @@ -549,6 +569,52 @@ margin-top: 0.01rem; } + // 未登录锁定态 + &__job-match--locked { + background: $bg-main; + border: 1px solid #E8E8E8; + } + + &__lock-icon { + width: 0.32rem; + height: 0.32rem; + color: $text-light; + margin-bottom: 0.06rem; + } + + &__match-lock-text { + font-size: 0.1rem; + color: $text-light; + white-space: nowrap; + } + + // 收藏统计栏 + &__fav-stats { + display: flex; + align-items: center; + gap: 0.4rem; + } + + &__fav-stats-item { + font-size: 0.14rem; + color: $text-dark; + font-weight: 500; + cursor: pointer; + padding: 0.04rem 0.08rem; + border-radius: 0.06rem; + transition: all 0.2s; + + &:hover { + color: $accent; + } + + &--active { + color: $accent; + font-weight: 600; + background: $theme-color; + } + } + // 加载更多提示 &__loading-more { text-align: center; @@ -588,7 +654,6 @@ color: $text-dark; line-height: 1.6; margin-bottom: 0.2rem; - margin-top: 0.12rem; // 居中标题(问题反馈弹窗用) &--center { diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index 5745706..5c36e4f 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -20,6 +20,9 @@ $text-dark: #000000; // 浅色文字(副标题、占位符、辅助信息) $text-light: #BFBFBF; +// 中间色文字(使用优先级高于浅色文字,稍微要深色一点的副标题、占位符、辅助信息) +$text-middle: #777777; + // 强调色 / 品牌色 $accent: #4FC2C9; @@ -36,7 +39,12 @@ $border-color: #E8E8E8; $overlay-bg: rgba(0, 0, 0, 0.5); // 按钮深色背景(确认提交等) -$btn-dark: #1A1A2E; +// $btn-dark: #1A1A2E; +$btn-dark: #4FC2C9; // 按钮深色悬停态 -$btn-dark-hover: #2E3142; +// $btn-dark-hover: #2E3142; +$btn-dark-hover: #42A8B3; + +// 渐变色背景 +$gradient-bg: linear-gradient(to right, #4FC2C9, #42A8B3); diff --git a/src/components/JobDislikeDialog.vue b/src/components/JobDislikeDialog.vue index 2b23ce8..52bbdfe 100644 --- a/src/components/JobDislikeDialog.vue +++ b/src/components/JobDislikeDialog.vue @@ -40,6 +40,7 @@ diff --git a/src/components/JobResumeTemplate.vue b/src/components/JobResumeTemplate.vue new file mode 100644 index 0000000..080cc64 --- /dev/null +++ b/src/components/JobResumeTemplate.vue @@ -0,0 +1,238 @@ + + + diff --git a/src/components/ProfileEditDrawer.vue b/src/components/ProfileEditDrawer.vue index 4529b47..56b73da 100644 --- a/src/components/ProfileEditDrawer.vue +++ b/src/components/ProfileEditDrawer.vue @@ -657,6 +657,19 @@ + + +