From 8773c65b28e325651329be308aadf8b255d23efb Mon Sep 17 00:00:00 2001 From: xuxin <15279969124@163.com> Date: Tue, 30 Jun 2026 17:09:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E9=A1=B9=E7=9B=AE=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=8A=A8=E6=95=88=E9=87=8D=E5=81=9A=E5=92=8C=E7=AE=80=E5=8E=86?= =?UTF-8?q?=E7=BB=8F=E5=8E=86=E5=8C=BA=E5=9F=9F=E7=9A=84=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=92=8C=E7=BC=96=E8=BE=91=E6=8C=89=E9=92=AE=E5=90=8C=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E6=98=BE=E7=A4=BA=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 1 + src/assets/images/logo-offerpai.png | Bin 0 -> 6101 bytes .../styles/components/member-dialog.scss | 2 +- .../components/profile-edit-drawer.scss | 5 +- .../components/profile-page-content.scss | 23 +- .../components/settings-invite-dialog.scss | 265 ++++++++++-------- src/assets/styles/components/side-nav.scss | 9 +- src/assets/styles/index.scss | 6 + src/assets/styles/pages/login.scss | 97 ------- src/assets/styles/pages/resume-detail.scss | 44 ++- src/components/FullscreenLoading.vue | 130 +++++++++ src/components/JobResumeCustomDialog.vue | 16 +- src/components/ProfileEditDrawer.vue | 21 +- src/components/ProfilePageContent.vue | 19 +- src/components/ProfileWelcomeDialog.vue | 27 +- src/components/ResumeExpInlineEdit.vue | 15 +- src/components/ResumeIssueFixAllDrawer.vue | 18 +- src/components/ResumeIssueFixDrawer.vue | 29 +- src/components/SettingsInviteDialog.vue | 121 ++++---- src/views/JobDetail.vue | 17 +- src/views/Login.vue | 96 ++----- src/views/Profile.vue | 28 +- src/views/Resume.vue | 26 +- src/views/ResumeDetail.vue | 84 +++--- 24 files changed, 610 insertions(+), 489 deletions(-) create mode 100644 src/assets/images/logo-offerpai.png create mode 100644 src/components/FullscreenLoading.vue diff --git a/components.d.ts b/components.d.ts index d835eff..bfb7102 100644 --- a/components.d.ts +++ b/components.d.ts @@ -38,6 +38,7 @@ declare module 'vue' { ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] + FullscreenLoading: typeof import('./src/components/FullscreenLoading.vue')['default'] 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'] diff --git a/src/assets/images/logo-offerpai.png b/src/assets/images/logo-offerpai.png new file mode 100644 index 0000000000000000000000000000000000000000..36ab9b30a0276d16b6b084f49a65137b5850268d GIT binary patch literal 6101 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 zspan{ + vertical-align: super; + } } &__contact-icon { @@ -473,14 +482,7 @@ border-radius: 0.06rem; } - // 经历条目内的编辑按钮(hover exp-item 时显示) - &__exp-edit-btn { - } - - &__exp-item:hover &__exp-edit-btn { - opacity: 1; - pointer-events: auto; - } + // 经历条目内的编辑按钮样式已在 &__exp-date 下方统一管理 // ---- 教育背景 ---- &__edu-item { @@ -552,9 +554,33 @@ } &__exp-date { - font-size: 0.12rem; + font-size: 0.13rem; font-weight: 400; color: $text-middle; + + // 带切换效果的时间(hover exp-item 时隐藏) + &--toggle { + display: inline; + } + } + + // hover经历条目时:隐藏时间,显示按钮 + &__exp-item:hover &__exp-date--toggle { + display: none; + } + + // 默认隐藏按钮且不占位 + &__exp-edit-btn { + display: none; + padding-top: 0; + padding-bottom: 0; + } + + // hover经历条目时:显示按钮 + &__exp-item:hover &__exp-edit-btn { + display: flex; + opacity: 1; + pointer-events: auto; } // ---- 修复建议标记 ---- diff --git a/src/components/FullscreenLoading.vue b/src/components/FullscreenLoading.vue new file mode 100644 index 0000000..1a44a4d --- /dev/null +++ b/src/components/FullscreenLoading.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/JobResumeCustomDialog.vue b/src/components/JobResumeCustomDialog.vue index 10913a9..b6bd562 100644 --- a/src/components/JobResumeCustomDialog.vue +++ b/src/components/JobResumeCustomDialog.vue @@ -347,6 +347,8 @@ + + diff --git a/src/views/JobDetail.vue b/src/views/JobDetail.vue index 74ba52c..bb20c31 100644 --- a/src/views/JobDetail.vue +++ b/src/views/JobDetail.vue @@ -281,6 +281,8 @@ + + @@ -296,6 +298,7 @@ import JobDislikeDialog from '@/components/JobDislikeDialog.vue' import JobFeedbackDialog from '@/components/JobFeedbackDialog.vue' import JobResumeCustomDialog from '@/components/JobResumeCustomDialog.vue' import MemberAccessDialog from '@/components/MemberAccessDialog.vue' +import FullscreenLoading from '@/components/FullscreenLoading.vue' import MemberDialog from '@/components/MemberDialog.vue' import { fetchJobDetail, toggleJobFavorite, removeJobFavorite, fetchSkillGap } from '@/api/jobs' import { fetchMemberStatus } from '@/api/member' @@ -307,6 +310,12 @@ const router = useRouter() const route = useRoute() const store = useStore() +// ==================== 全屏加载状态 ==================== +/** 全屏加载是否显示 */ +const fullLoading = ref(false) +/** 全屏加载文案 */ +const fullLoadingText = ref('') + /** 当前岗位 ID,从路由参数中获取 */ const jobId = route.params.id as string @@ -595,10 +604,8 @@ async function handleGenerateResume() { // 接口异常时不阻断,继续执行 } - const loadingInstance = ElLoading.service({ - text: '正在分析岗位匹配度...', - background: 'rgba(0, 0, 0, 0.5)', - }) + fullLoadingText.value = '正在分析岗位匹配度...' + fullLoading.value = true try { const res = await fetchSkillGap(jobId) if (res.code === 0 && res.data) { @@ -609,7 +616,7 @@ async function handleGenerateResume() { ElMessage.error('分析失败,请稍后重试') return } finally { - loadingInstance.close() + fullLoading.value = false } showResumeCustomDialog.value = true } diff --git a/src/views/Login.vue b/src/views/Login.vue index b526cd1..7ef7b8f 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -2,29 +2,30 @@ @@ -287,19 +261,7 @@ let parsingTimer: ReturnType | null = null /** 文件选择器引用 */ const fileInputRef = ref(null) -/** 左侧职位卡片硬编码数据 */ -const jobCards = [ - { icon: '网', iconBg: '#FFE8E8', iconColor: '#E85635', title: '前端工程师', company: '网易', salary: '18-28K', style: 'top: 0.6rem; left: 0.4rem;' }, - { icon: '网', iconBg: '#FFE8E8', iconColor: '#E85635', title: '运营专员', company: '阿里巴巴', salary: '15-20K', style: 'top: 0.6rem; right: 0.8rem;' }, - { icon: '百', iconBg: '#E8F0FF', iconColor: '#4A7FE5', title: '算法工程师', company: '百度', salary: '30-45K', style: 'top: 1.5rem; left: 0.2rem;' }, - { icon: '美', iconBg: '#FFF3E8', iconColor: '#E8953F', title: '商业分析实习生', company: '美团', salary: '15K', style: 'top: 1.8rem; left: 2.8rem;' }, - { icon: '小', iconBg: '#E8FFE8', iconColor: '#4CAF50', title: '硬件产品', company: '小米', salary: '18-24K', style: 'top: 2.5rem; left: 0.3rem;' }, - { icon: '网', iconBg: '#FFE8E8', iconColor: '#E85635', title: '产品运营', company: '京东', salary: '18-25K', style: 'top: 2.8rem; right: 0.6rem;' }, - { icon: '字', iconBg: '#F0E8FF', iconColor: '#7C4DFF', title: '产品经理', company: '字节跳动', salary: '25-35K', style: 'top: 3.5rem; left: 1.2rem;' }, - { icon: '增', iconBg: '#E8FFF5', iconColor: '#12C7BE', title: '增长运营', company: '拼多多', salary: '20-28K', style: 'top: 3.5rem; right: 0.4rem;' }, - { icon: '滴', iconBg: '#FFF8E1', iconColor: '#FFC107', title: '后端开发', company: '滴滴', salary: '22-32K', style: 'top: 4.3rem; left: 0.5rem;' }, - { icon: '网', iconBg: '#FFE8E8', iconColor: '#E85635', title: '数据分析师', company: '腾讯', salary: '20-30K', style: 'top: 4.6rem; right: 0.8rem;' }, -] + /** 解析中文字轮换列表 */ const parsingSteps = ['正在解析个人资料...', '正在解析教育背景...', '正在解析工作经历...', '正在解析技能特长...', '简历解析成功,即将跳转'] diff --git a/src/views/Profile.vue b/src/views/Profile.vue index 777501e..d303b79 100644 --- a/src/views/Profile.vue +++ b/src/views/Profile.vue @@ -37,6 +37,8 @@ + +