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 @@
+
+
+
+
+
+
{{ resumeData.name }}
+
+
+
+
+
+
+ 个人概述
+
+ {{ resumeData.summary }}
+
+
+
+
+ 教育背景
+
+
+
+
+
+
+
+
+ 工作经历
+
+
+
+
+
+
+ 实习经历
+
+
+
+
+
+
+ 项目经历
+
+
+
+
+
+
+ 获奖经历
+
+
+
+
+
+
+ 专业技能
+
+
+
+ 技能:
+ {{ resumeData.skills.join('、') }}
+
+
+ 证书:
+ {{ resumeData.certificates.join('、') }}
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
@@ -859,6 +872,7 @@ const moduleTitleMap: Record = {
work: '工作经历',
internship: '实习经历',
project: '项目经历',
+ portfolio: '作品集',
skills: '技能',
competition: '竞赛',
certificate: '证书',
@@ -1082,6 +1096,9 @@ const removeCompetition = (index: number) => {
/** 技能列表 — 技能模块使用 */
const skillsList = ref([])
+/** 作品集链接 — 作品集模块使用 */
+const portfolioUrl = ref('')
+
/** 新技能输入框的值 */
const newSkillInput = ref('')
@@ -1185,6 +1202,9 @@ watch(() => props.modelValue, (visible) => {
} else {
competitionList.value = [createEmptyCompetition()]
}
+ } else if (props.module === 'portfolio') {
+ // 作品集:用初始数据填充链接
+ portfolioUrl.value = props.initialData?.portfolioUrl || ''
} else if (props.module === 'skills') {
// 技能:用初始数据填充列表,若无则创建空数组
skillsList.value = props.initialData?.skills ? [...props.initialData.skills] : []
@@ -1234,6 +1254,8 @@ const handleSave = () => {
...item,
description: item.description.map(d => ({ ...d })),
})) })
+ } else if (props.module === 'portfolio') {
+ emit('save', { portfolioUrl: portfolioUrl.value })
} else if (props.module === 'skills') {
emit('save', { skills: [...skillsList.value] })
} else if (props.module === 'certificate') {
diff --git a/src/components/ProfilePageContent.vue b/src/components/ProfilePageContent.vue
index 13b3266..32f12a8 100644
--- a/src/components/ProfilePageContent.vue
+++ b/src/components/ProfilePageContent.vue
@@ -19,6 +19,26 @@
+
+
+