Ver código fonte

为岗位新增地理位置筛选

jialuyu 1 mês atrás
pai
commit
0519aa6f01

+ 54 - 1
pages/jobs/filter.vue

@@ -77,6 +77,21 @@
         </view>
       </view>
 
+      <!-- 工作地点 -->
+      <view class="section">
+        <view class="section-header">
+          <text class="title">工作地点</text>
+        </view>
+        <picker mode="region" @change="onRegionChange" :value="selectedRegion">
+          <view class="location-picker">
+            <text class="location-text" :class="{ 'placeholder': !selectedCity }">
+              {{ selectedCity ? (selectedRegion[0] + ' ' + selectedRegion[1] + ' ' + selectedRegion[2]) : '请选择工作地点' }}
+            </text>
+            <image src="/static/icons/chevron-right.svg" class="arrow-icon" mode="aspectFit"></image>
+          </view>
+        </picker>
+      </view>
+
       <!-- 学历要求 -->
       <view class="section">
         <view class="section-header">
@@ -136,6 +151,15 @@ const selectedExperience = ref('');
 const educations = ref([]);
 const selectedEducation = ref('');
 
+// 地理位置
+const selectedRegion = ref(['', '', '']);
+const selectedCity = ref('');
+
+const onRegionChange = (e) => {
+  selectedRegion.value = e.detail.value;
+  selectedCity.value = e.detail.value[1]; // 取城市名作为核心过滤条件
+};
+
 const loadDictionaries = () => {
   getDicts('main_position_type').then(res => {
     if (res.data) {
@@ -235,7 +259,9 @@ const confirmFilters = () => {
     minSalary: minSalary.value,
     maxSalary: maxSalary.value,
     experience: userExp,
-    education: userEdu
+    education: userEdu,
+    workCity: selectedCity.value,
+    workProvince: selectedRegion.value[0]
   };
   
   uni.$emit('updateFilters', filterParams);
@@ -258,6 +284,8 @@ const resetFilters = () => {
   updateThumbPositions();
   selectedExperience.value = '';
   selectedEducation.value = '不限';
+  selectedRegion.value = ['', '', ''];
+  selectedCity.value = '';
 };
 </script>
 
@@ -325,6 +353,31 @@ const resetFilters = () => {
   }
 }
 
+.location-picker {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background-color: #F8F9FB;
+  padding: 24rpx 30rpx;
+  border-radius: 12rpx;
+  border: 2rpx solid #E4E7ED;
+
+  .location-text {
+    font-size: 26rpx;
+    color: #1A1A1A;
+
+    &.placeholder {
+      color: #BBBBBB;
+    }
+  }
+
+  .arrow-icon {
+    width: 24rpx;
+    height: 24rpx;
+    opacity: 0.3;
+  }
+}
+
 .salary-display {
   text-align: center;
   font-size: 28rpx;

+ 7 - 2
pages/jobs/jobs.vue

@@ -257,7 +257,9 @@ const filterCriteria = ref({
   minSalary: 0,
   maxSalary: 50,
   experience: '',
-  education: ''
+  education: '',
+  workCity: '',
+  workProvince: ''
 });
 
 const activeFilterCount = computed(() => {
@@ -267,6 +269,7 @@ const activeFilterCount = computed(() => {
   if (filterCriteria.value.experience) count++;
   if (filterCriteria.value.education) count++;
   if (filterCriteria.value.minSalary > 0 || filterCriteria.value.maxSalary < 50) count++;
+  if (filterCriteria.value.workCity) count++;
   return count;
 });
 
@@ -297,7 +300,9 @@ const fetchJobs = (reset = false) => {
     schoolRequirement: filterCriteria.value.education || '',
     gradeRequirement: filterCriteria.value.experience || '',
     minSalary: filterCriteria.value.minSalary,
-    maxSalary: filterCriteria.value.maxSalary
+    maxSalary: filterCriteria.value.maxSalary,
+    workCity: filterCriteria.value.workCity || '',
+    workProvince: filterCriteria.value.workProvince || ''
   };
 
   // 只有登录状态下才附带 studentId,避免传 "undefined" 字符串给后端

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/assets.js.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/jobs/filter.js.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/jobs/jobs.js.map


+ 2 - 2
unpackage/dist/dev/mp-weixin/common/assets.js

@@ -10,6 +10,7 @@ const _imports_1$3 = "/static/icons/time.svg";
 const _imports_2$5 = "/static/icons/verified.svg";
 const _imports_3$3 = "/static/icons/close.svg";
 const _imports_0$8 = "/static/icons/icon-delete.svg";
+const _imports_8$1 = "/static/icons/chevron-right.svg";
 const _imports_2$4 = "/static/icons/location.svg";
 const _imports_2$3 = "/static/images/logo1.png";
 const _imports_4$1 = "/static/icons/emoji_thin.svg";
@@ -19,13 +20,12 @@ const _imports_1$2 = "/static/icons/arrow-down.svg";
 const _imports_2$2 = "/static/icons/check.svg";
 const _imports_3$2 = "/static/icons/empty.svg";
 const _imports_7$1 = "/static/icons/play_circle.svg";
-const _imports_8$1 = "/static/icons/clock_mini.svg";
+const _imports_8 = "/static/icons/clock_mini.svg";
 const _imports_9 = "/static/icons/users_mini.svg";
 const _imports_0$7 = "/static/icons/arrow_left.svg";
 const _imports_0$6 = "/static/icons/arrow-right.svg";
 const _imports_0$5 = "/static/icons/back_white.svg";
 const _imports_0$4 = "/static/icons/back_black.svg";
-const _imports_8 = "/static/icons/chevron-right.svg";
 const _imports_0$3 = "/static/icons/diamond.svg";
 const _imports_0$2 = "/static/icons/chevron-right-blue.svg";
 const _imports_2$1 = "/static/my/fav_premium.svg";

+ 1 - 1
unpackage/dist/dev/mp-weixin/common/vendor.js

@@ -7048,7 +7048,7 @@ function isConsoleWritable() {
 function initRuntimeSocketService() {
   const hosts = "127.0.0.1,192.168.1.191";
   const port = "8090";
-  const id = "mp-weixin_AOv3Zq";
+  const id = "mp-weixin_wNej2_";
   const lazy = typeof swan !== "undefined";
   let restoreError = lazy ? () => {
   } : initOnError();

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/assessment/assessment.js

@@ -559,7 +559,7 @@ const _sfc_main = {
             p: item.cover,
             q: common_assets._imports_7,
             r: common_vendor.t(item.views),
-            s: common_assets._imports_8,
+            s: common_assets._imports_8$1,
             t: common_vendor.t(item.duration),
             v: item.trainingType === "live"
           }, item.trainingType === "live" ? {

+ 19 - 4
unpackage/dist/dev/mp-weixin/pages/jobs/filter.js

@@ -20,6 +20,12 @@ const _sfc_main = {
     const selectedExperience = common_vendor.ref("");
     const educations = common_vendor.ref([]);
     const selectedEducation = common_vendor.ref("");
+    const selectedRegion = common_vendor.ref(["", "", ""]);
+    const selectedCity = common_vendor.ref("");
+    const onRegionChange = (e) => {
+      selectedRegion.value = e.detail.value;
+      selectedCity.value = e.detail.value[1];
+    };
     const loadDictionaries = () => {
       api_dict.getDicts("main_position_type").then((res) => {
         if (res.data) {
@@ -105,7 +111,9 @@ const _sfc_main = {
         minSalary: minSalary.value,
         maxSalary: maxSalary.value,
         experience: userExp,
-        education: userEdu
+        education: userEdu,
+        workCity: selectedCity.value,
+        workProvince: selectedRegion.value[0]
       };
       common_vendor.index.$emit("updateFilters", filterParams);
       common_vendor.index.showToast({
@@ -124,6 +132,8 @@ const _sfc_main = {
       updateThumbPositions();
       selectedExperience.value = "";
       selectedEducation.value = "不限";
+      selectedRegion.value = ["", "", ""];
+      selectedCity.value = "";
     };
     return (_ctx, _cache) => {
       return common_vendor.e({
@@ -164,7 +174,12 @@ const _sfc_main = {
             d: common_vendor.o(($event) => selectedExperience.value = item.dictValue, index)
           };
         }),
-        o: common_vendor.f(educations.value, (item, index, i0) => {
+        o: common_vendor.t(selectedCity.value ? selectedRegion.value[0] + " " + selectedRegion.value[1] + " " + selectedRegion.value[2] : "请选择工作地点"),
+        p: !selectedCity.value ? 1 : "",
+        q: common_assets._imports_8,
+        r: common_vendor.o(onRegionChange),
+        s: selectedRegion.value,
+        t: common_vendor.f(educations.value, (item, index, i0) => {
           return {
             a: common_vendor.t(item.dictLabel),
             b: selectedEducation.value === item.dictValue ? 1 : "",
@@ -172,8 +187,8 @@ const _sfc_main = {
             d: common_vendor.o(($event) => selectedEducation.value = item.dictValue, index)
           };
         }),
-        p: common_vendor.o(resetFilters),
-        q: common_vendor.o(confirmFilters)
+        v: common_vendor.o(resetFilters),
+        w: common_vendor.o(confirmFilters)
       });
     };
   }

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/jobs/filter.wxml


+ 21 - 0
unpackage/dist/dev/mp-weixin/pages/jobs/filter.wxss

@@ -52,6 +52,27 @@
   color: #FFFFFF;
   border-color: #1F6CFF;
 }
+.location-picker.data-v-4c7cef4a {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background-color: #F8F9FB;
+  padding: 24rpx 30rpx;
+  border-radius: 12rpx;
+  border: 2rpx solid #E4E7ED;
+}
+.location-picker .location-text.data-v-4c7cef4a {
+  font-size: 26rpx;
+  color: #1A1A1A;
+}
+.location-picker .location-text.placeholder.data-v-4c7cef4a {
+  color: #BBBBBB;
+}
+.location-picker .arrow-icon.data-v-4c7cef4a {
+  width: 24rpx;
+  height: 24rpx;
+  opacity: 0.3;
+}
 .salary-display.data-v-4c7cef4a {
   text-align: center;
   font-size: 28rpx;

+ 8 - 2
unpackage/dist/dev/mp-weixin/pages/jobs/jobs.js

@@ -83,7 +83,9 @@ const _sfc_main = {
       minSalary: 0,
       maxSalary: 50,
       experience: "",
-      education: ""
+      education: "",
+      workCity: "",
+      workProvince: ""
     });
     const activeFilterCount = common_vendor.computed(() => {
       let count = 0;
@@ -93,6 +95,8 @@ const _sfc_main = {
         count++;
       if (filterCriteria.value.minSalary > 0 || filterCriteria.value.maxSalary < 50)
         count++;
+      if (filterCriteria.value.workCity)
+        count++;
       return count;
     });
     const fetchJobs = (reset = false) => {
@@ -118,7 +122,9 @@ const _sfc_main = {
         schoolRequirement: filterCriteria.value.education || "",
         gradeRequirement: filterCriteria.value.experience || "",
         minSalary: filterCriteria.value.minSalary,
-        maxSalary: filterCriteria.value.maxSalary
+        maxSalary: filterCriteria.value.maxSalary,
+        workCity: filterCriteria.value.workCity || "",
+        workProvince: filterCriteria.value.workProvince || ""
       };
       const currentStudentId = getStudentId();
       if (currentStudentId) {

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/message/message.js

@@ -143,7 +143,7 @@ const _sfc_main = {
             i: common_vendor.o(($event) => goToDetail(msg), index)
           });
         }),
-        e: common_assets._imports_8$1,
+        e: common_assets._imports_8,
         f: filteredMessages.value.length === 0
       }, filteredMessages.value.length === 0 ? {} : {}, {
         g: common_vendor.p({

+ 2 - 2
unpackage/dist/dev/mp-weixin/pages/my/my.js

@@ -323,9 +323,9 @@ const _sfc_main = {
         A: common_assets._imports_3$3,
         B: common_assets._imports_7$1
       } : {}, {
-        C: common_assets._imports_8$1,
+        C: common_assets._imports_8,
         D: common_vendor.o(handleOffer),
-        E: common_assets._imports_8$1,
+        E: common_assets._imports_8,
         F: common_vendor.o(handlePrivacy),
         G: common_vendor.o(handleLogout),
         H: showResumeModal.value

+ 1 - 2
unpackage/dist/dev/mp-weixin/project.config.json

@@ -9,8 +9,7 @@
     "postcss": false,
     "minified": false,
     "newFeature": true,
-    "bigPackageSizeSupport": true,
-    "minifyWXML": true
+    "bigPackageSizeSupport": true
   },
   "compileType": "miniprogram",
   "libVersion": "",

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff