浏览代码

Merge branch 'dev' of https://git.citupro.com/zhengnaiwen_citu/menduner into dev

Xiao_123 11 月之前
父节点
当前提交
4713be4f65

+ 7 - 0
src/components/CtForm/index.vue

@@ -56,6 +56,12 @@
                 :item="item"
                 @change="handleChange(item)"
               ></textareaUI>
+              <nestedListGroupUI
+                v-if="item.type === 'nestedListGroup'"
+                v-model="item.value"
+                :item="item"
+                @change="handleChange(item)"
+              ></nestedListGroupUI>
               <DatePicker v-if="item.type === 'datePicker'" v-model="item.value" :options="item.options" :width="item.width" :class="item.class"></DatePicker>
               
               <template v-if="item.slotName">
@@ -78,6 +84,7 @@ import comboboxZhAndEnUI from './../FormUI/comboboxZhAndEn'
 import radioGroupUI from './../FormUI/radioGroup'
 import checkboxUI from './../FormUI/checkbox'
 import textareaUI from './../FormUI/textArea'
+import nestedListGroupUI from './../FormUI/nestedListGroup'
 import DatePicker from '@/components/DatePicker'
 import { ref, defineEmits, defineExpose } from 'vue'
 const emit = defineEmits(['change', 'inputUpdateAutocomplete'])// 定义一个或多个自定义事件

+ 39 - 0
src/components/FormUI/nestedListGroup/components/listGroup.vue

@@ -0,0 +1,39 @@
+<template>
+  <v-list class="side-box" color="primary">
+    <template v-for="(val, index) in item.items" :key="item?.itemValue? val[item.itemValue] : index">
+      <template v-if="!val.children?.length">
+        <v-list-item
+          active-class="active"
+          color="primary"
+          :title="val[item.itemText || 'label']"
+        >
+        </v-list-item>
+      </template>
+      <v-list-group
+        v-else
+        color="primary"
+        :prepend-icon="val.icon"
+      >
+        <template v-slot:activator="{ props }">
+          <v-list-item v-bind="props" :title="val[item.itemText || 'label']"></v-list-item>
+        </template>
+        <v-list-item
+          v-for="(k, i) in val.children"
+          :key="`k_${i}`"
+          color="primary"
+          style="padding-left: 40px;"
+          :title="k[item.itemText || 'label']"
+          :value="k[item.itemValue || 'value']"
+        ></v-list-item>
+      </v-list-group>
+    </template>
+  </v-list>
+</template>
+
+<script setup>
+defineOptions({ name:'nestedListGroup-listGroup'})
+const propsData = defineProps({item: Object})
+const item = propsData.item
+</script>
+<style lang="scss" scoped>
+</style>

+ 82 - 0
src/components/FormUI/nestedListGroup/index.vue

@@ -0,0 +1,82 @@
+<!-- 嵌套列表 -->
+<template>
+  <div :style="{ width: item.width ? item.width + 'px' : '100%' }">
+    <v-menu :close-on-content-click="closeOnContentClick">
+      <template v-slot:activator="{ props }">
+        <v-text-field
+          v-model="value"
+          v-bind="props"
+          variant="outlined"
+          :density="item.dense || 'compact'"
+          :type="item.type"
+          :rules="item.rules"
+          :disabled="item.disabled"
+          :style="{width: item.width}"
+          :color="item.color || 'primary'"
+          :label="item.label"
+          :placeholder="item.placeholder || item.label"
+          :autofocus="item.autofocus"
+          :required="item.required"
+          :class="item.class"
+          :suffix="item.suffix"
+          :append-icon="item.appendIcon"
+          :append-inner-icon="item.appendInnerIcon"
+          :clearable="item.clearable"
+          :readonly="item.readonly"
+          :counter="item.counter"
+          :prepend-inner-icon="item.prependInnerIcon"
+          hide-spin-buttons
+          :hide-details="item.hideDetails || false"
+          @update:modelValue="modelValueUpDate"
+        ></v-text-field>
+      </template>
+      <v-list class="side-box" color="primary">
+        <template v-for="(val, index) in item.items" :key="item?.itemValue? val[item.itemValue] : index">
+          <template v-if="!val.children?.length">
+            <v-list-item
+              active-class="active"
+              color="primary"
+              :title="val[item.itemText || 'label']"
+            >
+            </v-list-item>
+          </template>
+          <v-list-group
+            v-else
+            color="primary"
+            :prepend-icon="val.icon"
+          >
+            <template v-slot:activator="{ props }">
+              <v-list-item v-bind="props" :title="val[item.itemText || 'label']"></v-list-item>
+            </template>
+            <v-list-item
+              v-for="(k, i) in val.children"
+              :key="`k_${i}`"
+              color="primary"
+              style="padding-left: 40px;"
+              :title="k[item.itemText || 'label']"
+              :value="k[item.itemValue || 'value']"
+            ></v-list-item>
+          </v-list-group>
+        </template>
+      </v-list>
+    </v-menu>
+  </div>
+</template>
+
+<script setup>
+import { defineEmits, ref } from 'vue';
+defineOptions({ name:'FormUI-nestedListGroup'})
+const propsData = defineProps({item: Object, modelValue: [String, Number]})
+const item = propsData.item
+const value = ref(propsData.modelValue)
+const emit = defineEmits(['update:modelValue', 'change'])
+const modelValueUpDate = (val) => {
+  value.value = val
+  emit('update:modelValue', value.value)
+  emit('change', value.value)
+}
+const closeOnContentClick = ref(false) // multiple
+</script>
+<style lang="scss" scoped>
+</style>
+ 

