Browse Source

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

lifanagju_citu 3 months ago
parent
commit
8b24328fe8
52 changed files with 335 additions and 377 deletions
  1. 1 0
      src/components/CtFilter/index.vue
  2. 1 1
      src/components/CtTable/index.vue
  3. 1 1
      src/components/FormUI/autocomplete/index.vue
  4. 1 1
      src/components/pay/index.vue
  5. 26 27
      src/layout/company/navBar.vue
  6. 6 6
      src/layout/company/side.vue
  7. 1 1
      src/layout/company/slider.vue
  8. 5 6
      src/layout/enterprise.vue
  9. 95 15
      src/permission.js
  10. 0 7
      src/router/modules/common.js
  11. 15 18
      src/router/modules/components/recruit/enterprise.js
  12. 1 1
      src/router/modules/recruit.js
  13. 4 4
      src/router/modules/remaining.js
  14. 18 2
      src/store/enterprise.js
  15. 8 0
      src/store/system.js
  16. 5 5
      src/store/user.js
  17. 1 1
      src/styles/index.css
  18. 0 0
      src/styles/index.min.css
  19. 2 1
      src/styles/index.scss
  20. 0 0
      src/views/mallCopy/components/table.vue
  21. 1 1
      src/views/mallCopy/exchange.vue
  22. 1 1
      src/views/mallCopy/exchangeRecords.vue
  23. 0 0
      src/views/mallCopy/index.vue
  24. 0 0
      src/views/mallCopy/purchasePackage/components/packageList.js
  25. 0 0
      src/views/mallCopy/purchasePackage/components/packageList.vue
  26. 0 0
      src/views/mallCopy/purchasePackage/index.vue
  27. 2 2
      src/views/recruit/components/message/index.vue
  28. 0 117
      src/views/recruit/entRegister/joiningEnterprise.vue
  29. 1 1
      src/views/recruit/enterprise/hirePosition/components/add.vue
  30. 2 2
      src/views/recruit/enterprise/hirePosition/components/item.vue
  31. 2 2
      src/views/recruit/enterprise/interviewManagement/index.vue
  32. 3 2
      src/views/recruit/enterprise/jobFair/editJob/index.vue
  33. 1 1
      src/views/recruit/enterprise/jobFair/index.vue
  34. 1 1
      src/views/recruit/enterprise/membershipPackage/dynamic/balance.vue
  35. 2 2
      src/views/recruit/enterprise/membershipPackage/dynamic/package-copy.vue
  36. 2 2
      src/views/recruit/enterprise/membershipPackage/dynamic/package.vue
  37. 2 2
      src/views/recruit/enterprise/positionManagement/components/add.vue
  38. 1 1
      src/views/recruit/enterprise/positionManagement/components/item.vue
  39. 1 1
      src/views/recruit/enterprise/positionManagement/index.vue
  40. 2 2
      src/views/recruit/enterprise/resume/components/table.vue
  41. 2 2
      src/views/recruit/enterprise/search/recommend/index.vue
  42. 2 2
      src/views/recruit/enterprise/search/retrieval/index.vue
  43. 5 4
      src/views/recruit/enterprise/staffChangePassword/index.vue
  44. 1 1
      src/views/recruit/enterprise/staffInfoSetting/index.vue
  45. 2 2
      src/views/recruit/enterprise/statistics/overallAnalysis.vue
  46. 41 59
      src/views/recruit/enterprise/systemManagement/groupAccount/index.vue
  47. 0 6
      src/views/recruit/enterprise/systemManagement/roleManagement/components/DataPermission.vue
  48. 59 55
      src/views/recruit/enterprise/systemManagement/roleManagement/index.vue
  49. 1 1
      src/views/recruit/enterprise/talentPool/components/details.vue
  50. 1 1
      src/views/recruit/enterprise/talentPool/components/details/dict.js
  51. 5 6
      src/views/recruit/enterprise/talentPool/components/details/jobIntention.vue
  52. 1 1
      src/views/recruit/personal/PersonalCenter/resume/blockEnt/index.vue

+ 1 - 0
src/components/CtFilter/index.vue

@@ -21,6 +21,7 @@
 					<div class="pa-3">
 						<v-btn color="primary" class="elevation-5 half-button" @click="search">查 询</v-btn>
             <v-btn color="primary" variant="outlined" v-if="showResetBtn" class="elevation-5 half-button ml-3" @click="reset">重 置</v-btn>
+            <slot name="appendBtn"></slot>
 					</div>
 				</template>
 				<slot name="btn"></slot>

+ 1 - 1
src/components/CtTable/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <div v-if="isTools" class="text-end mb-3">
-      <v-btn class="ml-2" color="primary" @click="emit('add')">
+      <v-btn class="ml-2 elevation-5" color="primary" @click="emit('add')">
         <v-icon left>mdi-plus</v-icon>
         {{ t('common.add') }} 
         <!-- 新增 -->

+ 1 - 1
src/components/FormUI/autocomplete/index.vue

@@ -20,7 +20,7 @@
       :hide-no-data="item.hideNoData"
       :no-data-text="item.noDataText || 'No data available'"
       :hide-selected="item.hideSelected"
-      :hide-details="item.hireDetails || false"
+      :hide-details="item.hideDetails || false"
       @update:search="v => item.search ? debouncedCallbackSearch(v) : null"
       @update:modelValue="modelValueUpDate"
     ></v-autocomplete>

+ 1 - 1
src/components/pay/index.vue

@@ -382,7 +382,7 @@ const formatDuration = (remainder) => {
 }
 
 const handleToJump = () => {
-  router.push('/recruit/enterprise/membershipPackage?fromName=positionPay')
+  router.push('/recruit/enterprise/membershipPackage/index?fromName=positionPay')
 }
 
 </script>

+ 26 - 27
src/layout/company/navBar.vue

@@ -1,27 +1,31 @@
 <template>
   <div>
-    <v-toolbar
-      class="banner"
-      density="compact"
-      style="padding-left: 0px;height: 50px;font-size: 14px;"
-    >
+    <v-toolbar class="banner font-size-14 pl-0" density="compact" style="height: 50px;">
       <div class="innerBox d-flex justify-space-between">
-        <div>
-          <div class="nav-logo" style="cursor: pointer;" @click="handleLogoClick">
-            <v-img src="../../assets/logo.png"  aspect-ratio="16/9" cover :width="97" style="height: 40px"></v-img>
-          </div>
+        <div class="nav-logo" style="cursor: pointer;" @click="handleLogoClick">
+          <v-img src="../../assets/logo.png"  aspect-ratio="16/9" cover :width="97" style="height: 40px"></v-img>
         </div>
         
         <div class="d-flex user-nav align-center">
+          <!-- 企业logo、企业名称 -->
           <div class="d-flex align-center cursor-pointer">
             <v-img @click="enterpriseClick(2)" rounded width="40" height="40" :src="baseInfo?.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" ></v-img>
             <span @click="enterpriseClick(1)" class="ml-3 commonHover">{{ formatName(baseInfo?.enterpriseAnotherName || baseInfo?.enterpriseName) }}</span>
           </div>
-          <div class="ml-3 cursor-pointer border-left border-right px-3 commonHover" @click="handleLogout(false)">我要求职</div>
-          <div class="d-flex align-center px-3 border-right cursor-pointer commonHover" @click="router.push('/recruit/enterprise/membershipPackage?key=1')">
+
+          <div class="enterprise-septal-line"></div>
+          <div class="cursor-pointer mx-3 commonHover" @click="handleLogout(false)">我要求职</div>
+
+          <div class="enterprise-septal-line"></div>
+          <div class="d-flex align-center mx-3 cursor-pointer commonHover" @click="router.push('/recruit/enterprise/membershipPackage/index?key=1')">
             <div>剩余M豆:{{ enterpriseUserAccount?.balance ? enterpriseUserAccount?.balance / 100 : 0 }}个</div>
           </div>
