diff --git a/package-lock.json b/package-lock.json index a04b5bf..f7dc246 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,8 +27,9 @@ }, "node_modules/sm-crypto": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/sm-crypto/-/sm-crypto-0.3.13.tgz", + "resolved": "https://registry.npmmirror.com/sm-crypto/-/sm-crypto-0.3.13.tgz", "integrity": "sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==", + "license": "MIT", "dependencies": { "jsbn": "^1.1.0" } @@ -52,7 +53,7 @@ }, "sm-crypto": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/sm-crypto/-/sm-crypto-0.3.13.tgz", + "resolved": "https://registry.npmmirror.com/sm-crypto/-/sm-crypto-0.3.13.tgz", "integrity": "sha512-ztNF+pZq6viCPMA1A6KKu3bgpkmYti5avykRHbcFIdSipFdkVmfUw2CnpM2kBJyppIalqvczLNM3wR8OQ0pT5w==", "requires": { "jsbn": "^1.1.0" diff --git a/packageA/pages/UnitDetails/UnitDetails.vue b/packageA/pages/UnitDetails/UnitDetails.vue index c11cc7d..61eba48 100644 --- a/packageA/pages/UnitDetails/UnitDetails.vue +++ b/packageA/pages/UnitDetails/UnitDetails.vue @@ -21,15 +21,25 @@ {{ companyInfo?.companyName }} - - {{ companyInfo?.scale }} + + +  ·  + 公司介绍 {{ - companyInfo.companyIntroduction + companyInfo.description }} @@ -46,32 +56,39 @@ 在招职位 @@ -90,7 +107,7 @@ import config from "@/config.js"; import { storeToRefs } from "pinia"; import useLocationStore from "@/stores/useLocationStore"; const { longitudeVal, latitudeVal } = storeToRefs(useLocationStore()); -const { $api, navTo, vacanciesTo, navBack } = inject("globalFunction"); +const { $api, navTo, vacanciesTo, navBack, parseQueryParams } = inject("globalFunction"); const isExpanded = ref(false); const pageState = reactive({ page: 0, @@ -101,9 +118,16 @@ const pageState = reactive({ }); const companyInfo = ref({ jobInfoList: [], + companyName: '', + scale: '', + industry: '', + description: '', + isCollection: false }); const baseUrl = config.imgBaseUrl; +const companyIdRef = ref(null); + const getItemBackgroundStyle = (imageName) => ({ backgroundImage: `url(${baseUrl}/jobfair/${imageName})`, backgroundSize: "100% 100%", // 覆盖整个容器 @@ -111,14 +135,167 @@ const getItemBackgroundStyle = (imageName) => ({ backgroundRepeat: "no-repeat", }); +// 获取公司详情 +function getCompanyDetail(companyId) { + if (!companyId) { + console.error('companyId 不能为空'); + return; + } + + // 尝试获取公司详情,如果接口不存在,可能公司详情会包含在职位数据中 + $api.createRequest(`/app/company/${companyId}`).then((resData) => { + if (resData && resData.data) { + const data = resData.data; + companyInfo.value = { + ...companyInfo.value, + ...data, + companyName: data.name || data.companyName || data.company?.name || '', + scale: data.scale || data.company?.scale || '', + industry: data.industry || data.company?.industry || '', + description: data.description || data.companyIntroduction || data.introduction || data.company?.introduction || '', + isCollection: data.isCollection || false, + // 如果接口直接返回了职位列表,也设置进去 + jobInfoList: data.jobInfoList || data.jobs || data.list || companyInfo.value.jobInfoList || [] + }; + console.log('companyInfo',companyInfo.value); + } + // 获取在招职位列表 + getCompanyJobs(companyId); + }).catch((error) => { + console.error('获取公司详情失败:', error); + // 如果获取公司详情失败,尝试通过职位列表接口获取公司信息 + // 或者直接获取职位列表 + getCompanyJobs(companyId); + }); +} + +// 获取公司在招职位列表 +function getCompanyJobs(companyId) { + if (!companyId) { + return; + } + + // 使用正确的 API 路径:/app/company/job/{companyId} + $api.createRequest(`/app/company/job/${companyId}`, {}, 'GET').then((resData) => { + console.log('获取职位列表返回数据:', resData); + if (resData) { + // 优先检查 rows 字段(根据实际返回的数据结构) + if (resData.rows && Array.isArray(resData.rows)) { + companyInfo.value.jobInfoList = resData.rows; + } + // 如果返回的是数组 + else if (Array.isArray(resData)) { + companyInfo.value.jobInfoList = resData; + } + // 如果返回的是对象,包含列表字段 + else if (resData.data) { + if (Array.isArray(resData.data)) { + companyInfo.value.jobInfoList = resData.data; + } else if (resData.data.rows && Array.isArray(resData.data.rows)) { + companyInfo.value.jobInfoList = resData.data.rows; + } else if (resData.data.list && Array.isArray(resData.data.list)) { + companyInfo.value.jobInfoList = resData.data.list; + } else if (resData.data.jobInfoList && Array.isArray(resData.data.jobInfoList)) { + companyInfo.value.jobInfoList = resData.data.jobInfoList; + } else { + companyInfo.value.jobInfoList = []; + } + } else { + companyInfo.value.jobInfoList = []; + } + } else { + companyInfo.value.jobInfoList = []; + } + }).catch((error) => { + console.error('获取在招职位列表失败:', error); + companyInfo.value.jobInfoList = []; + }); +} + onLoad((options) => { - companyInfo.value = JSON.parse(options.job); - console.log(companyInfo.value, "companyInfo.value"); + console.log('options',options); + let companyId = null; + + // 优先从 options 中获取 companyId(小程序和 H5 都支持) + if (options && options.companyId) { + companyId = decodeURIComponent(options.companyId); + } + // 如果 options 中没有,尝试从 URL 解析(仅 H5 环境) + else { + // 使用 try-catch 包裹,避免在小程序环境中访问 window.location 报错 + try { + // #ifdef H5 + const params = parseQueryParams(); + companyId = params.companyId; + // #endif + } catch (e) { + console.warn('解析 URL 参数失败:', e); + } + } + + console.log('companyId', companyId); + + if (companyId) { + companyIdRef.value = companyId; + getCompanyDetail(companyId); + } else { + console.error('未获取到 companyId 参数'); + // 如果参数名是 job,尝试兼容旧的方式 + if (options && options.job) { + try { + const parsedData = JSON.parse(options.job); + if (parsedData.companyId) { + companyIdRef.value = parsedData.companyId; + getCompanyDetail(parsedData.companyId); + } else { + companyInfo.value = { ...companyInfo.value, ...parsedData }; + } + } catch (e) { + console.error('解析 job 参数失败:', e); + } + } + } +}); + +onShow(() => { + // 仅在 H5 环境中从 URL 获取参数(小程序环境中 onShow 不会传递 URL 参数) + // #ifdef H5 + try { + const params = parseQueryParams(); + const companyId = params.companyId; + + if (companyId && companyId !== companyIdRef.value) { + companyIdRef.value = companyId; + getCompanyDetail(companyId); + } + } catch (e) { + console.warn('onShow 中解析 URL 参数失败:', e); + } + // #endif }); function expand() { isExpanded.value = !isExpanded.value; } + +// 格式化薪资范围 +function formatSalary(minSalary, maxSalary) { + if (minSalary && maxSalary) { + return `${minSalary}-${maxSalary}`; + } else if (minSalary) { + return `${minSalary}起`; + } else if (maxSalary) { + return `最高${maxSalary}`; + } + return '面议'; +} + +// 截断文本,超过指定长度显示省略号 +function truncateText(text, maxLength) { + if (!text) return ''; + if (text.length <= maxLength) return text; + return text.substring(0, maxLength) + '...'; +}