+ 15 - 15
src/permission.js

@@ -5,20 +5,20 @@ import { getToken } from '@/utils/auth'
 
 const { start, done } = useNProgress()
 // 路由不重定向白名单
-const whiteList = [
-  '/',
-  '/home',
-  '/login',
-  '/social-login',
-  '/auth-redirect',
-  '/bind',
-  '/register',
-  '/privacyPolicy',
-  '/userAgreement',
-  '/recruit/company',
-  '/recruit/position'
-]
-
+// const whiteList = [
+//   '/',
+//   '/home',
+//   '/login',
+//   '/social-login',
+//   '/auth-redirect',
+//   '/bind',
+//   '/register',
+//   '/privacyPolicy',
+//   '/userAgreement',
+//   '/recruit/company',
+//   '/recruit/position',
+//   '/recruit/position/details',
+// ]
 // 路由守卫
 router.beforeEach(async (to, from, next) => {
   start()
@@ -30,7 +30,7 @@ router.beforeEach(async (to, from, next) => {
       next()
     }
   } else {
-    if (whiteList.indexOf(to.path) !== -1) {
+    if (to.meta?.noLogin) { // noLogin:页面不需要登录
       next()
     } else {
       next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页

+ 6 - 3
src/router/modules/recruit.js

@@ -12,7 +12,8 @@ const recruit = [
         component: () => import('@/views/recruit/position'),
         name: 'recruitPosition',
         meta: {
-          title: '职位'
+          title: '职位',
+          noLogin: true
         }
       },
       {
@@ -20,7 +21,8 @@ const recruit = [
         component: () => import('@/views/recruit/company'),
         name: 'recruitCompany',
         meta: {
-          title: '公司'
+          title: '公司',
+          noLogin: true
         }
       },
       {
@@ -28,7 +30,8 @@ const recruit = [
         component: () => import('@/views/recruit/position/components/details'),
         name: 'recruitPositionDetails',
         meta: {
-          title: '职位详情'
+          title: '职位详情',
+          noLogin: true
         }
       }
     ]

+ 10 - 5
src/router/modules/remaining.js

@@ -17,7 +17,8 @@ const remainingRouter = [
     name: 'login',
     meta: {
       hidden: true,
-      title: '登录/注册'
+      title: '登录/注册',
+      noLogin: true
     }
   },
   {
@@ -29,7 +30,8 @@ const remainingRouter = [
         path: '/userAgreement',
         component: () => import('@/views/login/components/userAgreement.vue'),
         meta: {
-          title: '用户协议'
+          title: '用户协议',
+          noLogin: true
         }
       }
     ]
@@ -43,7 +45,8 @@ const remainingRouter = [
         path: '/privacyPolicy',
         component: () => import('@/views/login/components/privacyPolicy.vue'),
         meta: {
-          title: '隐私政策'
+          title: '隐私政策',
+          noLogin: true
         }
       }
     ]
@@ -64,7 +67,8 @@ const remainingRouter = [
         path: '/home',
         component: () => import('@/views/Home/index'),
         meta: {
-          title: '首页'
+          title: '首页',
+          noLogin: true
         }
       }
     ]
@@ -75,7 +79,8 @@ const remainingRouter = [
     name: 'register',
     meta: {
       hidden: true,
-      title: '注册企业'
+      title: '注册企业',
+      noLogin: true
     }
   },
   ...routeArray

+ 2 - 1
src/views/recruit/position/components/details.vue

@@ -109,6 +109,7 @@ import similarPositions from '@/components/Position/similarPositions.vue'
 import EnterpriseInfo from '@/components/Enterprise/info.vue'
 import Snackbar from '@/plugins/snackbar'
 import Dialog from '@/components/CtDialog'
+import { getToken } from '@/utils/auth'
 
 const { t } = useI18n()
 const router = useRouter()
@@ -130,7 +131,7 @@ const deliveryCheck = async () => {
   const data = await jobCvRelCheckSend({ jobId: id })
   if (data) delivery.value = true
 }
-deliveryCheck()
+if (getToken()) deliveryCheck()
 
 const desc = [
   { mdi: 'mdi-map-marker-outline', value: 'areaName' },

+ 1 - 1
src/views/recruit/position/index.vue

@@ -87,7 +87,7 @@ const getData = async () => {
       else pageReqVO[key] = routeQuery[key].split('_') // 传给后端Arr
     })
   }
-  console.log('getData参数pageReqVO', pageReqVO)
+  // console.log('getData参数pageReqVO', pageReqVO)
   const { list, total: number } = await getJobAdvertisedSearch(pageReqVO)
   items.value = list.map(e => {
     e.job = { ...e.job, ...dealDictObjData({}, e.job) }