diff --git a/index.html b/index.html
index efdf799..f7a0fd3 100644
--- a/index.html
+++ b/index.html
@@ -7,6 +7,16 @@
Offer派 - 大学生AI求职平台 | 智能岗位匹配·一键自动网申·AI简历优化
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index 202d6ff..2b8d47c 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -172,4 +172,10 @@ router.beforeEach(async (to, _from, next) => {
next()
})
+// 友盟统计 - SPA 路由切换上报页面浏览(PV)
+router.afterEach((to) => {
+ const _czc = (window as any)._czc || []
+ _czc.push(['_trackPageview', to.fullPath, document.referrer])
+})
+
export default router
diff --git a/src/utils/channelBridge.ts b/src/utils/channelBridge.ts
index 7e48037..63817d4 100644
--- a/src/utils/channelBridge.ts
+++ b/src/utils/channelBridge.ts
@@ -45,7 +45,8 @@
* ------------------------------------------------------------
* | 数据名(name) | 中文名称 | 说明 |
* | ----------------------------- | -------------- | --------------------------------- |
- * | offerpieBrowserPlugUsage | 插件使用状态 | 标识插件正在运行 { usage: string } |
+ * * | offerpieBrowserPlugUsage | 插件使用状态 | 标识插件正在运行 { usage: string, version: string } |
+ * * | offerpaiDeliveryLinkList | 投递链接列表 | 记录要投递职位的来源链接,目前用于解决投递网站的重定向 { linkList: string[] },useCsl:true |
* ============================================================
*/
diff --git a/src/utils/resumeExport.ts b/src/utils/resumeExport.ts
index 31cd3de..3108e5e 100644
--- a/src/utils/resumeExport.ts
+++ b/src/utils/resumeExport.ts
@@ -102,7 +102,7 @@ export function exportResumeWord(element: HTMLElement, fileName: string) {
const blob = new Blob([fullHtml], { type: 'application/msword' })
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
- link.download = `${fileName}.doc`
+ link.download = `${fileName}.docx`
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
diff --git a/src/views/Agent.vue b/src/views/Agent.vue
index b4fc2dc..0873a0b 100644
--- a/src/views/Agent.vue
+++ b/src/views/Agent.vue
@@ -262,10 +262,17 @@ import { fetchResumeList } from '@/api/resume'
import { fetchMemberStatus } from '@/api/member'
import JobGoalDialog from '@/components/JobGoalDialog.vue'
+
// ==================== 路由 & Store ====================
const router = useRouter()
const store = useStore()
+// 声明友盟统计 _czc 对象
+const _czc: any[] = (window as any)._czc || [];
+(window as any)._czc = _czc;
+// 绑定 siteid,请用您的 siteid 替换下方 "XXXXXXXX" 部分
+_czc.push(["_setAccount", "1281490571"]);
+
// ==================== sessionStorage 缓存 key ====================
const STORAGE_KEY = 'agent_apply_progress_list'
const COMPLETED_STORAGE_KEY = 'agent_completed_apply_list'
diff --git a/src/views/Home.vue b/src/views/Home.vue
index 870e18b..9b01b45 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -506,6 +506,12 @@ const router = useRouter()
/** Vuex 状态管理实例 */
const store = useStore()
+// 声明友盟统计 _czc 对象
+const _czc: any[] = (window as any)._czc || [];
+(window as any)._czc = _czc;
+// 绑定 siteid,请用您的 siteid 替换下方 "XXXXXXXX" 部分
+_czc.push(["_setAccount", "1281490571"]);
+
/** 页面是否已向下滚动超过 20px — 用于导航栏背景切换 */
const isScrolled = ref(false)
diff --git a/src/views/HomeMobile.vue b/src/views/HomeMobile.vue
index 306120e..4a13261 100644
--- a/src/views/HomeMobile.vue
+++ b/src/views/HomeMobile.vue
@@ -173,6 +173,12 @@
import { ref } from 'vue'
import { getDailyJobCount } from '@/utils/dailyJobCount'
+// 声明友盟统计 _czc 对象
+const _czc: any[] = (window as any)._czc || [];
+(window as any)._czc = _czc;
+// 绑定 siteid,请用您的 siteid 替换下方 "XXXXXXXX" 部分
+_czc.push(["_setAccount", "1281490571"]);
+
/** 今日更新岗位数量 */
const dailyJobCount = getDailyJobCount()
diff --git a/src/views/JobDetail.vue b/src/views/JobDetail.vue
index b8fe595..9493626 100644
--- a/src/views/JobDetail.vue
+++ b/src/views/JobDetail.vue
@@ -200,15 +200,24 @@ import FullscreenLoading from '@/components/FullscreenLoading.vue'
import MemberDialog from '@/components/MemberDialog.vue'
import StepProgressOverlay from '@/components/StepProgressOverlay.vue'
import { fetchJobDetail, toggleJobFavorite, removeJobFavorite, fetchSkillGap } from '@/api/jobs'
-import { fetchMemberStatus } from '@/api/member'
+
import type { JobDetailData, SkillGapData } from '@/api/jobs'
+
+
// ==================== 路由相关 ====================
const router = useRouter()
const route = useRoute()
const store = useStore()
+
+// 声明友盟统计 _czc 对象
+const _czc: any[] = (window as any)._czc || [];
+(window as any)._czc = _czc;
+// 绑定 siteid,请用您的 siteid 替换下方 "XXXXXXXX" 部分
+_czc.push(["_setAccount", "1281490571"]);
+
// ==================== 全屏加载状态 ====================
/** 全屏加载是否显示 */
const fullLoading = ref(false)
@@ -482,16 +491,20 @@ const resumeCustomJobInfo = computed(() => ({
/** 生成岗位专属简历 — 先检查会员状态,非会员弹权限拦截弹窗 */
async function handleGenerateResume() {
- // 先检查会员状态
- try {
- const statusRes = await fetchMemberStatus()
- if (statusRes.code === '0' && statusRes.data && !statusRes.data.isMember) {
- // 非会员 — 弹出会员权限拦截弹窗
- showMemberAccessDialog.value = true
- return
+ // 优先从 vuex store 读取会员状态,没有则请求接口
+ let isMember = store.state.memberStatus?.isMember
+ if (isMember === undefined || isMember === null) {
+ try {
+ await store.dispatch('loadMemberStatus')
+ isMember = store.state.memberStatus?.isMember
+ } catch {
+ // 接口异常时不阻断,继续执行
}
- } catch {
- // 接口异常时不阻断,继续执行
+ }
+ if (!isMember) {
+ // 非会员 — 弹出会员权限拦截弹窗
+ showMemberAccessDialog.value = true
+ return
}
// 显示步骤进度遮罩
diff --git a/src/views/Jobs.vue b/src/views/Jobs.vue
index 523724f..110ed89 100644
--- a/src/views/Jobs.vue
+++ b/src/views/Jobs.vue
@@ -390,6 +390,7 @@ import JobResumeTemplate from '@/components/JobResumeTemplate.vue'
import type { ResumeTemplateData } from '@/components/JobResumeTemplate.vue'
+
// 2. 注意:这里的字符串不需要再手动转义双引号了
const paymentFormHtml = ref(`