From 349d17b5c43d77fcf8250f96fd87d0eaa6bfa83b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=86=AF=E8=BE=89?= <13935151924@163.com>
Date: Tue, 4 Nov 2025 21:12:12 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F?=
=?UTF-8?q?=E5=85=BC=E5=AE=B9=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package-lock.json | 5 +-
packageA/pages/UnitDetails/UnitDetails.vue | 417 ++++++++++++++++-----
packageA/pages/browseJob/browseJob.vue | 5 -
packageA/pages/collection/collection.vue | 5 -
packageA/pages/post/component/radarMap.vue | 45 ++-
packageA/pages/post/post.vue | 83 +++-
pages.json | 104 ++---
pages/index/components/index-one.vue | 38 +-
pages/mine/mine.vue | 2 +-
pages/nearby/nearby.vue | 10 +-
10 files changed, 528 insertions(+), 186 deletions(-)
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 @@
在招职位
-
-
-
-
- {{ job.jobTitle }}
- ¥{{ job.salaryRange }}/月
-
-
-
-
- {{ job.experienceRequirement }}
-
-
-
- {{ job.educationRequirement }}
-
-
-
- {{ job.jobRequirement }}
+
+
+
-
-
- {{ job.jobDescription }}
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+ {{ job.jobLocation }}
+
@@ -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) + '...';
+}