-          <svg-icon v-if="baseInfo?.vipFlag && Date.now() < baseInfo?.vipExpireDate" name="vip" size="30" class="ml-3"></svg-icon>
+
+          <!-- 企业会员标识 -->
+          <div v-if="baseInfo?.vipFlag && Date.now() < baseInfo?.vipExpireDate" >
+            <div class="enterprise-septal-line"></div>
+            <svg-icon name="vip" size="30" class="ml-3"></svg-icon>
+          </div>
           
           <!-- 头像用户名 -->
           <div class="d-flex align-center" v-if="showBall">
@@ -72,7 +76,7 @@
           </v-menu> -->
 
           <!-- 消息通知 -->
-          <MessageNotification class="commonHover2" path="/recruit/enterprise/chatTools"></MessageNotification>
+          <MessageNotification class="commonHover2" path="/recruit/enterprise/invite/chatTools"></MessageNotification>
         </div>
       </div>
     </v-toolbar>
@@ -113,7 +117,7 @@ onMounted(() => {
 const handleLogoClick = () => { window.open('/recruitHome') } // 点击logo
 
 const enterpriseClick = (tabKey = 1) => {
-  const path = '/recruit/enterprise/entInfoSetting'
+  const path = '/recruit/enterprise/systemManagement/entInfoSetting'
   router.push({ path, query: { tabKey } })
 }
 
@@ -125,7 +129,7 @@ const handleLogout = async (exit = true) => {
 const enterpriseList = ref([])
 
 const menuList = ref([
-  { title: t('setting.editPassword'), icon: 'mdi-shield-lock-open-outline', change: () => router.push({ path: '/recruit/enterprise/staffChangePassword' }) },
+  { title: t('setting.editPassword'), icon: 'mdi-shield-lock-open-outline', change: () => router.push({ path: '/recruit/enterprise/systemManagement/staffChangePassword' }) },
   { title: t('setting.logOut'), icon: 'mdi-logout', change: handleLogout }
 ])
 const items = computed(() => {
@@ -167,13 +171,6 @@ getEnterpriseListData()
   padding-left: 0px;
   height: 50px;
   font-size: 15px;
-  .left {
-    height: 100%;
-    display: flex;
-    align-items: center;
-    font-size: 20px;
-    cursor: pointer;
-  }
 }
 .hover:hover {
   cursor: pointer;
@@ -199,10 +196,12 @@ getEnterpriseListData()
   color: var(--color-333);
   font-size: 15px;
 }
-.border-left {
-  border-left: 1px solid #fff;
-}
-.border-right {
-  border-right: 1px solid #fff;
+.enterprise-septal-line {
+  width: 1px;
+  display: inline-block;
+  height: 20px;
+  vertical-align: middle;
+  background-color: #fff;
+  margin: 0 10px;
 }
 </style>

+ 6 - 6
src/layout/company/side.vue

@@ -49,7 +49,6 @@ import { getCurrentLocaleLang } from '@/utils/lang.js'
 import { useEnterpriseStore } from '@/store/enterprise'
 
 const enterpriseStore = useEnterpriseStore()
-
 const list = computed(() => {
   return getList(enterpriseStore.enterpriseMenu)
 })
@@ -57,18 +56,19 @@ const list = computed(() => {
 
 // const isAdmin = localStorage.getItem('isAdmin') === '1'
 // const info = localStorage.getItem('entBaseInfo') ? JSON.parse(localStorage.getItem('entBaseInfo')) : {}
-const getList = (arr, obj = []) => {
+const getList = (arr, obj = [], root = '') => {
   // 是否为企业管理员
   arr.forEach(element => {
     if (!element.alwaysShow) return
     let data = {}
-    const path = element.path[0] === '/' ? element.path : '/' + element.path
+    // const path = element.path[0] === '/' ? element.path : '/' + element.path
+    const path = root + element.path
     data = {
       title: element.name,
       enName: element?.meta?.enName,
       icon: element.icon,
       name: element.name,
-      path,
+      path: enterpriseStore.menuType.CATALOGUE === element.type ? path + '/index' : path,
       children: []
     }
     // if (element?.meta?.isAdmin) {
@@ -79,7 +79,7 @@ const getList = (arr, obj = []) => {
     // 全员猎寻
     // if (element?.meta?.hireJob) data.hireJob = true
     if (element?.children) {
-      getList(element.children, data.children)
+      getList(element.children, data.children, path + '/')
     }
     obj.push(data)
   })
@@ -95,7 +95,7 @@ const getList = (arr, obj = []) => {
   // if (info && Object.keys(info).length && !info?.entitlement?.hireJob) obj = obj.filter(e => !e.hireJob)
 
   // 生产环境隐藏门墩儿新任命
-  if (import.meta.env.VITE_NODE_ENV === 'production') obj = obj.filter(e => e.path !== '/recruit/enterprise/newlyAppointed')
+  if (import.meta.env.VITE_NODE_ENV === 'production') obj = obj.filter(e => !e.path.includes('/recruit/enterprise/newlyAppointed'))
   return obj
 }
 

+ 1 - 1
src/layout/company/slider.vue

@@ -23,7 +23,7 @@ const router = useRouter()
 const list = [
   { mdi: 'mdi-arrow-up-bold', tips: '返回顶部' },
   { mdi: 'mdi-qrcode', tips: '微信公众号', showImg: 'https://minio.citupro.com/dev/menduner/official-account-code4.jpg' },
-  { mdi: 'mdi-bell-outline', tips: '消息', path: '/recruit/enterprise/chatTools' }
+  { mdi: 'mdi-bell-outline', tips: '消息', path: '/recruit/enterprise/invite/chatTools' }
 ]
 
 const handleClick = (item, index) => {

+ 5 - 6
src/layout/enterprise.vue

@@ -2,8 +2,8 @@
   <div class="parent d-flex flex-column">
     <Headers class="headers"></Headers>
     <div class="content d-flex">
-      <side class="content-sticky" v-if="!router.currentRoute.value?.meta?.hideSide"></side>
-      <div class="content-box d-flex flex-column" :style="`width: ${ !isInWhiteList(route.path) ? 'calc(100vw - 230px)' : '100%'}`">
+      <side class="content-sticky" v-if="!isInWhiteList(route.path)"></side>
+      <div class="content-box d-flex flex-column" :style="`width: ${ !isInWhiteList(route.path) ? 'calc(100% - 230px)' : '100%'}`">
         <div v-if="!isInWhiteList(route.path)" class="breadcrumbs_sticky">
           <div class=" d-flex align-center justify-space-between">
             <v-breadcrumbs :items="system.breadcrumbs" elevation="3">
@@ -24,17 +24,15 @@
         </div>
       </div>
     </div>
-    <!-- <Slider class="slider"></Slider> -->
   </div>
 </template>
 
 <script setup>
 defineOptions({ name: 'enterprise-layout-index' })
 import Headers from './company/navBar.vue'
-// import Slider from './company/slider.vue'
 import side from './company/side.vue'
 import { useRouter, useRoute } from 'vue-router'
-import { watch, ref, computed } from 'vue'
+import { watch, computed } from 'vue'
 import { useSystem } from '@/store/system'
 import { useUserStore } from '@/store/user'
 
@@ -112,6 +110,7 @@ const toPath = (item) => {
 $top: 50px;
 .parent {
   background-color: var(--default-bgc);
+  min-width: 1200px;
 }
 .headers {
   position: sticky;
@@ -131,7 +130,7 @@ $top: 50px;
   }
 }
 .full {
-  height: calc(100vh - $top);
+  height: calc(100vh - $top - 25px);
   width: 100%;
   flex: 1;
   position: relative;

+ 95 - 15
src/permission.js

@@ -12,6 +12,7 @@ import { useEnterpriseStore } from '@/store/enterprise'
 const { start, done } = useNProgress()
 
 let isRefresh = true
+const ENTERPRISE_PATH = '/recruit/enterprise'
 
 // loginType:1.enterprise: 企业路由
 //            2.personal: 个人路由
@@ -19,6 +20,18 @@ let isRefresh = true
 //            3.personalCommon: 无需登录也能访问的页面
 // 路由守卫
 router.beforeEach(async (to, from, next) => {
+  start()
+  // 个人端 404 处理
+  // debugger
+  if (to.path === '/404') {
+    next()
+    return
+  }
+  const isEnterprise = to.path.includes(ENTERPRISE_PATH)
+  if (!isEnterprise && to.path !== '/enterpriseVerification' && !hasRoute(to.path)) {
+    next('/404')
+  }
+  localStorage.setItem('routerTest', to.path) // 本地环境保存代码热更新会导致路径缺失问题
   // 获取商城装修模版
   const mallStore = useMallStore()
   const enterpriseStore = useEnterpriseStore()
@@ -27,8 +40,6 @@ router.beforeEach(async (to, from, next) => {
   }
   
   const tokenIndex = getIsEnterprise() ? 1: 2
-  start()
-  // loadStart()
   if (to.path === '/enterpriseVerification') {
     const res = JSON.parse(localStorage.getItem('emailLoginInfo') || "false")
     const obj = res ? { ...res, type: 'emailLogin' } : {}
@@ -41,23 +52,48 @@ router.beforeEach(async (to, from, next) => {
     return
   }
   if (getToken(tokenIndex)) {
-    if (tokenIndex === 1) { // 获取企业路由
+    if (isEnterprise) {
+      // 获取企业路由
       if (!enterpriseStore.enterpriseMenu || !enterpriseStore.enterpriseMenu.length ) {
         const { menus } = await enterpriseStore.getEnterpriseMenu()
         enterpriseStore.saveEnterpriseMenu(menus)
       }
+      // 渲染路由
       if (isRefresh) {
-        try {
-          isRefresh = false
-          const routes = enterpriseStore.assignEnterpriseMenu(enterpriseStore.enterpriseMenu)
-          routes.forEach(route => {
-            router.addRoute(route)
-          })
-          next({ ...to, replace: true })
-        } catch(error) {
-          console.log(error)
+        isRefresh = false
+        const routes = enterpriseStore.assignEnterpriseMenu(enterpriseStore.enterpriseMenu)
+        routes.forEach(route => {
+          router.addRoute(route)
+        })
+        // 判断是否存在路由
+        if (to.path !== ENTERPRISE_PATH && !hasRoute(to.path)) {
+          next('/404')
+          return
+        }
+        if (to.path === ENTERPRISE_PATH) {
+          next(findPath(routes))
+          // const firstPath = routes[0]
+          // if (!firstPath.children) {
+          //   next(firstPath.path)
+          // } else {
+          //   // 查找二级路由
+          //   next(routes[0].children[0].path)
+          // }
+          function findPath (nodes, root = '') {
+            const first = nodes[0]
+            const path = root + first.path
+            if (!first.children || !first.children.length) {
+              return path
+            }
+            return findPath(first.children, path + '/')
+          }
         }
-        // debugger
+        next({ ...to, replace: true })
+        return
+      }
+      // 判断是否存在路由
+      if (!hasRoute(to.path)) {
+        next('/404')
         return
       }
     }
@@ -86,19 +122,21 @@ router.beforeEach(async (to, from, next) => {
       }
     }
     if (to.fullPath === '/login') {
-      next({ path: '/recruitHome' })
+      next('/recruitHome')
+      return
     }
     // 获取字典信息
     // const dictStore = useDictStore()
     // dictStore.getDictTypeData()
     next()
+    return
   }
   if (to.meta?.loginType === 'personalCommon' || to.meta?.loginType === 'common') { // 路由不重定向
     next()
     return
   }
   if (to.meta?.loginType === 'enterprise') { // 没有企业token->去个人首页
-    next({ path: '/recruitHome' })
+    next('/recruitHome')
     return
   }
   next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页
@@ -110,6 +148,48 @@ router.afterEach((to) => {
   // loadDone()
 })
 
+
+function hasRoute (path) {
+  const routes = router.getRoutes()
+  // console.log(routes.filter(item => item.path.includes('/recruit/enterprise')))
+  // debugger
+  return routeFlattening(routes).some(_path => {
+    if (_path.includes(':')) {
+      const change = path.split('/')
+      const _change = _path.split('/')
+      if (change.length !== _change.length) {
+        return false
+      }
+      const res = _change.reduce((e, v, i) => {
+        if (v.includes(':')) {
+          e.push(true)
+          return e
+        }
+        e.push(change[i] === v)
+        return e
+      }, [])
+      return res.every(e => e)
+    }
+    // 检查常规路由或包含参数的路由  
+    return _path === path
+  })
+}
+
+/**
+ * @param {Array} routes
+ * @returns {Array}
+ * 路由扁平化 抽离children字段
+ */
+function routeFlattening (routes) {
+  return routes.reduce((prev, cur) => {
+    prev.push(cur.path)
+    if (cur.children && cur.children.length) {
+      prev.push(...routeFlattening(cur.children))
+    }
+    return prev
+  }, [])
+}
+
 // router.onError(error => {
 //   const fetchResourcesErrors = ['Failed to fetch dynamically imported module', 'Importing a module script failed']
 //    if (fetchResourcesErrors.some((item) => error?.message && error.message?.includes(item))) {

+ 0 - 7
src/router/modules/common.js

@@ -55,13 +55,6 @@ const common = [
           title: '注册新企业'
         },
       },
-      {
-        path: '/recruit/entRegister/joiningEnterprise',
-        component: () => import('@/views/recruit/entRegister/joiningEnterprise'),
-        meta: {
-          title: '加入企业'
-        }
-      },
       {
         path: '/recruit/entRegister/inReview',
         component: () => import('@/views/recruit/entRegister/inReview.vue'),

+ 15 - 18
src/router/modules/components/recruit/enterprise.js

@@ -2,11 +2,13 @@
 import Layout from '@/layout/enterprise.vue'
 
 const enterprise = [
-  {
-    path: '/enterprise', // 企业账号登录时,缺省进去企业路由,防止用户在地址栏直接输入地址访问其他页面(不可删,permission中用到)
-    show: true,
-    redirect: '/recruit/enterprise',
-  },
+  // { path: '/enterprise', component: {template: '<div></div>'} }
+  // {
+  //   path: '/enterprise', // 企业账号登录时,缺省进去企业路由,防止用户在地址栏直接输入地址访问其他页面(不可删,permission中用到)
+  //   show: true,
+  //   redirect: '/recruit/enterprise/position',
+  //   component: {template: '<div></div>'}
+  // },
   // { 不能重定向,用于切换企业登录拦截
   //   path: '/enterpriseVerification', // 切换企业后先校验是否具备必填信息
   //   show: true,
@@ -16,11 +18,6 @@ const enterprise = [
   //   // redirect: '/enterprise',
   // },
 
-  {
-    path: '/recruit/enterprise',
-    show: true,
-    redirect: '/recruit/enterprise/position',
-  },
   // {
   //   path: '/recruit/enterprise/position',
   //   component: Layout,
@@ -40,14 +37,14 @@ const enterprise = [
   //       },
   //       component: () => import('@/views/recruit/enterprise/positionManagement/index.vue')
   //     },
-  //     {
-  //       path: '/recruit/enterprise/position/add',
-  //       show: true,
-  //       meta: {
-  //         title: '新增职位'
-  //       },
-  //       component: () => import('@/views/recruit/enterprise/positionManagement/components/add.vue')
-  //     },
+      // {
+      //   path: '/recruit/enterprise/position/add',
+      //   show: true,
+      //   meta: {
+      //     title: '新增职位'
+      //   },
+      //   component: () => import('@/views/recruit/enterprise/positionManagement/components/add.vue')
+      // },
   //     {
   //       path: '/recruit/enterprise/position/edit',
   //       show: true,

+ 1 - 1
src/router/modules/recruit.js

@@ -101,7 +101,7 @@ const recruit = [
     children: [
       {
         path: '/pointsExchange',
-        component: () => import('@/views/mall copy/index.vue'),
+        component: () => import('@/views/mallCopy/index.vue'),
         name: 'pointsExchange',
         meta: {
           title: '门墩儿商城'

+ 4 - 4
src/router/modules/remaining.js

@@ -132,11 +132,12 @@ const remainingRouter = [
       title: '404'
     }
   },
+  // { path: '/enterpriseVerification', component: {template: '<div></div>'} },
   // {
   //   path: '/:path(.*)*',
   //   redirect: '/404',
   //   name: '404PageRedirect',
-  // },
+  // }
   // {
   //   path: '/:catchAll(.*)',
   //   redirect: '/404'
@@ -145,9 +146,8 @@ const remainingRouter = [
 setLoginType(remainingRouter, 'personalCommon') // 暂定:登录企业端不能访问personalCommon路由
 setLoginType(common, 'common') // common 没有身份,任何情况都能访问
 const routeArray = [
-  ...remainingRouter,
   ...recruit,
-  ...common
+  ...common,
+  ...remainingRouter
 ]
-
 export default routeArray

+ 18 - 2
src/store/enterprise.js

@@ -27,9 +27,20 @@ export const useEnterpriseStore = defineStore('enterpriseStore',
       MENU: 2,
       BUTTON: 3
     }
+
+    // const registerComponent = (componentPath) => {
+    //   for (const item in modules) {
+    //     if (item.includes(componentPath)) {
+    //       // 使用异步组件的方式来动态加载组件
+    //       // @ts-ignore
+    //       return defineAsyncComponent(modules[item])
+    //     }
+    //   }
+    // }
+
     // 动态加载路由函数  
     const assignEnterpriseMenu = (menuTree) => {  
-      const modules = import.meta.glob('../views/recruit/enterprise/**/*.{vue,tsx}')
+      const modules = import.meta.glob('../views/recruit/enterprise/**/*.vue')
       const modulesRoutesKeys = Object.keys(modules)
       const formatRoutes = (menu) => {
         return menu.map(item => {
@@ -49,10 +60,14 @@ export const useEnterpriseStore = defineStore('enterpriseStore',
   
           if (item.type === MENU_TYPE.MENU) {
             const index = modulesRoutesKeys.findIndex((ev) => ev.includes(data.component))
+            // console.log(modules[modulesRoutesKeys[index]])
             if (index > -1) {
               data.component = modules[modulesRoutesKeys[index]]
-              data.path = `/${item.path}`
             }
+            data.name = data.componentName
+            // if (data.path[0] !== '/') {
+            //   data.path = '/' + data.path
+            // }
           }
 
           // 如果有子菜单,递归调用  
@@ -68,6 +83,7 @@ export const useEnterpriseStore = defineStore('enterpriseStore',
     }  
 
     return {
+      menuType: MENU_TYPE,
       enterpriseMenu,
       assignEnterpriseMenu,
       clearEnterpriseMenu,

+ 8 - 0
src/store/system.js

@@ -43,6 +43,14 @@ export const useSystem = defineStore('system',
           text,
           to: _path.map((e, i) => _fullPath[i]).join('/')
         }
+        if (item.children && item.children.length) {
+          if (!item.children.find(e => e.path === 'index')) {
+            obj.to += `/${item.children[0].path}`
+            return obj
+          }
+          obj.to += '/index'
+          return obj
+        }
         return obj
       }).filter(e => e) || []
       if (arr?.length) {

+ 5 - 5
src/store/user.js

@@ -182,7 +182,7 @@ export const useUserStore = defineStore('user',
         await this.getEnterpriseUserAccountInfo()
         
         Snackbar.success(res?.type === 'emailLogin' ? '登录成功' : '切换成功')
-        let href = '/enterprise'
+        let href = '/recruit/enterprise'
         // 是否存在重定向
         if (localStorage.getItem('enterpriseRedirect')) {
           href = localStorage.getItem('enterpriseRedirect')
@@ -190,7 +190,7 @@ export const useUserStore = defineStore('user',
         }
         // 人才推荐不需要跳转
         if (!res.noJump) {
-          setTimeout(() => { window.location.href = href }, 1000)
+          window.location.href = href
         }
       },
       // 获取当前登录的企业用户信息
@@ -219,17 +219,17 @@ export const useUserStore = defineStore('user',
         try {
           const data = await getEnterpriseBaseInfo()
           if (data?.first === null || data?.first === false) { // null或者为false才弹
-            localStorage.setItem('checkEnterpriseBaseInfoFalseHref', '/recruit/enterprise/entInfoSetting')
+            localStorage.setItem('checkEnterpriseBaseInfoFalseHref', '/recruit/enterprise/systemManagement/entInfoSetting')
           }
           if (!data?.bizFlag) {  // 企业登录免费职位广告提示,除了true都弹窗
             localStorage.setItem('positionAd', 'showPositionAd')
           }
           // // 检验必填信息
           // const keyArr = ['industryId', 'financingStatus', 'scale', 'introduce', 'logoUrl'] // 必填信息列表
-          // let href = '/recruit/enterprise/entInfoSetting'
+          // let href = '/recruit/enterprise/systemManagement/entInfoSetting'
           // const valid = Object.keys(data).length && keyArr.every(e => {
           //   const bool = data[e] && data[e] !== 0
-          //   if (!bool && e === 'logoUrl') href = '/recruit/enterprise/entInfoSetting?tabKey=2'
+          //   if (!bool && e === 'logoUrl') href = '/recruit/enterprise/systemManagement/entInfoSetting?tabKey=2'
           //   return bool
           // })
           // if (!valid) {

+ 1 - 1
src/styles/index.css

@@ -241,7 +241,7 @@
 }
 
 .card-box {
-  width: 100%;
+  min-width: calc(100vw - 272px);
   height: 100%;
   min-height: 70vh;
 }

File diff suppressed because it is too large
+ 0 - 0
src/styles/index.min.css


+ 2 - 1
src/styles/index.scss

@@ -170,7 +170,8 @@
 }
 
 .card-box {
-  width: 100%;
+  min-width: calc(100vw - 272px);
+  // width: 100%;
   height: 100%;
   min-height: 70vh;
 }

+ 0 - 0
src/views/mall copy/components/table.vue → src/views/mallCopy/components/table.vue


+ 1 - 1
src/views/mall copy/exchange.vue → src/views/mallCopy/exchange.vue

@@ -33,7 +33,7 @@ import { ref } from 'vue'
 import { getToken } from '@/utils/auth'
 import Dialog from '@/components/CtDialog'
 import Snackbar from '@/plugins/snackbar'
-import { redeemSubmit } from '@/api/mall copy'
+import { redeemSubmit } from '@/api/mallCopy'
 import { useUserStore } from '@/store/user'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { checkPersonBaseInfo } from '@/utils/check'

+ 1 - 1
src/views/mall copy/exchangeRecords.vue → src/views/mallCopy/exchangeRecords.vue

@@ -21,7 +21,7 @@
 <script setup>
 defineOptions({name: 'mall-exchangeRecords'})
 import { ref } from 'vue'
-import { getRedeemPage } from '@/api/mall copy'
+import { getRedeemPage } from '@/api/mallCopy'
 import { getToken } from '@/utils/auth'
 
 const total = ref(0)

+ 0 - 0
src/views/mall copy/index.vue → src/views/mallCopy/index.vue


+ 0 - 0
src/views/mall copy/purchasePackage/components/packageList.js → src/views/mallCopy/purchasePackage/components/packageList.js


+ 0 - 0
src/views/mall copy/purchasePackage/components/packageList.vue → src/views/mallCopy/purchasePackage/components/packageList.vue


+ 0 - 0
src/views/mall copy/purchasePackage/index.vue → src/views/mallCopy/purchasePackage/index.vue


+ 2 - 2
src/views/recruit/components/message/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="default-width message" :style="`height: calc(100vh - ${isEnterprise ? '130px' : '50px'});`">
+  <div class="message" :class="{'default-width': !isEnterprise}" :style="`height: calc(100vh - ${isEnterprise ? '130px' : '50px'});`">
     <div class="message-left d-flex flex-column">
       <div class="message-left-search d-flex align-center px-3 justify-space-between" >
         <div>
@@ -709,7 +709,7 @@ const handleSubmit = async () => {
 
 const router = useRouter()
 const handleToInterviewManagement = () => {
-  router.push('/recruit/enterprise/interviewManagement')
+  router.push('/recruit/enterprise/invite/interviewManagement')
 }
 
 // 企业-求简历

+ 0 - 117
src/views/recruit/entRegister/joiningEnterprise.vue

@@ -1,117 +0,0 @@
-<template>
-  <div class="pt-5">
-    <v-card class="default-width pa-5">
-      <!-- 标题 -->
-      <div class="resume-header">
-        <div class="resume-title">{{ $t('enterprise.joiningEnterprise') }}</div>
-      </div>
-      <!-- 表单 -->
-      <div class="CtFormClass" style="width: 600px;">
-        <CtForm ref="CtFormRef" :items="formItems" style="width: 100%;"></CtForm>
-      </div>
-      <div class="text-center">
-        <!-- 完成 -->
-        <v-btn
-          :loading="loginLoading"
-          color="primary" class="white--text mt-8" min-width="350"
-          @click="handleCommit"
-        >
-        {{ $t('common.complete') }}
-        </v-btn>
-      </div>
-      <!-- 底部 -->
-      <div class="text-center mt-5">
-        <v-btn color="primary" variant="text" @click="router.push({ path: '/recruit/entRegister' })">{{ $t('enterprise.registeringNewEnterprise') }}</v-btn>
-      </div>
-    </v-card>
-  </div>
-</template>
-
-<script setup>
-import CtForm from '@/components/CtForm'
-import { enterpriseSearchByName } from '@/api/recruit/personal/resume'
-import { useRouter } from 'vue-router'
-import Snackbar from '@/plugins/snackbar'
-import { useI18n } from '@/hooks/web/useI18n'
-import { ref } from 'vue'
-
-defineOptions({name: 'enterprise-enterpriseRegister-joiningEnterprise'})
-const router = useRouter()
-const loginLoading = ref(false)
-const { t } = useI18n()
-
-// 企业名称下拉列表
-const getSchoolListData = async (name) => {
-  const item = formItems.value.options.find(e => e.key === 'enterpriseId')
-  if (!item) return
-  const data = await enterpriseSearchByName({ name })
-  item.items = data
-}
-
-const formItems = ref({
-  options: [
-    {
-      type: 'autocomplete',
-      key: 'enterpriseId',
-      value: null,
-      default: null,
-      label: '企业名称 *',
-      outlined: true,
-      clearable: true,
-      itemText: 'value',
-      itemValue: 'key',
-      rules: [v => !!v || '请选择企业名称'],
-      search: getSchoolListData,
-      items: []
-    },
-    {
-      type: 'text',
-      key: 'email',
-      value: '',
-      label: '职务 *',
-      rules: [v => !!v || '请输入职务']
-    },
-    {
-      type: 'text',
-      key: 'name',
-      value: '',
-      label: '姓名 *',
-      counter: 15,
-      rules: [v => !!v || '请输入姓名']
-    },
-  ]
-})
-
-// 提交
-const handleCommit = () => {
-  Snackbar.success(t('common.submittedSuccessfully'))
-  setTimeout(() => {
-    router.push({ path: '/recruit/enterprise' })
-  }, 3000);
-}
-</script>
-<style lang="scss" scoped>
-.CtFormClass {
-  margin: 0 auto;
-}
-.note {
-  color: var(--color-666);
-  font-size: 14px;
-  line-height: 32px;
-}
-.file-input-box {
-  position: relative;
-  height: 80px;
-  width: 100px;
-  border: 1px solid rgb(188, 188, 188);
-  border-radius: 5px;
-  cursor: pointer;
-  .icon {
-    position: absolute;
-    top: 45%;
-    left: 50%;
-    transform: translate(-50%, -50%);
-    color: var(--color-999);
-  }
-}
-</style>

+ 1 - 1
src/views/recruit/enterprise/hirePosition/components/add.vue

@@ -125,7 +125,7 @@ if (route.query && route.query.id) {
 // 取消
 const handleCancel = () => {
   itemData.value = {}
-  router.push({ path: '/recruit/enterprise/hirePosition' })
+  router.push({ path: '/recruit/enterprise/hirePosition/index' })
   // 新增职位发布需更新账户信息
   if (route.query && !route.query?.id) {
     setTimeout(async () => {

+ 2 - 2
src/views/recruit/enterprise/hirePosition/components/item.vue

@@ -115,7 +115,7 @@ const paySuccess = async () => {
   //   handleAction(1, operateObj.value)
   // }
   setTimeout(() => {
-    emit('refresh')
+    emit('refresh', 1)
   }, 1000)
 }
 
@@ -186,7 +186,7 @@ const handleDetail = async (val) => {
 
 // 查看职位投递简历
 const handleToResume = (val) => {
-  router.push(`/recruit/enterprise/resume?id=${val.id}&hire=1`)
+  router.push(`/recruit/enterprise/invite/resume?id=${val.id}&hire=1`)
 }
 </script>
 

+ 2 - 2
src/views/recruit/enterprise/interviewManagement/index.vue

@@ -79,8 +79,8 @@ const query = ref({
 })
 const positionItems = ref([])
 
-const jobItem = ref({ width: 300, items: positionItems, clearable: true, hireDetails: true, label: '职位' })
-const statusItem = ref({ width: 300, items: statusList, clearable: true, hireDetails: true, label: '面试状态' })
+const jobItem = ref({ width: 300, items: positionItems, clearable: true, hideDetails: true, label: '职位' })
+const statusItem = ref({ width: 300, items: statusList, clearable: true, hideDetails: true, label: '面试状态' })
 
 // 获取有面试的日期列表
 const markers = ref([])

+ 3 - 2
src/views/recruit/enterprise/jobFair/editJob.vue → src/views/recruit/enterprise/jobFair/editJob/index.vue

@@ -17,7 +17,7 @@
 <script setup>
 defineOptions({ name: 'editJob' })
 import { ref } from 'vue'
-import {  useRoute, useRouter } from 'vue-router'
+import { useRoute, useRouter } from 'vue-router'
 import CtForm from '@/components/CtForm'
 import Add from '@/views/recruit/enterprise/positionManagement/components/add.vue'
 import { useI18n } from '@/hooks/web/useI18n'
@@ -29,6 +29,7 @@ import {
 } from '@/api/recruit/enterprise/jobFair'
 import Snackbar from '@/plugins/snackbar'
 
+
 const { t } = useI18n()
 const route = useRoute()
 const router = useRouter()
@@ -156,7 +157,7 @@ const afterAdd = async (jobId) => {
       jobId
     })
     Snackbar.success(t('common.publishSuccessMsg'))
-    router.push(`/recruit/enterprise/jobFair/details/${route.params.id}`)
+    router.push(`/recruit/enterprise/jobFair/details/${route.params.id}/index`)
   } catch (error) {
     console.error(error)
     Snackbar.error(error)

+ 1 - 1
src/views/recruit/enterprise/jobFair/index.vue

@@ -36,7 +36,7 @@ getList()
 const handleBlockEnterprise = async (id) => {
   const data = await getCheckJobFairPermission(id)
   if (!data) return Snackbar.warning('您没有权限参加该招聘会') // 只有返回true才能进入双选会
-  router.push(`/recruit/enterprise/jobFair/details/${id}`)
+  router.push(`/recruit/enterprise/jobFair/details/${id}/index`)
 }
 </script>
 

+ 1 - 1
src/views/recruit/enterprise/membershipPackage/dynamic/balance.vue

@@ -304,7 +304,7 @@ const remainderCalc = () => {
 }
 
 const handleToOrder = () => {
-  router.push('/recruit/enterprise/tradingOrder?key=tab_recharge')
+  router.push('/recruit/enterprise/financialCenter/tradingOrder?key=tab_recharge')
 }
 
 const mlArr = [119, 344, 567, 791, 1298, 1298, 1298, 1298]

+ 2 - 2
src/views/recruit/enterprise/membershipPackage/dynamic/package-copy.vue

@@ -179,8 +179,8 @@ const fromName = ref(route.query?.fromName || '')
 const callBackUrl = () => {
   // if (!fromName.value) return
   const urls = {
-    position: '/recruit/enterprise/position',
-    positionPay: '/recruit/enterprise/position?tab=0',
+    position: '/recruit/enterprise/position/index',
+    positionPay: '/recruit/enterprise/position/index?tab=0',
   }
   const texts = {
     position: '职位管理页面',

+ 2 - 2
src/views/recruit/enterprise/membershipPackage/dynamic/package.vue

@@ -152,8 +152,8 @@ const updateAccountInfo = async (init = false) => {
 const fromName = ref(route.query?.fromName || '')
 const callBackUrl = () => {
   const urls = {
-    position: '/recruit/enterprise/position',
-    positionPay: '/recruit/enterprise/position?tab=0',
+    position: '/recruit/enterprise/position/index',
+    positionPay: '/recruit/enterprise/position/index?tab=0',
   }
   const texts = {
     position: '职位管理页面',

+ 2 - 2
src/views/recruit/enterprise/positionManagement/components/add.vue

@@ -164,7 +164,7 @@ const handlePayClose = () => {
   Snackbar.warning('您已取消支付')
   itemData.value = {}
   showConfirmPaymentDialog.value = false
-  router.push({ path: '/recruit/enterprise/position', query: { key: 0 }})
+  router.push({ path: '/recruit/enterprise/position/index', query: { key: 0 }})
 }
 
 // 获取编辑的职位详情
@@ -183,7 +183,7 @@ if (route.query && route.query.id) {
 const handleCancel = () => {
   itemData.value = {}
   const currentPage = router.currentRoute.value.path
-  router.push({ path: currentPage.indexOf('jobFair') !== -1 ? '/recruit/enterprise/jobFair' : '/recruit/enterprise/position' })
+  router.push({ path: currentPage.indexOf('jobFair') !== -1 ? '/recruit/enterprise/jobFair/index' : '/recruit/enterprise/position/index' })
   // 新增职位发布需更新账户信息
   if (route.query && !route.query?.id) {
     setTimeout(async () => {

+ 1 - 1
src/views/recruit/enterprise/positionManagement/components/item.vue

@@ -290,7 +290,7 @@ const handleDetail = async (val) => {
 
 // 查看职位投递简历
 const handleToResume = (val) => {
-  router.push(`/recruit/enterprise/resume?id=${val.id}`)
+  router.push(`/recruit/enterprise/invite/resume?id=${val.id}`)
 }
 </script>
 

+ 1 - 1
src/views/recruit/enterprise/positionManagement/index.vue

@@ -17,7 +17,7 @@
       </div>
       <div class="color-666 font-size-14">
         <span>可发布职位数 <strong class="color-primary">{{ baseInfo?.entitlement?.publishJobCount || 0 }}</strong> 个, </span>
-        <span class="color-primary border-bottom-primary cursor-pointer" @click="router.push('/recruit/enterprise/membershipPackage?fromName=position')">可发布职位数不够用?点击去购买</span>
+        <span class="color-primary border-bottom-primary cursor-pointer" @click="router.push('/recruit/enterprise/membershipPackage/index?fromName=position')">可发布职位数不够用?点击去购买</span>
       </div>
       
       <div class="mt-3">

+ 2 - 2
src/views/recruit/enterprise/resume/components/table.vue

@@ -216,7 +216,7 @@ const handleToCommunicate = async (item) => {
   if (item?.jobClosed) return // 职位已关闭
   const userId = item.userId
   await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  let url = `/recruit/enterprise/invite/chatTools?id=${userId}`
   router.push(url)
 }
 
@@ -249,7 +249,7 @@ const handleSettlement = async (item) => {
 }
 
 const handleToInterviewManagement = () => {
-  router.push('/recruit/enterprise/interviewManagement')
+  router.push('/recruit/enterprise/invite/interviewManagement')
 }
 
 // 下载附件

+ 2 - 2
src/views/recruit/enterprise/search/recommend/index.vue

@@ -177,7 +177,7 @@ const handleCommunicate = async (item) => {
   const userId = item.userId
   if (!userId) return
   await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  let url = `/recruit/enterprise/invite/chatTools?id=${userId}`
   router.push(url)
 }
 
@@ -188,7 +188,7 @@ const handleToPersonDetail = ({ userId }) => {
 }
 
 const handleToInterviewManagement = () => {
-  router.push('/recruit/enterprise/interviewManagement')
+  router.push('/recruit/enterprise/invite/interviewManagement')
 }
 
 const badgeColor = computed(() => (item) => {

+ 2 - 2
src/views/recruit/enterprise/search/retrieval/index.vue

@@ -405,7 +405,7 @@ const handleCommunicate = async (item) => {
   const userId = item.userId
   if (!userId) return
   await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  let url = `/recruit/enterprise/invite/chatTools?id=${userId}`
   router.push(url)
 }
 
@@ -436,7 +436,7 @@ const handleSubmit = async () => {
 }
 
 const handleToInterviewManagement = () => {
-  router.push('/recruit/enterprise/interviewManagement')
+  router.push('/recruit/enterprise/invite/interviewManagement')
 }
 
 // 人才详情

+ 5 - 4
src/views/recruit/enterprise/staffChangePassword/index.vue

@@ -109,10 +109,11 @@ const handleCommit = async () => {
   Snackbar.success('修改成功')
   if (props.entChangePassword) {
     localStorage.setItem('entUpdatePassword', 'doNotNeedChange')
-    setTimeout(() => {
-      loading.value = false
-      window.location.href = '/recruit/enterprise'
-    }, 1500)
+    loading.value = false
+    // setTimeout(() => {
+    //   loading.value = false
+    //   window.location.href = '/enterprise'
+    // }, 1500)
   } else {
     loading.value = false
     router.go(-1)

+ 1 - 1
src/views/recruit/enterprise/staffInfoSetting/index.vue

@@ -19,7 +19,7 @@
       </template>
     </CtForm>
     <v-btn class="buttons mt-5" color="primary" @click.stop="handleSubmit">{{ $t('common.save') }}</v-btn>
-    <v-btn class="mt-3" color="primary" variant="text" to="/recruit/enterprise/staffChangePassword">修改登录密码</v-btn>
+    <v-btn class="mt-3" color="primary" variant="text" to="/recruit/enterprise/systemManagement/staffChangePassword">修改登录密码</v-btn>
   </v-card>
 
   <Loading :visible="overlay"></Loading>

+ 2 - 2
src/views/recruit/enterprise/statistics/overallAnalysis.vue

@@ -1,6 +1,6 @@
 <template>
   <v-card class="card-box pa-5">
-    <div class="d-flex color-666 font-size-14">
+    <div class="d-flex color-666 font-size-14 align-center">
       <div class="d-flex align-center" style="min-width: 358px;">
         <span>选择时间</span>
         <div class="ml-5 after">
@@ -71,7 +71,7 @@ const selectItems = ref({
   itemText: 'name',
   itemValue: 'id',
   clearable: true,
-  hireDetails: true,
+  hideDetails: true,
   items: []
 })
 

+ 41 - 59
src/views/recruit/enterprise/systemManagement/groupAccount/index.vue

@@ -1,38 +1,34 @@
 <template>
   <v-card class="card-box d-flex pa-3">
-    <v-row no-gutters justify="space-between">
-      <v-col cols="2">
-        <div class="d-flex justify-start pr-3">
-          <v-btn prepend-icon="mdi-plus" variant="text" density="compact" color="primary" @click="handleAdd(1)">{{ $t('enterprise.userManagement.addBranchOffice') }}</v-btn>
-        </div>
-        <v-treeview
-          :items="treeData"
-          activatable
-          color="primary"
-          item-value="id"
-          open-all
-          open-strategy="single"
-          density="compact"
-          @update:activated="handleClick"
-          @update:opened="handleClick"
-        >
-          <template v-slot:title="{ item }">
-            <div class="treeTitle font-size-15">
-              {{ formatName(item.anotherName || item.name) }}
-              <v-tooltip activator="parent" location="end">{{ formatName(item.anotherName || item.name) }}</v-tooltip>
-            </div>
-          </template>
-        </v-treeview>
-      </v-col>
-
-      <v-divider vertical></v-divider>
-
-      <v-col class="ml-10" cols="9">
-        <div class="d-flex justify-space-between px-3">
-          <TextInput v-model="query.name" :item="textItem" @change="getUserList"></TextInput>
-          <v-btn prepend-icon="mdi-plus" color="primary" @click="handleAdd(0)">{{ $t('enterprise.userManagement.inviteNewColleagues') }}</v-btn>
-        </div>
-        <CtTable
+    <div style="width: 20%; border-right: 1px solid #ccc;">
+      <div class="d-flex justify-start pr-3">
+        <v-btn prepend-icon="mdi-plus" variant="text" density="compact" color="primary" @click="handleAdd(1)">{{ $t('enterprise.userManagement.addBranchOffice') }}</v-btn>
+      </div>
+      <v-treeview
+        :items="treeData"
+        activatable
+        color="primary"
+        item-value="id"
+        open-all
+        open-strategy="single"
+        density="compact"
+        @update:activated="handleClick"
+        @update:opened="handleClick"
+      >
+        <template v-slot:title="{ item }">
+          <div class="treeTitle font-size-15">
+            {{ formatName(item.anotherName || item.name) }}
+            <v-tooltip activator="parent" location="end">{{ formatName(item.anotherName || item.name) }}</v-tooltip>
+          </div>
+        </template>
+      </v-treeview>
+    </div>
+    <div style="width: 80%" class="ml-3">
+      <div class="d-flex justify-space-between px-3">
+        <TextInput v-model="query.name" :item="textItem" @change="getUserList"></TextInput>
+        <v-btn prepend-icon="mdi-plus" class="elevation-5" color="primary" @click="handleAdd(0)">{{ $t('enterprise.userManagement.inviteNewColleagues') }}</v-btn>
+      </div>
+      <CtTable
           :items="tableData"
           :headers="headers"
           :loading="loading"
@@ -56,9 +52,8 @@
             <v-btn v-if="item.status === '0' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 1, item)">{{ $t('enterprise.userManagement.disable') }}</v-btn>
             <v-btn v-if="item.status === '0' && item.userType !== '1' && item.enterpriseId.toString() === enterpriseInfo?.enterpriseId.toString()" color="primary" variant="text" @click="handleRole(item)">分配角色</v-btn>
           </template>
-        </CtTable>
-      </v-col>
-    </v-row>
+      </CtTable>
+    </div>
   </v-card>
 
   <CtDialog :visible="showEdit" :widthType="2" titleClass="text-h6" title="编辑员工基本信息" @close="showEdit = false; editId = null" @submit="handleSubmit">
@@ -96,7 +91,7 @@
 
 <script setup>
 defineOptions({ name: 'group-account'})
-import { ref, computed } from 'vue'
+import { ref } from 'vue'
 import { useI18n } from '@/hooks/web/useI18n'
 import { timesTampChange } from '@/utils/date'
 import { getEnterpriseTree } from '@/api/recruit/enterprise/system/group'
@@ -183,8 +178,6 @@ const roleForm = ref({
   ]
 })
 
-
-
 // 获取用户列表
 const getUserList = async () => {
   loading.value = true
@@ -199,12 +192,15 @@ const getUserList = async () => {
 
 // 获取树形列表
 const getTreeData = async () => {
-  const data = await getEnterpriseTree()
-  if (!data) return
-  treeData.value = [data]
-  query.value.enterpriseId = data.id
-  // 获取用户列表
-  getUserList()
+  treeData.value = []
+  try {
+    const data = await getEnterpriseTree()
+    if (!data) return
+    treeData.value[0] = data
+    query.value.enterpriseId = data.id
+    // 获取用户列表
+    getUserList()
+  } catch {}
 }
 getTreeData()
 
@@ -254,14 +250,6 @@ const formItems = ref({
       key: 'avatar',
       value: null
     },
-    // {
-    //   type: 'ifRadio',
-    //   key: 'sex',
-    //   value: '',
-    //   label: '性别 *',
-    //   width: 90,
-    //   items: []
-    // },
     {
       type: 'text',
       key: 'name',
@@ -302,11 +290,6 @@ const formItems = ref({
     }
   ]
 })
-// getDict('menduner_sex').then(({ data }) => {
-//   data = data?.length && data || []
-//   formItems.value.options.find(e => e.key === 'sex').items = data
-// })
-
 
 // 编辑员工信息
 const showEdit = ref(false)
@@ -400,7 +383,6 @@ const handleSubmit = async () => {
     id: editId.value
   } 
   formItems.value.options.forEach(e => { obj[e.key] = e.value })
-  // if (!obj.sex || obj.sex === '0') return Snackbar.warning('请选择员工性别')
   await updateGroupUserAccount(obj)
   showEdit.value = false
   editId.value = null

+ 0 - 6
src/views/recruit/enterprise/systemManagement/roleManagement/components/DataPermission.vue

@@ -112,7 +112,6 @@ const handleExpand = (val) => {
   }
 }
 
-
 const getTypeDict = async () => {
   const { data } = await getDict('mde_data_scope', null)
   items.value = data
@@ -120,7 +119,6 @@ const getTypeDict = async () => {
 }
 
 const init = async () => {
-
   // 重置
   deptExpand.value = true
   checkStrictly.value = true
@@ -148,10 +146,6 @@ const handleChangeSelect = async () => {
     }
   }
 }
-
-
-
-
 getTypeDict()
 
 const submit = () => {

+ 59 - 55
src/views/recruit/enterprise/systemManagement/roleManagement/index.vue

@@ -1,16 +1,15 @@
 <template>
-  <v-card class="pa-5 card-box">
-    <div class="d-flex justify-space-between">
-      <div class="d-flex mb-3">
-        <CtTextField class="mr-3" v-model="query.name" v-bind="nameItem"></CtTextField>
-        <CtTextField class="mr-3" v-model="query.code" v-bind="codeItem"></CtTextField>
-        <Autocomplete v-model="query.status" :item="statusItem"></Autocomplete>
-        <v-btn color="primary" class="half-button ml-3" @click="handleSearch">查 询</v-btn>
-        <v-btn class="half-button mx-3" variant="outlined" color="primary" @click="handleReset">重 置</v-btn>
-      </div>
-    </div>
+  <CtFilter :items="formItems" @reset="handleReset" @search="handleSearch">
+    <template #appendBtn>
+      <v-btn class="ml-3 elevation-5" color="primary" @click="handleAdd">
+        <v-icon left>mdi-plus</v-icon>
+        {{ t('common.add') }} 
+      </v-btn>
+    </template>
+  </CtFilter>
+
+  <v-card class="pa-5 card-box mt-3">
     <CtTable
-      class="mt-3"
       :items="items"
       :headers="headers"
       :loading="loading"
@@ -18,7 +17,7 @@
       :total="total"
       :page-info="pageInfo"
       itemKey="id"
-      @add="handleAdd"
+      :isTools="false"
       @pageHandleChange="handleChangePage"
     >
       <template #status="{ item }">
@@ -84,29 +83,40 @@ const dataItem = ref(null)
 const loadingData = ref(false)
 const dataPermissionRef = ref()
 
-const nameItem = ref({
-  width: 300,
-  clearable: true,
-  hireDetails: true,
-  label: '角色名称',
-  variant: 'outlined',
-  density: 'compact',
-  color: 'primary',
-  placeholder: '请输入角色名称'
+// 检索框
+const formItems = ref({
+  options: [
+		{
+      type: 'text',
+      key: 'name',
+      value: '',
+      label: '角色名称',
+			clearable: true,
+			hideDetails: true,
+			width: 200
+    },
+		{
+      type: 'text',
+      key: 'code',
+      value: '',
+      label: '角色标识',
+			clearable: true,
+			hideDetails: true,
+			width: 200
+    },
+    {
+      type: 'autocomplete',
+      key: 'status',
+      value: null,
+      label: '状态',
+      clearable: true,
+			hideDetails: true,
+      items: [],
+      width: 200
+    }
+  ]
 })
 
-const codeItem = ref({
-  width: 300,
-  clearable: true,
-  hireDetails: true,
-  label: '角色标识',
-  variant: 'outlined',
-  density: 'compact',
-  color: 'primary',
-  placeholder: '请输入角色标识'
-})
-const statusItem = ref({ width: 300, items: [], clearable: true, hireDetails: true, label: '状态', placeholder: '请选择状态' })
-
 const query = ref({
   name: null,
   status: null,
@@ -118,19 +128,19 @@ const pageInfo = ref({
 })
 
 const headers = [
-  { title: '角色编号', key: 'id', align: 'left' },
-  { title: '角色名称', key: 'name' },
-  { title: '角色标识', key: 'code' },
-  { title: '显示顺序', key: 'sort', align: 'center' },
-  { title: '备注', key: 'remark' },
-  { title: '状态', key: 'status', align: 'center' },
-  { title: '创建时间', key: 'createTime', value: (e) => formatDate(e.createTime, 'YYYY-MM-DD HH:mm:ss') },
-  { title: t('common.actions'), key: 'actions' }
+  { title: '角色编号', key: 'id', align: 'left', sortable: false },
+  { title: '角色名称', key: 'name', sortable: false },
+  { title: '角色标识', key: 'code', sortable: false },
+  { title: '显示顺序', key: 'sort', align: 'center', sortable: false },
+  { title: '备注', key: 'remark', sortable: false },
+  { title: '状态', key: 'status', align: 'center', sortable: false },
+  { title: '创建时间', key: 'createTime', value: (e) => formatDate(e.createTime, 'YYYY-MM-DD HH:mm:ss'), sortable: false },
+  { title: t('common.actions'), key: 'actions', sortable: false }
 ]
 // 字典
 const getStatusDict = async () => {
   const { data } = await getDict('menduner_status', null)
-  statusItem.value.items = data || []
+  formItems.value.options.find(e => e.key === 'status').items = data || []
   getPage()
 }
 // 列表
@@ -139,7 +149,7 @@ const getPage = async () => {
   try {
     const res = await getRolePage({ ...pageInfo.value, ...query.value })
     items.value = res.list.map(e => {
-      e.statusName = statusItem.value.items.find(_e => _e.value === e.status)?.label ?? ''
+      e.statusName = formItems.value.options.find(e => e.key === 'status').items.find(_e => _e.value === e.status)?.label ?? ''
       return e
     })
     total.value = res.total
@@ -148,18 +158,16 @@ const getPage = async () => {
   }
 }
 // 检索
-const handleSearch = () => {
+const handleSearch = (obj) => {
   pageInfo.value.pageNo = 1
+  query.value = obj
   getPage()
 }
 // 重置
-const handleReset = () => {
-  query.value = {
-    name: null,
-    status: null,
-    code: null
-  }
-  handleSearch()
+const handleReset = (obj) => {
+  pageInfo.value.pageNo = 1
+  query.value = obj
+  getPage()
 }
 // 新增
 const handleAdd = () => {
@@ -234,7 +242,3 @@ const handleSubmitData = async () => {
 getStatusDict()
 
 </script>
-
-<style scoped lang="scss">
-
-</style>

+ 1 - 1
src/views/recruit/enterprise/talentPool/components/details.vue

@@ -115,7 +115,7 @@ const handleCommunicate = async (item) => {
   const userId = cvData.value.person.userId
   if (!userId) return
   await talkToUser({userId, text: defaultTextEnt})
-  let url = `/recruit/enterprise/chatTools?id=${userId}`
+  let url = `/recruit/enterprise/invite/chatTools?id=${userId}`
   router.push(url)
 }
 

+ 1 - 1
src/views/recruit/enterprise/talentPool/components/details/dict.js

@@ -72,7 +72,7 @@ export const dealJobData = (list) => {
       if (item.isArray) {
         if (e[item.key] && e[item.key].length) {
           const result = e[item.key].map(val => {
-            return obj = dictObj[item.value].find(i => i[item.itemKey] === val)
+            return obj = dictObj[item.value].find(i => Number(i[item.itemKey]) === Number(val))
           })
           e[item.label] = result && result.length ? result.filter(Boolean) : []
         }

+ 5 - 6
src/views/recruit/enterprise/talentPool/components/details/jobIntention.vue

@@ -11,11 +11,13 @@
         <div v-if="!k.payFrom && !k.payTo">面议</div>
         <div v-else>{{k.payFrom ? k.payFrom + '-' : ''}}{{k.payTo}}</div>
         <div class="line">|</div>
-        <div class="grey-text text-box">{{ k.industry?.map(e => e.nameCn).join('、') }}</div>
+        <div class="color-999 text-truncate" style="max-width: 300px;">{{ k.industry?.map(e => e.nameCn).join('、') }}</div>
         <div class="line" v-if="k.industry?.length">|</div>
-        <div class="grey-text">{{ k.jobTypeName }}</div>
+        <div class="color-999">{{ k.jobTypeName }}</div>
         <div class="line" v-if="k.jobTypeName && k.workArea">|</div>
-        <div class="grey-text">{{ k.workArea }}</div>
+        <div class="color-999 text-truncate" style="max-width: 160px;">
+          {{ k.interestedArea && k.interestedArea.length ? k.workArea + ',' + k.interestedArea.map(e => e.name).join(',') : k.workArea }}
+        </div>
       </div>
     </div>
   </div>
@@ -47,9 +49,6 @@ if (props.data?.length) interestList.value = dealJobData(props.data)
   span {
     font-size: 15px;
   }
-  .grey-text {
-    color: var(--color-999);
-  }
   .line {
     color: #e0e0e0;
     margin: 0 10px;

+ 1 - 1
src/views/recruit/personal/PersonalCenter/resume/blockEnt/index.vue

@@ -91,7 +91,7 @@ const item = ref({
   label: '请输入企业名称搜索',
   outlined: true,
   clearable: true,
-  hireDetails: true,
+  hideDetails: true,
   itemText: 'value',
   itemValue: 'key',
   width: '400',

Some files were not shown because too many files changed in this diff