From f341408254f76dc8340476c75332722f2c789c7c Mon Sep 17 00:00:00 2001 From: xuxin <15279969124@163.com> Date: Wed, 6 May 2026 15:07:44 +0800 Subject: [PATCH] =?UTF-8?q?AI=E5=8A=A9=E6=89=8B=E5=92=8CNova=E5=8A=A9?= =?UTF-8?q?=E6=89=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 9 + src/api/agent.ts | 280 +++++ src/api/jobs.ts | 10 +- src/api/resume.ts | 166 ++- src/assets/images/插件操作界面.png | Bin 0 -> 60403 bytes src/assets/images/编辑简历名称.png | Bin 0 -> 22642 bytes .../components/agent-chat-job-list.scss | 160 +++ .../components/agent-match-job-add.scss | 269 +++++ .../components/agent-settings-panel.scss | 145 +++ src/assets/styles/components/ai-chat.scss | 17 +- .../components/ai-thinking-indicator.scss | 25 + .../components/job-resume-custom-dialog.scss | 16 +- .../components/job-resume-template.scss | 6 + .../components/resume-edit-name-dialog.scss | 99 ++ src/assets/styles/index.scss | 4 + src/assets/styles/pages/agent.scss | 843 ++++++++++++- src/assets/styles/pages/resume-detail.scss | 5 +- src/assets/styles/pages/resume.scss | 59 +- src/assets/styles/variables.scss | 3 + src/components/AgentChatJobList.vue | 91 ++ src/components/AgentMatchJobAdd.vue | 134 +++ src/components/AgentSettingsPanel.vue | 177 +++ src/components/AgentSetupWizard.vue | 472 ++++++++ src/components/AiChat.vue | 210 +++- src/components/JobResumeCustomDialog.vue | 103 +- src/components/JobResumeCustomEditPanel.vue | 4 +- src/components/JobResumeTemplate.vue | 88 +- src/components/ProfileEditDrawer.vue | 10 + src/components/ResumeEditNameDialog.vue | 141 +++ src/components/tools/AiThinkingIndicator.vue | 18 + src/utils/aiRequest.ts | 48 +- src/utils/resumeExport.ts | 186 +++ src/views/Agent.vue | 1053 +++++++++++------ src/views/JobDetail.vue | 2 +- src/views/Jobs.vue | 12 +- src/views/Resume.vue | 139 ++- src/views/ResumeDetail.vue | 410 +++++-- vite.config.ts | 2 +- 38 files changed, 4759 insertions(+), 657 deletions(-) create mode 100644 src/api/agent.ts create mode 100644 src/assets/images/插件操作界面.png create mode 100644 src/assets/images/编辑简历名称.png create mode 100644 src/assets/styles/components/agent-chat-job-list.scss create mode 100644 src/assets/styles/components/agent-match-job-add.scss create mode 100644 src/assets/styles/components/agent-settings-panel.scss create mode 100644 src/assets/styles/components/ai-thinking-indicator.scss create mode 100644 src/assets/styles/components/resume-edit-name-dialog.scss create mode 100644 src/components/AgentChatJobList.vue create mode 100644 src/components/AgentMatchJobAdd.vue create mode 100644 src/components/AgentSettingsPanel.vue create mode 100644 src/components/AgentSetupWizard.vue create mode 100644 src/components/ResumeEditNameDialog.vue create mode 100644 src/components/tools/AiThinkingIndicator.vue create mode 100644 src/utils/resumeExport.ts diff --git a/components.d.ts b/components.d.ts index 331186e..7ea8728 100644 --- a/components.d.ts +++ b/components.d.ts @@ -11,8 +11,15 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AgentChatJobList: typeof import('./src/components/AgentChatJobList.vue')['default'] + AgentMatchJobAdd: typeof import('./src/components/AgentMatchJobAdd.vue')['default'] + AgentSettingsPanel: typeof import('./src/components/AgentSettingsPanel.vue')['default'] + AgentSetupWizard: typeof import('./src/components/AgentSetupWizard.vue')['default'] AiChat: typeof import('./src/components/AiChat.vue')['default'] + AiThinkingIndicator: typeof import('./src/components/tools/AiThinkingIndicator.vue')['default'] ElButton: typeof import('element-plus/es')['ElButton'] + ElCarousel: typeof import('element-plus/es')['ElCarousel'] + ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDialog: typeof import('element-plus/es')['ElDialog'] @@ -20,6 +27,7 @@ declare module 'vue' { ElInput: typeof import('element-plus/es')['ElInput'] ElOption: typeof import('element-plus/es')['ElOption'] ElRadio: typeof import('element-plus/es')['ElRadio'] + ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] @@ -39,6 +47,7 @@ declare module 'vue' { ProfilePageContent: typeof import('./src/components/ProfilePageContent.vue')['default'] RegionSelector: typeof import('./src/components/tools/RegionSelector.vue')['default'] ResumeAnalysisReportDrawer: typeof import('./src/components/ResumeAnalysisReportDrawer.vue')['default'] + ResumeEditNameDialog: typeof import('./src/components/ResumeEditNameDialog.vue')['default'] ResumeIssueFixDrawer: typeof import('./src/components/ResumeIssueFixDrawer.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/api/agent.ts b/src/api/agent.ts new file mode 100644 index 0000000..a1e6140 --- /dev/null +++ b/src/api/agent.ts @@ -0,0 +1,280 @@ +import request from '@/utils/request' +import type { ApiResult } from '@/api/auth' + +// ==================== 求职助手配置相关 ==================== + +/** 语言能力项 */ +export interface LanguageAbility { + /** 语种,如英语、日语、法语等 */ + language?: string + /** 掌握程度,可选值:入门/日常会话/商务会话/无障碍沟通/母语 */ + proficiency?: string +} + +/** 求职助手配置数据(查询返回 + 保存请求共用) */ +export interface AgentConfig { + /** 工作类型 1=实习 2=全职 */ + jobType?: number + /** Agent模式 1=协作模式 2=托管模式 */ + agentMode?: number + /** 每周投递目标数量 1=少于20个 2=20到50个 3=多于50个 */ + weeklyTarget?: number + /** 投递时自动针对岗位优化简历 0=关闭 1=开启 */ + autoOptimizeResume?: number + /** 是否愿意接受部门调剂 */ + acceptDeptTransfer?: string + /** 是否接受地点调剂 */ + acceptLocationTransfer?: string + /** 可参加的面试方式 */ + interviewType?: string[] + /** 语言能力 */ + languages?: LanguageAbility[] + /** 预计到岗时间 */ + availableDate?: string + /** 每周可实习天数 */ + internDaysPerWeek?: string + /** 预计实习时长 */ + internDuration?: string + /** 状态 0=未启用 1=已启用(仅查询返回) */ + status?: number +} + +/** + * 查询求职助手配置 + * GET /job-agent/config + */ +export function fetchAgentConfig() { + return request.get>('/job-agent/config') +} + +/** + * 保存求职助手配置 + * POST /job-agent/config/save + */ +export function saveAgentConfig(data: AgentConfig) { + return request.post('/job-agent/config/save', data) +} + +// ==================== 求职助手岗位推荐 ==================== + +/** 匹配度详情 */ +export interface AgentJobMatchDetail { + /** 学历匹配分 */ + educationScore: number + /** 技能匹配分 */ + skillScore: number + /** 经验匹配分 */ + experienceScore: number +} + +/** 推荐岗位项 */ +export interface AgentRecommendJob { + /** 岗位 ID */ + id: number + /** 岗位名称 */ + title: string + /** 薪资描述 */ + salary: string + /** 公司名称 */ + companyName: string + /** 公司简称 */ + companyShortName: string + /** 公司类型 */ + companyType: string + /** 公司 Logo */ + companyLogoUrl: string + /** 地区名称 */ + regionName: string + /** 岗位类型名称 */ + categoryName: string + /** 岗位标签 */ + tags: string[] + /** 来源链接 */ + sourceUrl: string + /** 是否收藏 */ + isFavorite: boolean + /** 投递状态(null=未投递,-1=待投递,0=已投递 1=面试中 2=有Offer 3=未通过 4=已结束) */ + applicationStatus: number | null + /** 岗位状态(0=有效 1=已下架 2=已过期) */ + status: number + /** 匹配总分(0-90) */ + matchScore: number + /** 匹配度详情 */ + matchDetail: AgentJobMatchDetail +} + +/** 求职助手岗位推荐返回数据 */ +export interface AgentRecommendResult { + /** 推荐说明(20字以内) */ + summary: string + /** 推荐的岗位列表(8-10个) */ + list: AgentRecommendJob[] +} + +/** 求职助手岗位推荐请求参数 */ +export interface AgentRecommendParams { + /** 用户偏好描述 */ + preference?: string + /** 排除已推荐过的岗位 ID 列表(字符串避免大整数精度丢失) */ + excludeJobIds?: (number | string)[] +} + +/** + * 求职助手岗位推荐 + * POST /job/agent/recommend + */ +export function fetchAgentRecommend(params: AgentRecommendParams = {}) { + return request.post>('/job/agent/recommend', params) +} + +// ==================== 岗位投递状态变更 ==================== + +/** 岗位投递请求参数 */ +export interface JobApplyParams { + /** 岗位 ID */ + jobId: number + /** 投递状态:-1=待投递 0=已投递 1=面试中 2=有Offer 3=未通过 4=已结束,null=取消 */ + status: number | null +} + +/** + * 变更岗位投递状态(添加到待投递等) + * POST /job/apply + */ +export function applyJob(params: JobApplyParams) { + return request.post('/job/apply', params) +} + +/** + * 取消投递 / 从待投递移除 + * DELETE /job/apply?jobId=xxx + * @param jobId 岗位 ID + */ +export function cancelApplyJob(jobId: number) { + return request.delete('/job/apply', { + params: { jobId }, + }) +} + +// ==================== Agent 对话消息 ==================== + +/** 消息创建时间 */ +export interface InstantTime { + /** 距 1970-01-01T00:00:00Z 的秒数 */ + seconds: number + /** 纳秒偏移(0 ~ 999,999,999) */ + nanos: number +} + +/** Agent 对话消息项 */ +export interface AgentChatMessage { + /** 消息 ID */ + id: number + /** 消息类型:user / assistant / recommend / apply_progress */ + type: string + /** 文本内容 */ + content: string + /** 附加数据 JSON(如推荐岗位列表等) */ + extra: string + /** 创建时间 */ + createTime: InstantTime +} + +/** + * 查询当前 Agent 对话消息列表 + * GET /job-agent/chat/messages?limit=xxx + * @param limit 查询条数 + */ +export function fetchAgentChatMessages(limit: number = 50) { + return request.get>('/job-agent/chat/messages', { + params: { limit }, + }) +} + +/** 添加对话消息请求参数 */ +export interface AddChatMessageParams { + /** 消息类型:user / assistant / recommend / apply_progress */ + type: string + /** 文本内容 */ + content?: string + /** 附加数据 JSON */ + extra?: string +} + +/** + * 添加 Agent 对话消息 + * POST /job-agent/chat/message + */ +export function addAgentChatMessage(params: AddChatMessageParams) { + return request.post('/job-agent/chat/message', params) +} + +// ==================== 批量查询岗位投递记录 ==================== + +/** 岗位投递记录项 */ +export interface JobApplyRecord { + /** 岗位 ID */ + jobId: number + /** 投递状态:-1=待投递 0=已投递 1=面试中 2=有Offer 3=未通过 4=已结束 */ + status: number + /** 投递时间 */ + applyTime: InstantTime + /** 创建时间 */ + createTime: InstantTime +} + +/** + * 根据岗位 ID 批量查询投递记录 + * POST /job/apply/listByJobIds + * @param jobIds 岗位 ID 列表 + */ +export function fetchApplyByJobIds(jobIds: number[]) { + return request.post>('/job/apply/listByJobIds', jobIds) +} + +// ==================== Agent AI 对话(Python 后端) ==================== + +import aiService from '@/utils/aiRequest' +import type { AiResult } from '@/utils/aiRequest' + +/** AI 对话历史消息项 */ +export interface AgentChatHistoryItem { + /** 角色:user / assistant */ + role: string + /** 消息内容 */ + content: string +} + +/** Agent AI 对话请求参数 */ +export interface AgentChatParams { + /** 用户输入的消息 */ + message: string + /** 简历 ID(字符串,避免大整数精度丢失) */ + resumeId: string + /** 对话历史 */ + history?: AgentChatHistoryItem[] + /** 意向岗位类型名称 */ + jobCategories?: string[] + /** 意向城市名称 */ + regions?: string[] + /** 意向行业名称 */ + industries?: string[] +} + +/** Agent AI 对话返回数据 */ +export interface AgentChatResponse { + /** AI 回复的消息内容 */ + message: string + /** 工具调用名称(null=普通回复,recommend=推荐岗位) */ + tool: string | null + /** 工具调用参数 */ + toolParams: Record | null +} + +/** + * Agent AI 对话(Python 后端) + * POST /job-agent/chat + */ +export function sendAgentChat(params: AgentChatParams) { + return aiService.post }>('/job-agent/chat', params).then(res => res.data) +} diff --git a/src/api/jobs.ts b/src/api/jobs.ts index 66a0ff7..e696a01 100644 --- a/src/api/jobs.ts +++ b/src/api/jobs.ts @@ -488,9 +488,11 @@ export interface CustomizeResumeData { /** * 查询定制简历结果(AI 接口) * GET /job/customize-resume + * @param jobId 岗位ID(必需) */ -export function fetchCustomizeResume() { +export function fetchCustomizeResume(jobId: string) { return aiService.get }>('/job/customize-resume', { + params: { job_id: jobId }, transformResponse: [(data: string) => { try { const processed = data.replace(/:\s*(\d{16,})/g, ':"$1"') @@ -585,8 +587,9 @@ export function aiEditResume(params: AiEditResumeParams) { * 撤销AI对话编辑简历的修改(AI 接口) * POST /job/customize-resume/rollback */ -export function rollbackCustomizeResume() { +export function rollbackCustomizeResume(jobId: string) { return aiService.post }>('/job/customize-resume/rollback', null, { + params: { job_id: jobId }, transformResponse: [(data: string) => { try { const processed = data.replace(/:\s*(\d{16,})/g, ':"$1"') @@ -604,8 +607,9 @@ export function rollbackCustomizeResume() { * 输入框失焦或选择器选中后自动调用 * @param data 定制简历完整数据 */ -export function updateCustomizeResume(data: CustomizeResumeData) { +export function updateCustomizeResume(data: CustomizeResumeData,jobId: string) { return aiService.put }>('/job/customize-resume', data, { + params: { job_id: jobId }, transformResponse: [(raw: string) => { try { const processed = raw.replace(/:\s*(\d{16,})/g, ':"$1"') diff --git a/src/api/resume.ts b/src/api/resume.ts index 2d5d950..0a22f5c 100644 --- a/src/api/resume.ts +++ b/src/api/resume.ts @@ -23,10 +23,10 @@ export interface ResumeListItem { targetPosition?: string /** 是否默认简历 0=否 1=是 */ isDefault?: number - /** 简历修改时间 */ - updateTime?: InstantTime - /** 简历创建时间 */ - createTime?: InstantTime + /** 简历修改时间(毫秒时间戳) */ + updateTime?: number + /** 简历创建时间(毫秒时间戳) */ + createTime?: number } /** @@ -275,6 +275,8 @@ export function saveResumeMain(data: SaveResumeMainParams) { /** 保存简历教育经历参数(单条) */ export interface SaveResumeEducationItem { + /** 记录ID(编辑时必传) */ + id?: string | number /** 学校名称 */ school?: string /** 专业 */ @@ -292,15 +294,45 @@ export interface SaveResumeEducationItem { } /** - * 保存简历教育经历(全量覆盖) + * 保存简历教育经历(全量覆盖)— 旧接口,保留兼容 * POST /resume/education */ export function saveResumeEducation(resumeId: string, data: SaveResumeEducationItem[]) { return request.post('/resume/education', { resumeId, items: data }) } +/** + * 添加单条教育经历,返回新记录ID + * POST /resume/education/add + */ +export function addResumeEducation(resumeId: string, data: SaveResumeEducationItem) { + return request.post>('/resume/education/add', data, { + params: { resumeId }, + }) +} + +/** + * 根据ID编辑单条教育经历 + * POST /resume/education/update + */ +export function updateResumeEducation(data: SaveResumeEducationItem) { + return request.post('/resume/education/update', data) +} + +/** + * 根据ID删除单条教育经历 + * POST /resume/education/delete + */ +export function deleteResumeEducation(id: string) { + return request.post('/resume/education/delete', null, { + params: { id }, + }) +} + /** 保存简历工作经历参数(单条) */ export interface SaveResumeWorkItem { + /** 记录ID(编辑时必传) */ + id?: string | number /** 公司名称 */ companyName?: string /** 职位 */ @@ -314,7 +346,7 @@ export interface SaveResumeWorkItem { } /** - * 保存简历工作经历(全量覆盖) + * 保存简历工作经历(全量覆盖)— 旧接口,保留兼容 * POST /resume/work */ export function saveResumeWork(resumeId: string, data: SaveResumeWorkItem[]) { @@ -322,15 +354,73 @@ export function saveResumeWork(resumeId: string, data: SaveResumeWorkItem[]) { } /** - * 保存简历实习经历(全量覆盖) + * 添加单条工作经历,返回新记录ID + * POST /resume/work/add + */ +export function addResumeWork(resumeId: string, data: SaveResumeWorkItem) { + return request.post>('/resume/work/add', data, { + params: { resumeId }, + }) +} + +/** + * 根据ID编辑单条工作经历 + * POST /resume/work/update + */ +export function updateResumeWork(data: SaveResumeWorkItem) { + return request.post('/resume/work/update', data) +} + +/** + * 根据ID删除单条工作经历 + * POST /resume/work/delete + */ +export function deleteResumeWork(id: string) { + return request.post('/resume/work/delete', null, { + params: { id }, + }) +} + +/** + * 保存简历实习经历(全量覆盖)— 旧接口,保留兼容 * POST /resume/internship */ export function saveResumeInternship(resumeId: string, data: SaveResumeWorkItem[]) { return request.post('/resume/internship', { resumeId, items: data }) } +/** + * 添加单条实习经历,返回新记录ID + * POST /resume/internship/add + */ +export function addResumeInternship(resumeId: string, data: SaveResumeWorkItem) { + return request.post>('/resume/internship/add', data, { + params: { resumeId }, + }) +} + +/** + * 根据ID编辑单条实习经历 + * POST /resume/internship/update + */ +export function updateResumeInternship(data: SaveResumeWorkItem) { + return request.post('/resume/internship/update', data) +} + +/** + * 根据ID删除单条实习经历 + * POST /resume/internship/delete + */ +export function deleteResumeInternship(id: string) { + return request.post('/resume/internship/delete', null, { + params: { id }, + }) +} + /** 保存简历项目经历参数(单条) */ export interface SaveResumeProjectItem { + /** 记录ID(编辑时必传) */ + id?: string | number /** 项目名称 */ projectName?: string /** 所属公司 */ @@ -346,15 +436,45 @@ export interface SaveResumeProjectItem { } /** - * 保存简历项目经历(全量覆盖) + * 保存简历项目经历(全量覆盖)— 旧接口,保留兼容 * POST /resume/project */ export function saveResumeProject(resumeId: string, data: SaveResumeProjectItem[]) { return request.post('/resume/project', { resumeId, items: data }) } +/** + * 添加单条项目经历,返回新记录ID + * POST /resume/project/add + */ +export function addResumeProject(resumeId: string, data: SaveResumeProjectItem) { + return request.post>('/resume/project/add', data, { + params: { resumeId }, + }) +} + +/** + * 根据ID编辑单条项目经历 + * POST /resume/project/update + */ +export function updateResumeProject(data: SaveResumeProjectItem) { + return request.post('/resume/project/update', data) +} + +/** + * 根据ID删除单条项目经历 + * POST /resume/project/delete + */ +export function deleteResumeProject(id: string) { + return request.post('/resume/project/delete', null, { + params: { id }, + }) +} + /** 保存简历竞赛经历参数(单条) */ export interface SaveResumeCompetitionItem { + /** 记录ID(编辑时必传) */ + id?: string | number /** 竞赛名称 */ competitionName?: string /** 获奖情况 */ @@ -366,13 +486,41 @@ export interface SaveResumeCompetitionItem { } /** - * 保存简历竞赛经历(全量覆盖) + * 保存简历竞赛经历(全量覆盖)— 旧接口,保留兼容 * POST /resume/competition */ export function saveResumeCompetition(resumeId: string, data: SaveResumeCompetitionItem[]) { return request.post('/resume/competition', { resumeId, items: data }) } +/** + * 添加单条竞赛经历,返回新记录ID + * POST /resume/competition/add + */ +export function addResumeCompetition(resumeId: string, data: SaveResumeCompetitionItem) { + return request.post>('/resume/competition/add', data, { + params: { resumeId }, + }) +} + +/** + * 根据ID编辑单条竞赛经历 + * POST /resume/competition/update + */ +export function updateResumeCompetition(data: SaveResumeCompetitionItem) { + return request.post('/resume/competition/update', data) +} + +/** + * 根据ID删除单条竞赛经历 + * POST /resume/competition/delete + */ +export function deleteResumeCompetition(id: string) { + return request.post('/resume/competition/delete', null, { + params: { id }, + }) +} + /** * 删除简历 * POST /resume/delete diff --git a/src/assets/images/插件操作界面.png b/src/assets/images/插件操作界面.png new file mode 100644 index 0000000000000000000000000000000000000000..7a69c33d638118e54069bb93d7f340100501e0b4 GIT binary patch literal 60403 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�mg=JuK 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 L>gTe~DWM4fA6{Bh literal 0 HcmV?d00001 diff --git a/src/assets/styles/components/agent-chat-job-list.scss b/src/assets/styles/components/agent-chat-job-list.scss new file mode 100644 index 0000000..9d3cf0e --- /dev/null +++ b/src/assets/styles/components/agent-chat-job-list.scss @@ -0,0 +1,160 @@ +@use '../variables' as *; + +// ==================== Agent会话岗位列表组件样式 ==================== +.agent-chat-job-list { + background: $bg-middle; + border-radius: 0.12rem; + padding: 0.2rem; + margin-top: 0.16rem; + + // 推荐说明文字 + &__summary { + font-size: 0.13rem; + color: $text-dark; + font-weight: 500; + margin-bottom: 0.14rem; + line-height: 1.6; + } + + // 单个岗位项 + &__item { + display: flex; + align-items: center; + justify-content: space-between; + background: $bg-white; + border-radius: 0.1rem; + padding: 0.14rem 0.16rem; + margin-bottom: 0.08rem; + + &:last-of-type { + margin-bottom: 0; + } + } + + // 左侧信息区域 + &__info { + display: flex; + align-items: center; + gap: 0.12rem; + flex: 1; + min-width: 0; + } + + // 公司 Logo + &__logo { + width: 0.36rem; + height: 0.36rem; + border-radius: 0.06rem; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $text-middle; + overflow: hidden; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + svg { + width: 0.2rem; + height: 0.2rem; + } + } + + // 岗位详情 + &__detail { + min-width: 0; + } + + // 公司名称 + &__company { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + line-height: 1.4; + } + + // 岗位名称 + &__title { + font-size: 0.12rem; + color: $text-middle; + line-height: 1.4; + margin-bottom: 0.04rem; + } + + // 标签行 + &__tags { + display: flex; + gap: 0.06rem; + flex-wrap: wrap; + } + + // 单个标签 + &__tag { + font-size: 0.11rem; + color: $text-middle; + background: $bg-main; + padding: 0.02rem 0.08rem; + border-radius: 0.03rem; + } + + // 匹配度环形容器 + &__score { + position: relative; + width: 0.44rem; + height: 0.44rem; + flex-shrink: 0; + margin-left: 0.12rem; + } + + // 环形 SVG + &__ring { + width: 100%; + height: 100%; + } + + // 匹配度数字 + &__score-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.11rem; + font-weight: 600; + color: $text-dark; + } + + // 底部按钮区域 + &__footer { + display: flex; + justify-content: center; + margin-top: 0.14rem; + } + + // 查看全部岗位按钮 + &__view-all-btn { + height: 0.38rem; + padding: 0 0.32rem; + background: $btn-dark; + color: $bg-white; + border: none; + border-radius: 0.19rem; + font-size: 0.13rem; + font-weight: 500; + cursor: pointer; + transition: all 0.25s ease; + line-height: 0.38rem; + + &:hover { + background: $btn-dark-hover; + } + + &:active { + transform: scale(0.98); + } + } +} diff --git a/src/assets/styles/components/agent-match-job-add.scss b/src/assets/styles/components/agent-match-job-add.scss new file mode 100644 index 0000000..a1e29f5 --- /dev/null +++ b/src/assets/styles/components/agent-match-job-add.scss @@ -0,0 +1,269 @@ +@use '../variables' as *; + +// ==================== Agent匹配岗位添加组件样式 ==================== +.agent-match-job-add { + background: $bg-white; + border-radius: 0.12rem; + height: 100%; + display: flex; + flex-direction: column; + + // 顶部标题栏 + &__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.18rem 0.2rem; + border-bottom: 1px solid $border-color; + flex-shrink: 0; + } + + // 标题文字 + &__title { + font-size: 0.16rem; + font-weight: 700; + color: $text-dark; + } + + // 右侧操作区 + &__actions { + display: flex; + align-items: center; + gap: 0.1rem; + } + + // 全部添加按钮 + &__add-all-btn { + height: 0.32rem; + padding: 0 0.16rem; + background: $bg-white; + color: $text-dark; + border: 1px solid $border-color; + border-radius: 0.16rem; + font-size: 0.12rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + line-height: 0.3rem; + + &:hover { + border-color: $text-dark; + } + } + + // 关闭按钮 + &__close-btn { + width: 0.28rem; + height: 0.28rem; + border: none; + background: transparent; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + + svg { + width: 0.24rem; + height: 0.24rem; + } + } + + // 岗位列表容器(可滚动) + &__list { + flex: 1; + overflow-y: auto; + padding: 0.12rem 0.2rem; + + // 自定义滚动条 + &::-webkit-scrollbar { + width: 4px; + } + + &::-webkit-scrollbar-thumb { + background: $border-color; + border-radius: 2px; + } + + &::-webkit-scrollbar-track { + background: transparent; + } + } + + // 单个岗位项 + &__item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.14rem 0; + border-bottom: 1px solid $border-color; + + &:last-child { + border-bottom: none; + } + } + + // 左侧信息区域 + &__info { + display: flex; + align-items: center; + gap: 0.12rem; + flex: 1; + min-width: 0; + } + + // 公司 Logo + &__logo { + width: 0.36rem; + height: 0.36rem; + border-radius: 0.06rem; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $text-middle; + overflow: hidden; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + svg { + width: 0.2rem; + height: 0.2rem; + } + } + + // 岗位详情 + &__detail { + min-width: 0; + } + + // 公司名称 + &__company { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + line-height: 1.4; + } + + // 岗位名称 + &__position { + font-size: 0.12rem; + color: $text-middle; + line-height: 1.4; + margin-bottom: 0.04rem; + } + + // 标签行 + &__tags { + display: flex; + gap: 0.06rem; + flex-wrap: wrap; + } + + // 单个标签 + &__tag { + font-size: 0.11rem; + color: $text-middle; + background: $bg-main; + padding: 0.02rem 0.08rem; + border-radius: 0.03rem; + } + + // 右侧:匹配度 + 按钮 + &__right { + display: flex; + align-items: center; + gap: 0.12rem; + flex-shrink: 0; + } + + // 匹配度环形容器 + &__score { + position: relative; + width: 0.44rem; + height: 0.44rem; + flex-shrink: 0; + } + + // 环形 SVG + &__ring { + width: 100%; + height: 100%; + } + + // 匹配度数字 + &__score-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.11rem; + font-weight: 600; + color: $text-dark; + } + + // 添加/移除按钮 + &__action-btn { + height: 0.32rem; + padding: 0 0.16rem; + border-radius: 0.16rem; + font-size: 0.12rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + line-height: 0.3rem; + white-space: nowrap; + border: 1px solid $text-dark; + background: $bg-white; + color: $text-dark; + + &:hover { + background: $text-dark; + color: $bg-white; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + // 移除状态 — 深色背景 + &--remove { + background: $text-dark; + color: $bg-white; + border-color: $text-dark; + + &:hover { + opacity: 0.85; + } + } + } + + // 底部查看更多 + &__footer { + padding: 0.14rem 0.2rem; + border-top: 1px solid $border-color; + flex-shrink: 0; + text-align: center; + } + + // 查看更多按钮 + &__more-btn { + font-size: 0.12rem; + color: $text-middle; + background: transparent; + border: none; + cursor: pointer; + text-decoration: underline; + padding: 0; + + &:hover { + color: $text-dark; + } + } +} diff --git a/src/assets/styles/components/agent-settings-panel.scss b/src/assets/styles/components/agent-settings-panel.scss new file mode 100644 index 0000000..a5fb6a0 --- /dev/null +++ b/src/assets/styles/components/agent-settings-panel.scss @@ -0,0 +1,145 @@ +@use '../variables' as *; + +// ==================== Agent设置面板样式 ==================== +.agent-settings-panel { + // 表单分组 + &__group { + margin-bottom: 0.28rem; + + &:last-child { margin-bottom: 0; } + } + + // 分组标签 + &__label { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + margin-bottom: 0.14rem; + } + + // 提示图标 + &__tip { + color: $text-light; + cursor: pointer; + margin-left: 0.04rem; + font-size: 0.12rem; + } + + // 选项按钮行 + &__options { + display: flex; + gap: 0.12rem; + } + + // 单个选项按钮 + &__option { + padding: 0.08rem 0.2rem; + border: 1px solid $border-color; + border-radius: 0.06rem; + background: $bg-white; + color: $text-dark; + font-size: 0.13rem; + cursor: pointer; + transition: all 0.2s ease; + line-height: 1.4; + + &:hover { + border-color: $accent; + } + + // 大号选项(Agent模式、投递目标) + &--lg { + flex: 1; + text-align: center; + padding: 0.14rem 0.16rem; + font-size: 0.14rem; + font-weight: 500; + border-radius: 0.08rem; + } + + // 选中态 + &--active { + background: $bg-main; + border-color: $text-dark; + font-weight: 600; + } + } + + // 子标签 + &__sub-label { + font-size: 0.13rem; + color: $text-middle; + margin-bottom: 0.1rem; + } + + // 简历选择行 + &__resume-select { + display: flex; + align-items: center; + gap: 0.08rem; + background: $bg-main; + border-radius: 0.08rem; + padding: 0.06rem 0.12rem; + margin-bottom: 0.16rem; + } + + // 简历图标 + &__resume-icon { + width: 0.18rem; + height: 0.18rem; + flex-shrink: 0; + color: $text-middle; + + svg { + width: 100%; + height: 100%; + } + } + + // 下拉选择器样式覆盖 + &__select { + flex: 1; + + :deep(.el-input__wrapper) { + box-shadow: none; + background: transparent; + border: none; + padding: 0; + + &:hover, + &.is-focus { + box-shadow: none; + } + } + + :deep(.el-input__inner) { + font-size: 0.13rem; + color: $text-dark; + } + + :deep(.el-input__suffix) { + color: $text-light; + } + } + + // 开关行 + &__switch-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.12rem; + } + + // 开关文字 + &__switch-text { + font-size: 0.13rem; + color: $text-dark; + line-height: 1.5; + } + + // 开关副文字 + &__switch-sub { + font-size: 0.12rem; + color: $text-light; + } +} diff --git a/src/assets/styles/components/ai-chat.scss b/src/assets/styles/components/ai-chat.scss index ee7a77b..643b9c1 100644 --- a/src/assets/styles/components/ai-chat.scss +++ b/src/assets/styles/components/ai-chat.scss @@ -102,7 +102,7 @@ } &__msg--user &__msg-bubble { - background: #f0f3f6; + background: #fff; color: #1a1a2e; } @@ -123,7 +123,7 @@ flex-direction: column; gap: 0.08rem; margin-top: 0.12rem; - padding-right: 0.5rem; + margin-bottom: 0.12rem; } &__quick-item { @@ -135,11 +135,24 @@ font-size: 0.12rem; cursor: pointer; transition: background 0.2s; + max-width: 80%; &:hover { background: #f9fafb; color: #374151; } + + /* AI 提问靠左 */ + &--ai { + align-self: flex-start; + } + + /* 用户提问靠右 */ + &--user { + align-self: flex-end; + background: #f0f3f6; + border-color: #e0e3e6; + } } &__input-area { diff --git a/src/assets/styles/components/ai-thinking-indicator.scss b/src/assets/styles/components/ai-thinking-indicator.scss new file mode 100644 index 0000000..9523ae2 --- /dev/null +++ b/src/assets/styles/components/ai-thinking-indicator.scss @@ -0,0 +1,25 @@ +@use '../variables' as *; + +.ai-thinking-indicator { + display: flex; + justify-content: flex-start; + margin-bottom: 0.12rem; + + &__bubble { + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 0.1rem; + padding: 0.12rem 0.14rem; + font-size: 0.13rem; + color: $text-middle; + font-style: italic; + display: flex; + align-items: center; + gap: 0.06rem; + } + + &__icon { + color: $accent; + font-size: 0.16rem; + } +} diff --git a/src/assets/styles/components/job-resume-custom-dialog.scss b/src/assets/styles/components/job-resume-custom-dialog.scss index 14d6728..10ca4b1 100644 --- a/src/assets/styles/components/job-resume-custom-dialog.scss +++ b/src/assets/styles/components/job-resume-custom-dialog.scss @@ -690,7 +690,7 @@ &__drawer { position: relative; background: $bg-white; - width: 9.4rem; + width: 10.4rem; height: 100vh; box-sizing: border-box; display: flex; @@ -753,7 +753,6 @@ // ==================== 步骤四:预览布局 ==================== &__preview { display: flex; - gap: 0.2rem; height: 100%; min-height: 0; } @@ -763,8 +762,7 @@ flex: 1; overflow-y: auto; background: $bg-white; - border: 1px solid $border-color; - border-radius: 0.08rem; + border-bottom: 1px solid $border-color; min-width: 0; } @@ -814,6 +812,7 @@ flex-direction: column; min-height: 0; overflow: hidden; + border-bottom: 0.01rem solid $border-color; } // AI优化结果卡片 @@ -953,6 +952,15 @@ &__ai-msg-bubble--loading { color: $text-middle; font-style: italic; + display: flex; + align-items: center; + gap: 0.06rem; + } + + // AI思考中的转圈加载图标 + &__ai-loading-icon { + color: $accent; + font-size: 0.16rem; } // 消息包裹容器(含撤销气泡) diff --git a/src/assets/styles/components/job-resume-template.scss b/src/assets/styles/components/job-resume-template.scss index 74890ef..129b651 100644 --- a/src/assets/styles/components/job-resume-template.scss +++ b/src/assets/styles/components/job-resume-template.scss @@ -54,6 +54,8 @@ margin-top: 16px; margin-bottom: 2px; line-height: 1.3; + break-after: avoid; + page-break-after: avoid; } // 分割线 @@ -80,6 +82,8 @@ align-items: flex-start; justify-content: space-between; margin-bottom: 4px; + break-inside: avoid; + page-break-inside: avoid; } &__item-left { @@ -130,6 +134,8 @@ font-size: 12px; line-height: 1.7; color: $text-dark; + break-inside: avoid; + page-break-inside: avoid; } } diff --git a/src/assets/styles/components/resume-edit-name-dialog.scss b/src/assets/styles/components/resume-edit-name-dialog.scss new file mode 100644 index 0000000..aba0989 --- /dev/null +++ b/src/assets/styles/components/resume-edit-name-dialog.scss @@ -0,0 +1,99 @@ +@use '../variables' as *; + +/* 编辑简历名称弹窗样式 */ +.resume-edit-name-dialog { + .el-dialog__header { + padding: 0.2rem 0.2rem 0; + } + + .el-dialog__body { + padding: 0 0.3rem 0.3rem; + } + + &__body { + display: flex; + flex-wrap: wrap; + gap: 0.24rem; + } + + /* 表单字段 */ + &__field { + width: 100%; + } + + /* 标签 */ + &__label { + display: block; + font-size: 0.16rem; + font-weight: 600; + color: $text-dark; + margin-bottom: 0.12rem; + } + + /* 必填星号 */ + &__required { + color: $danger; + margin-right: 0.04rem; + } + + /* 输入框 */ + &__input { + .el-input__wrapper { + border-radius: 0.1rem; + padding: 0.04rem 0.14rem; + box-shadow: 0 0 0 1px $border-color; + } + + .el-input__inner { + font-size: 0.14rem; + color: $text-dark; + height: 0.36rem; + line-height: normal; + + &::placeholder { + color: $text-light; + } + } + } + + /* 底部按钮区域 */ + &__footer { + width: 100%; + display: flex; + gap: 0.16rem; + margin-top: 0.08rem; + } + + /* 按钮通用 */ + &__btn { + flex: 1; + height: 0.46rem; + border-radius: 0.23rem; + font-size: 0.15rem; + font-weight: 500; + cursor: pointer; + border: none; + transition: opacity 0.2s; + + &:active { + opacity: 0.8; + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + /* 取消按钮 */ + &--cancel { + background: $bg-main; + color: $text-dark; + } + + /* 保存按钮 */ + &--save { + background: $accent; + color: $bg-white; + } + } +} diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index f8345c7..6f42834 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -27,6 +27,10 @@ @use './components/job-resume-custom-edit-panel.scss'; @use './components/resume-analysis-report-drawer.scss'; @use './components/resume-issue-fix-drawer.scss'; +@use './components/resume-edit-name-dialog.scss'; +@use './components/agent-chat-job-list.scss'; +@use './components/agent-match-job-add.scss'; +@use './components/ai-thinking-indicator.scss'; // 全局样式(优先级最高) @use './auto.scss'; diff --git a/src/assets/styles/pages/agent.scss b/src/assets/styles/pages/agent.scss index f866feb..ff5ef7c 100644 --- a/src/assets/styles/pages/agent.scss +++ b/src/assets/styles/pages/agent.scss @@ -1,10 +1,11 @@ +@use 'sass:color'; @use '../variables' as *; // ==================== 求职助手页面样式 ==================== .agent-page { min-height: 100vh; background: $bg-main; - + font-size: 0.14rem; // 主内容区域(左侧导航栏右边的部分) &__content { margin-left: 2rem; @@ -35,13 +36,13 @@ transition: all 0.25s ease; user-select: none; - // 激活态 — 深色背景白色文字 + // 激活态 — 品牌色背景白色文字 &--active { - background: $text-dark; + background: $btn-dark; .agent-page__step-number { background: $bg-white; - color: $text-dark; + color: $btn-dark; } .agent-page__step-label { @@ -117,14 +118,14 @@ &__intro-header { display: flex; align-items: flex-start; - gap: 0.12rem; + gap: 0.02rem; margin-bottom: 0.2rem; } // 用户图标 &__intro-icon { - width: 0.28rem; - height: 0.28rem; + width: 0.20rem; + height: 0.20rem; flex-shrink: 0; color: $text-dark; margin-top: 0.02rem; @@ -150,7 +151,6 @@ color: $text-light; line-height: 1.7; margin-bottom: 0.28rem; - padding-left: 0.4rem; } // 导入个人资料行 @@ -162,7 +162,6 @@ background: $bg-main; border-radius: 0.08rem; margin-bottom: 0.28rem; - margin-left: 0.4rem; } // 导入图标 @@ -190,8 +189,7 @@ display: block; width: 2rem; height: 0.42rem; - margin-left: 0.4rem; - background: $text-dark; + background: $btn-dark; color: $bg-white; border: none; border-radius: 0.21rem; @@ -245,4 +243,827 @@ padding-bottom: 0.12rem; border-bottom: 1px solid $border-color; } + + // ==================== 第2步:确认目标 ==================== + + // 第2步整体容器 + &__step2 { + width: 100%; + max-width: 7rem; + margin: 0 auto; + } + + // 对话区域 + &__chat { + display: flex; + flex-direction: column; + gap: 0.2rem; + } + + // 对话行:头像 + 文字 + &__chat-row { + display: flex; + align-items: flex-start; + gap: 0.04rem; + } + + // 对话头像 + &__chat-avatar { + width: 0.32rem; + height: 0.32rem; + border-radius: 50%; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $text-middle; + + svg { + width: 0.18rem; + height: 0.18rem; + } + } + + // 对话文字 + &__chat-text { + font-size: 0.15rem; + font-weight: 600; + color: $text-dark; + line-height: 0.32rem; + } + + // 正在输入指示器 + &__chat-typing { + display: flex; + align-items: center; + gap: 0.05rem; + background: $bg-main; + border-radius: 0.16rem; + padding: 0.1rem 0.06rem; + + span { + width: 0.06rem; + height: 0.06rem; + border-radius: 50%; + background: $text-light; + animation: typingDot 1.4s infinite; + + &:nth-child(2) { animation-delay: 0.2s; } + &:nth-child(3) { animation-delay: 0.4s; } + } + } + + @keyframes typingDot { + 0%, 60%, 100% { opacity: 0.3; transform: scale(1); } + 30% { opacity: 1; transform: scale(1.2); } + } + + // ==================== 求职偏好卡片 ==================== + &__pref-card { + background: $bg-main; + border-radius: 0.12rem; + padding: 0.24rem; + } + + &__pref-desc { + font-size: 0.13rem; + color: $text-middle; + margin-bottom: 0.16rem; + line-height: 1.5; + } + + &__pref-tags { + display: flex; + flex-wrap: wrap; + gap: 0.08rem; + margin-bottom: 0.24rem; + } + + &__pref-tag { + padding: 0.06rem 0.16rem; + background: $bg-white; + border-radius: 0.04rem; + font-size: 0.13rem; + color: $text-dark; + } + + &__pref-actions { + display: flex; + gap: 0.12rem; + } + + &__pref-btn { + flex: 1; + height: 0.42rem; + border-radius: 0.21rem; + font-size: 0.14rem; + font-weight: 500; + cursor: pointer; + transition: all 0.25s ease; + border: none; + line-height: 0.42rem; + text-align: center; + padding: 0; + + &--edit { + background: $border-color; + color: $text-dark; + + &:hover { background: color.adjust($border-color, $lightness: -5%); } + } + + &--confirm { + background: $btn-dark; + color: $bg-white; + + &:hover { background: $btn-dark-hover; } + } + } + + // ==================== 匹配岗位卡片 ==================== + &__match-card { + background: $bg-main; + border-radius: 0.12rem; + padding: 0.24rem; + + } + + &__match-desc { + font-size: 0.13rem; + color: $text-dark; + font-weight: 500; + margin-bottom: 0.16rem; + line-height: 1.6; + } + + // 单个岗位项 + &__match-item { + display: flex; + align-items: center; + background: $bg-white; + border-radius: 0.1rem; + padding: 0.16rem; + margin-bottom: 0.1rem; + + &:last-of-type { margin-bottom: 0; } + } + + &__match-info { + display: flex; + align-items: center; + gap: 0.12rem; + flex: 1; + min-width: 0; + } + + // 公司图标 + &__match-icon { + width: 0.36rem; + height: 0.36rem; + border-radius: 0.06rem; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $text-middle; + + svg { + width: 0.2rem; + height: 0.2rem; + } + } + + &__match-detail { + min-width: 0; + } + + &__match-company { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + line-height: 1.4; + } + + &__match-position { + font-size: 0.12rem; + color: $text-middle; + line-height: 1.4; + margin-bottom: 0.06rem; + } + + &__match-tags { + display: flex; + gap: 0.06rem; + flex-wrap: wrap; + } + + &__match-tag { + font-size: 0.11rem; + color: $text-middle; + background: $bg-main; + padding: 0.02rem 0.08rem; + border-radius: 0.03rem; + } + + // 匹配度环形 + &__match-score { + position: relative; + width: 0.44rem; + height: 0.44rem; + flex-shrink: 0; + margin: 0 0.16rem; + } + + &__match-ring { + width: 100%; + height: 100%; + } + + &__match-score-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.11rem; + font-weight: 600; + color: $text-dark; + } + + // 点赞/踩按钮 + &__match-feedback { + display: flex; + flex-direction: column; + gap: 0.06rem; + flex-shrink: 0; + } + + &__match-fb-btn { + width: 0.3rem; + height: 0.3rem; + border: none; + background: transparent; + border-radius: 0.06rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: $text-light; + transition: all 0.2s ease; + padding: 0; + + svg { + width: 0.18rem; + height: 0.18rem; + } + + &:hover { color: $text-middle; } + + &--active { + color: $text-dark; + } + } + + // 不满意反馈输入框 + &__dislike-input { + margin-top: 0.12rem; + + input { + width: 100%; + height: 0.4rem; + border: 1px solid $border-color; + border-radius: 0.08rem; + padding: 0 0.14rem; + font-size: 0.13rem; + color: $text-dark; + background: $bg-white; + outline: none; + box-sizing: border-box; + + &::placeholder { color: $text-light; } + &:focus { border-color: $text-middle; } + } + } + + // 底部优化按钮 + &__step2-footer { + display: flex; + justify-content: center; + margin-top: 0.08rem; + } + + &__optimize-btn { + height: 0.44rem; + padding: 0 0.4rem; + background: $btn-dark; + color: $bg-white; + border: none; + border-radius: 0.22rem; + font-size: 0.14rem; + font-weight: 500; + cursor: pointer; + transition: all 0.25s ease; + line-height: 0.44rem; + + &:hover { background: $btn-dark-hover; } + &:active { transform: scale(0.98); } + } + + // ==================== 第3步:网申常见问题 ==================== + + // 第3步整体容器 — 左右两栏布局 + &__step3 { + display: flex; + gap: 0.24rem; + align-items: flex-start; + width: 100%; + } + + // 右侧表单包裹 + &__form-wrapper { + background: $bg-white; + border-radius: 0.12rem; + padding: 0.28rem; + border: 1px solid $border-color; + } + + // 表单标题 + &__form-title { + font-size: 0.15rem; + font-weight: 700; + color: $text-dark; + margin-bottom: 0.24rem; + padding-bottom: 0.12rem; + border-bottom: 1px solid $border-color; + } + + // 表单分组 + &__form-group { + margin-bottom: 0.28rem; + + &:last-child { margin-bottom: 0; } + } + + // 表单标签 + &__form-label { + font-size: 0.14rem; + font-weight: 600; + color: $text-dark; + margin-bottom: 0.12rem; + text-align: center; + } + + // 选项按钮行 + &__form-options { + display: flex; + justify-content: center; + gap: 0.12rem; + } + + // 单个选项按钮 + &__form-option { + padding: 0.08rem 0.24rem; + border: 1px solid $border-color; + border-radius: 0.06rem; + background: $bg-white; + color: $text-dark; + font-size: 0.13rem; + cursor: pointer; + transition: all 0.2s ease; + line-height: 1.4; + + &:hover { + border-color: $text-middle; + } + + // 选中态 + &--active { + background: $btn-dark; + color: $bg-white; + border-color: $btn-dark; + } + } + + // 下拉选择器行 + &__form-selects { + display: flex; + justify-content: center; + gap: 0.12rem; + } + + // 统一下拉选择器样式覆盖 + &__form-select { + width: 1.4rem; + + // 覆盖 Element Plus 选择器样式以匹配页面风格 + :deep(.el-input__wrapper) { + border-radius: 0.2rem; + box-shadow: none; + border: 1px solid $border-color; + padding: 0.02rem 0.12rem; + background: $bg-white; + transition: border-color 0.2s ease; + + &:hover, + &.is-focus { + border-color: $accent; + box-shadow: none; + } + } + + :deep(.el-input__inner) { + font-size: 0.13rem; + color: $text-dark; + text-align: center; + + &::placeholder { + color: $text-light; + } + } + + :deep(.el-input__suffix) { + color: $text-light; + } + } + + // ==================== 第3步下半部分:插件安装 ==================== + + // 安装步骤说明文字 + &__install-steps { + font-size: 0.13rem; + color: $text-middle; + line-height: 1.8; + margin-bottom: 0.28rem; + + p { margin: 0; } + } + + // 插件区域 + &__plugin-section { + text-align: center; + padding: 0.2rem 0; + } + + // 插件标题 + &__plugin-title { + font-size: 0.18rem; + font-weight: 700; + color: $text-dark; + margin-bottom: 0.24rem; + } + + // 浏览器按钮行 + &__browser-btns { + display: flex; + justify-content: center; + gap: 0.1rem; + flex-wrap: wrap; + } + + // 单个浏览器按钮 + &__browser-btn { + padding: 0.08rem 0.2rem; + border: 1px solid $border-color; + border-radius: 0.06rem; + background: $bg-white; + color: $text-dark; + font-size: 0.13rem; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + border-color: $accent; + color: $accent; + } + } + + // 指引图片幻灯片 + &__guide-slide { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + + img { + max-width: 100%; + max-height: 100%; + object-fit: contain; + border-radius: 0.08rem; + } + } + + // ==================== 设置完成页 ==================== + + // 完成页容器 — 居中布局 + &__complete { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 1rem 0; + } + + // 完成页占位图标 + &__complete-icon { + width: 1.2rem; + height: 1.2rem; + margin-bottom: 0.32rem; + + svg { + width: 100%; + height: 100%; + } + } + + // 完成页标题 + &__complete-title { + font-size: 0.2rem; + font-weight: 700; + color: $text-dark; + margin: 0 0 0.12rem; + } + + // 完成页描述 + &__complete-desc { + font-size: 0.14rem; + color: $text-middle; + margin-bottom: 0.4rem; + } + + // 启用按钮 + &__complete-btn { + padding: 0.12rem 0.36rem; + background: $btn-dark; + color: $bg-white; + border: none; + border-radius: 0.24rem; + font-size: 0.15rem; + font-weight: 500; + cursor: pointer; + transition: all 0.25s ease; + + &:hover { background: $btn-dark-hover; } + &:active { transform: scale(0.98); } + } +} + + +// ==================== 求职助手正式内容区域 ==================== +.agent-main { + height: 100%; + display: flex; + justify-content: center; + + // 有右侧面板时取消居中 + &--with-panel { + //justify-content: flex-start; + } + + // 左侧主区域 + &__left { + flex: 1; + height: calc(100vh - 0.6rem); + display: flex; + flex-direction: column; + max-width: 8rem; + } + + // 右侧匹配岗位面板 + &__right { + flex: 1; + height: calc(100vh - 0.6rem); + margin-left: 0.2rem; + max-width: 8rem; + } + + // ==================== 顶部固定设置栏 ==================== + &__top-bar { + display: flex; + align-items: center; + gap: 0.1rem; + padding: 0.12rem 0.16rem; + background: $bg-white; + border-radius: 0.1rem; + flex-shrink: 0; + margin-bottom: 0.16rem; + } + + // 用户头像 + &__avatar { + width: 0.3rem; + height: 0.3rem; + border-radius: 50%; + background: $bg-main; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: $text-middle; + + svg { + width: 0.18rem; + height: 0.18rem; + } + } + + // 状态标签 + &__status-tag { + font-size: 0.12rem; + color: $accent; + background: rgba(79, 194, 201, 0.1); + padding: 0.03rem 0.1rem; + border-radius: 0.04rem; + white-space: nowrap; + flex-shrink: 0; + } + + // 状态提示文字 + &__status-text { + font-size: 0.12rem; + color: $text-middle; + flex: 1; + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + // 开始按钮 + &__start-btn { + height: 0.3rem; + padding: 0 0.14rem; + background: $text-dark; + color: $bg-white; + border: none; + border-radius: 0.15rem; + font-size: 0.12rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + line-height: 0.3rem; + white-space: nowrap; + flex-shrink: 0; + + &:hover { + opacity: 0.85; + } + } + + // 右侧工具按钮区 + &__tools { + display: flex; + align-items: center; + gap: 0.06rem; + flex-shrink: 0; + } + + // 工具按钮 + &__tool-btn { + width: 0.28rem; + height: 0.28rem; + border: none; + background: transparent; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + color: $text-middle; + border-radius: 0.06rem; + transition: all 0.2s ease; + + svg { + width: 0.18rem; + height: 0.18rem; + } + + &:hover { + background: $bg-main; + color: $text-dark; + } + } + + // ==================== 中间聊天记录区域 ==================== + &__chat-area { + flex: 1; + overflow-y: auto; + padding: 0.16rem 0.1rem; + margin-bottom: 0.1rem; + + // 自定义滚动条 + &::-webkit-scrollbar { + width: 4px; + } + + &::-webkit-scrollbar-thumb { + background: $border-color; + border-radius: 2px; + } + + &::-webkit-scrollbar-track { + background: transparent; + } + } + + // ==================== 对话消息样式 ==================== + + // 对话行 + &__chat-row { + margin-bottom: 0.14rem; + + // 用户消息 — 右对齐 + &--user { + display: flex; + justify-content: flex-end; + } + } + + // 对话气泡 + &__chat-bubble { + display: inline-block; + max-width: 85%; + font-size: 0.14rem; + color: $text-dark; + line-height: 1.7; + padding: 0.1rem 0.16rem; + border-radius: 0.1rem; + background: $bg-white; + word-break: break-word; + + // 用户消息气泡 — 深色背景 + &--user { + background: $bg-main; + border: 1px solid $border-color; + } + + // AI 思考中的加载气泡 + &--loading { + color: $text-middle; + font-style: italic; + display: flex; + align-items: center; + gap: 0.06rem; + } + } + + // AI 思考中的转圈加载图标 + &__loading-icon { + color: $accent; + font-size: 0.16rem; + vertical-align: middle; + } + + // ==================== 底部固定输入框 ==================== + &__input-bar { + display: flex; + align-items: center; + gap: 0.1rem; + padding: 0.12rem 0.16rem; + background: $bg-white; + border-radius: 0.1rem; + border: 1px solid $border-color; + flex-shrink: 0; + } + + // 输入框 + &__input { + flex: 1; + border: none; + outline: none; + font-size: 0.13rem; + color: $text-dark; + background: transparent; + line-height: 0.3rem; + + &::placeholder { + color: $text-light; + } + } + + // 发送按钮 + &__send-btn { + width: 0.32rem; + height: 0.32rem; + border: none; + background: transparent; + cursor: pointer; + padding: 0; + display: flex; + align-items: center; + justify-content: center; + color: $text-dark; + flex-shrink: 0; + transition: all 0.2s ease; + + svg { + width: 0.2rem; + height: 0.2rem; + } + + &:hover { + color: $accent; + } + } } diff --git a/src/assets/styles/pages/resume-detail.scss b/src/assets/styles/pages/resume-detail.scss index 6c2158e..1472144 100644 --- a/src/assets/styles/pages/resume-detail.scss +++ b/src/assets/styles/pages/resume-detail.scss @@ -439,8 +439,9 @@ align-items: center; justify-content: flex-end; gap: 0.1rem; - margin-top: 0.18rem; - padding-top: 0.14rem; + margin-top: 0.10rem; + padding-bottom: 0.14rem; + } // 问题类型按钮组(三选一) diff --git a/src/assets/styles/pages/resume.scss b/src/assets/styles/pages/resume.scss index 2a2e0ec..c435a77 100644 --- a/src/assets/styles/pages/resume.scss +++ b/src/assets/styles/pages/resume.scss @@ -163,8 +163,8 @@ // 弹出菜单 &__popup { position: absolute; - right: 0.3rem; - top: 0.1rem; + right: 0.46rem; + top: 0.18rem; background: $bg-white; border: 1px solid $border-color; border-radius: 0.1rem; @@ -201,3 +201,58 @@ } } } + +// ==================== 导出简历弹窗样式修正 ==================== +.resume-export-dialog { + font-size: 0.14rem; + .el-dialog__title { + font-size: 16px; + font-weight: 600; + } + + .el-dialog__body { + padding: 0.2rem 0.3rem 0.1rem; + } + + /* 修正 radio 组件在 100px 基准下的尺寸 */ + &__radio-group { + display: flex; + gap: 0.16rem; + + .el-radio { + font-size: 14px; + height: auto; + line-height: normal; + + .el-radio__inner { + width: 14px; + height: 14px; + } + + .el-radio__label { + font-size: 14px; + padding-left: 8px; + } + } + } + + .el-dialog__footer { + padding: 0.12rem 0.3rem 0.24rem; + + .el-button { + font-size: 13px; + padding: 8px 20px; + border-radius: 6px; + } + + .el-button--primary { + background: $btn-dark; + border-color: $btn-dark; + + &:hover { + background: $btn-dark-hover; + border-color: $btn-dark-hover; + } + } + } +} diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index 5c36e4f..95a9207 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -11,6 +11,9 @@ $selected-color: #F6FCFC; // 页面主背景色 $bg-main: #F3F4F5; +// 页面中间色景色(用于页面主题色背景和白色背景分隔,用于某些模块组件的组件外层背景等) +$bg-middle: #E6E6E6; + // 白色背景(卡片、输入框等) $bg-white: #FFFFFF; diff --git a/src/components/AgentChatJobList.vue b/src/components/AgentChatJobList.vue new file mode 100644 index 0000000..92899f1 --- /dev/null +++ b/src/components/AgentChatJobList.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components/AgentMatchJobAdd.vue b/src/components/AgentMatchJobAdd.vue new file mode 100644 index 0000000..b05a55b --- /dev/null +++ b/src/components/AgentMatchJobAdd.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/components/AgentSettingsPanel.vue b/src/components/AgentSettingsPanel.vue new file mode 100644 index 0000000..b6ba9b0 --- /dev/null +++ b/src/components/AgentSettingsPanel.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/components/AgentSetupWizard.vue b/src/components/AgentSetupWizard.vue new file mode 100644 index 0000000..9a4cd6e --- /dev/null +++ b/src/components/AgentSetupWizard.vue @@ -0,0 +1,472 @@ + + + + + diff --git a/src/components/AiChat.vue b/src/components/AiChat.vue index 2baaff5..f02a90a 100644 --- a/src/components/AiChat.vue +++ b/src/components/AiChat.vue @@ -25,27 +25,30 @@ - -

-
{{ msg.content }}
-
- - -
+ +
{{ q }}
+ + +
+
+
+ + +
@@ -55,8 +58,9 @@ class="ai-chat__input" placeholder="搜索职位、公司或关键词..." @keyup.enter="sendMessage" + :disabled="aiLoading" /> - @@ -67,8 +71,26 @@ diff --git a/src/components/JobResumeCustomDialog.vue b/src/components/JobResumeCustomDialog.vue index 9c98fd1..e78e928 100644 --- a/src/components/JobResumeCustomDialog.vue +++ b/src/components/JobResumeCustomDialog.vue @@ -286,9 +286,7 @@ -
-
AI正在思考中...
-
+
@@ -307,7 +305,7 @@
- +
@@ -318,7 +316,7 @@ - - + @@ -299,6 +299,14 @@ const showFeedbackDialog = ref(false) /** 当前操作的职位 ID(用于提交问题反馈) */ const feedbackJobId = ref(null) +/** 当前问助手的岗位 ID(传给 AiChat 组件) */ +const currentAskJobId = ref('') + +/** 点击"问助手"按钮,传入岗位 ID 给 AiChat */ +function askAssistant(job: JobItem) { + currentAskJobId.value = job.id +} + // ==================== 收藏统计 ==================== /** 收藏总数(用于 Tab 标签显示) */ diff --git a/src/views/Resume.vue b/src/views/Resume.vue index a57a2e6..75452c0 100644 --- a/src/views/Resume.vue +++ b/src/views/Resume.vue @@ -73,15 +73,53 @@ + + + + + + + + PDF 简历 + Word 简历 + + + + + +
+ +