Browse Source

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

Xiao_123 8 months ago
parent
commit
d078aad5e8

+ 6 - 1
src/components/FormUI/TextInput/index.vue

@@ -30,6 +30,7 @@
       @keyup.enter="handleKeyup"
       @click:clear="handleClear"
       @blur="handleBlur"
+      @focus="handleFocus"
     >
       <slot name="default"></slot>
     </v-text-field>
@@ -42,7 +43,7 @@ import { ref, watch } from 'vue';
 defineOptions({ name:'FormUI-v-text-field'})
 
 const props = defineProps({item: Object, modelValue: [String, Number]})
-const emit = defineEmits(['update:modelValue', 'change', 'appendClick', 'appendInnerClick', 'enter', 'blur'])
+const emit = defineEmits(['update:modelValue', 'change', 'appendClick', 'appendInnerClick', 'enter', 'blur', 'focus'])
 const item = props.item
 const value = ref(props.modelValue)
 const searchDebouncedTime = item?.searchDebouncedTime === 0 ? ref(0) : ref(500)
@@ -101,6 +102,10 @@ const handleBlur = () => {
   emit('blur', props.item, value.value)
 }
 
+const handleFocus = () => {
+  emit('focus', props.item, value.value)
+}
+
 const handleWheel = (event, item) => {
   if (item.type !== 'number') return
   event.preventDefault()

+ 2 - 0
src/components/FormUI/textArea/index.vue

@@ -11,6 +11,8 @@
       :validate-on="item.validateOn"
       :rows="item.rows || 3"
       :disabled="item.disabled"
+      :autofocus="item.autofocus"
+      :auto-grow="item.autoGrow"
       :density="item.dense || 'compact'"
       :placeholder="item.placeholder || item.label"
       :no-resize="!item.resize"

+ 5 - 1
src/components/personalRecharge/initPay.vue

@@ -55,6 +55,10 @@ import { setWalletRecharge } from '@/api/recruit/personal/myWallet.js'
 import { onUnmounted, ref, nextTick, watch } from 'vue'
 const emit = defineEmits(['payTypeChange', 'paySuccess', 'stopInterval'])
 const props = defineProps({
+  returnUrl: {
+    type: String,
+    default: '/recruit/personal/personalCenter/wallet'
+  },
   info: {
     type: Object,
     default: () => ({ id: ''})
@@ -101,7 +105,7 @@ const payStatus = async () => {
         // getUnpaidOrderList() // 重新创建新的支付订单
         // 返回指定页面
         if (route.fullPath === props.returnUrl) router.go(0)
-        else if (props.returnUrl) router.push(props.returnUrl)
+        else if (props.returnUrl) router.push(props.returnUrl) // 跳转到充值记录
         Snackbar.success('支付成功')
       }, 2000);
     }

+ 5 - 3
src/layout/enterprise.vue

@@ -67,9 +67,11 @@ const getTitle = (list) => {
     const text = item.meta.title
     const obj = { text,  to: item.path }
     return obj
-  }).filter(e => e)
-  arr[arr.length - 1].disabled = true
-  arr[arr.length - 1].link = true
+  }).filter(e => e) || []
+  if (arr?.length) {
+    arr[arr.length - 1].disabled = true
+    arr[arr.length - 1].link = true
+  }
   breadcrumbs.value = arr
 }
 

+ 7 - 4
src/layout/personal/navBar.vue

@@ -39,9 +39,13 @@
           <div class="d-flex align-center color-333" v-if="getToken()">
             <span class="cursor-pointer mr-5 commonHover" @click="handleSwitch">我要招聘</span>
             <span class="cursor-pointer commonHover" :class="{'active-route': routeActive === 6}" @click="router.push({ path: paths[6] })">
-              现金:{{ userAccount?.balance && userAccount?.balance > 0 ? (userAccount?.balance / 100.0).toFixed(2) : 0 }}
+              <span class="mr-3">
+                现金:{{ userAccount?.balance && userAccount?.balance > 0 ? (userAccount?.balance / 100.0).toFixed(2) : 0 }}
+                <span style="color: #00000000;">1</span>
+                积分:{{ userAccount?.point || 0 }}
+              </span>
+              <span class="mr-3 ml-3"></span>
             </span>
-            <span class="mr-3 ml-3 cursor-pointer commonHover" :class="{'active-route': routeActive === 7}" @click="router.push({ path: paths[7] })">积分:{{ userAccount?.point || 0 }}</span>
 
             <v-menu open-on-hover>
               <template v-slot:activator="{ props }">
@@ -152,8 +156,7 @@ const paths = [ // 有选中样式-路由列表
   '/recruit/personal/message', // 3
   '/recruit/personal/myWallet', // 4
   '/recruit/personal/personalCenter', // 5
-  '/recruit/personal/myWallet/myBalance', // 6
-  '/recruit/personal/myWallet/myIntegral', // 7
+  '/recruit/personal/personalCenter/wallet', // 6
 ]
 
 const navList = [

+ 1 - 1
src/views/integral/pointsManagement/components/integralShow.vue

@@ -6,8 +6,8 @@
         <div>
           <span class="ml-10 item-title">{{ val.title }}</span>
           <span v-if="val.showRules" class="ml-5 rules cursor-pointer" @click="integralRulesClick">
-            <v-icon>mdi-help-circle-outline</v-icon>
             {{ $t('points.integralRules') }}
+            <v-icon style="font-size: 16px; color: var(--color-666); line-height: 16px; margin-left: 1px;">mdi-help-circle-outline</v-icon>
           </span>
         </div>
         <div>

+ 1 - 1
src/views/login/components/passwordPage.vue

@@ -73,7 +73,7 @@ const loginData = reactive({
 // 设置默认账号密码便于开发快捷登录
 if (window.location.hostname === 'localhost' || window.location.hostname === '192.168.3.152') {
   // loginData.phone = '18400000022@qq.com'
-  // loginData.password = '12345678'
+  // loginData.password = 'Citu123456'
   loginData.phone = '13229740092'
   loginData.password = 'Citu123456'
 }

+ 5 - 3
src/views/mall/index.vue

@@ -5,7 +5,10 @@
       <div class="statisticsBox">
         <div class="mt-2">
           <span style="font-size: 20px; color: var(--color-333); line-height: 28px; font-weight: bold;" class="ml-10">您当前可用积分</span>
-          <span style="font-size: 14px; color: var(--color-666); line-height: 24px; cursor: pointer;" class="ml-2" @click="toPointsDetails">积分明细</span>
+          <span @click="toPointsDetails" style="cursor: pointer;">
+            <span style="font-size: 14px; color: var(--color-666); line-height: 24px;" class="ml-2">积分明细</span>
+            <v-icon style="font-size: 16px; color: var(--color-666); line-height: 16px; margin-left: 2px;">mdi-help-circle-outline</v-icon>
+          </span>
         </div>
         <div class="d-flex justify-space-between align-end my-1">
           <span style="font-size: 42px; color: #10897bba; line-height: 50px;" class="ml-10 cursor-pointer" @click="toPointsDetails">{{ accountData.point }}</span>
@@ -40,8 +43,7 @@ import { useRouter } from 'vue-router'; const router = useRouter()
 defineOptions({name: 'personal-pointsMall'})
 
 const toPointsDetails = () => {
-  // '/recruit/personal/myWallet' : '/recruit/enterprise/memberCenter/myAccount'
-  router.push({ path: '/recruit/personal/myWallet' })
+  router.push({ path: '/recruit/personal/personalCenter/wallet' })
 }
 
 const getPositionList = () => {

+ 3 - 0
src/views/recruit/enterprise/membershipPackage/index.vue

@@ -6,6 +6,9 @@
       <v-tab :value="1" class="font-weight-bold font-size-18">当前套餐</v-tab>
     </v-tabs>
     <Package v-if="tab === 0"></Package>
+    <div v-if="tab === 1">
+      <empty :elevation="false" message="无购买的套餐内容" class="mt-15"></empty>
+    </div>
   </v-card>
 </template>
 

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

@@ -29,14 +29,14 @@
 <script setup>
 defineOptions({ name: 'information-setting'})
 import { ref } from 'vue'
-import { saveUserInfo, entUpdateEmail } from '@/api/enterprise'
+import { saveUserInfo } from '@/api/enterprise'
 import { uploadFile } from '@/api/common'
 import { useI18n } from '@/hooks/web/useI18n'
 import { getDict } from '@/hooks/web/useDictionaries'
 import { useUserStore } from '@/store/user'
 import Snackbar from '@/plugins/snackbar'
 import { getUserAvatar } from '@/utils/avatar'
-import { checkEmail } from '@/utils/validate'
+// import { checkEmail } from '@/utils/validate'
 
 const { t } = useI18n()
 const userStore = useUserStore()
@@ -85,22 +85,22 @@ const formItems = ref({
       value: '',
       label: '电子邮箱',
       disabled: true,
-      rules: [
-        value => {
-          if (value) return true
-          return '请输入联系邮箱'
-        },
-        value => {
-          if (checkEmail(value)) return true
-          return '请输入正确的电子邮箱'
-        }
-      ]
+      // rules: [
+      //   value => {
+      //     if (value) return true
+      //     return '请输入联系邮箱'
+      //   },
+      //   value => {
+      //     if (checkEmail(value)) return true
+      //     return '请输入正确的电子邮箱'
+      //   }
+      // ]
     }
   ]
 })
 
 // 用户基本信息
-let emailChange = false
+// let emailChange = false
 const baseInfo = ref(JSON.parse(localStorage.getItem('entBaseInfo')) || {})
 const query = ref({})
 // 获取字典数据以及字段回显
@@ -115,10 +115,10 @@ formItems.value.options.forEach(item => {
     item.value = baseInfo.value[item.key]
     query.value.id = baseInfo.value.id
   }
-  if (item.key === 'email') {
-    item.disabled = checkEmail(item.value)
-    emailChange = !item.disabled
-  }
+  // if (item.key === 'email') {
+  //   item.disabled = checkEmail(item.value)
+  //   emailChange = !item.disabled
+  // }
 })
 // 监听store变化
 userStore.$subscribe((mutation, state) => {
@@ -171,7 +171,7 @@ const handleSubmit = async () => {
     query.value[item.key] = item.value
   })
   await saveUserInfo(query.value)
-  if (query.value?.email && emailChange) await entUpdateEmail({ email: query.value.email })
+  // if (query.value?.email && emailChange) await entUpdateEmail({ email: query.value.email })
   setTimeout(async () => {
     await userStore.getEnterpriseInfo()
     Snackbar.success(t('common.submittedSuccessfully'))

+ 51 - 0
src/views/recruit/enterprise/systemManagement/groupAccount/index.vue

@@ -46,6 +46,7 @@
             <v-btn color="primary" variant="text" @click="handleBinding(item)">{{ $t('enterprise.userManagement.jobBinding') }}</v-btn>
             <v-btn v-if="item.status === '1' && item.userType !== '1'" color="primary" variant="text" @click="handleAction('', 0, item)">{{ $t('enterprise.userManagement.enable') }}</v-btn>
             <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 color="primary" variant="text" @click="handleChangeEmail(item)">修改员工邮箱</v-btn>
           </template>
         </CtTable>
       </v-col>
@@ -55,6 +56,9 @@
   <CtDialog :visible="show" :widthType="2" titleClass="text-h6" :title="$t('enterprise.userManagement.selectBinding')" @close="handleClose" @submit="handleSubmit">
     <CtForm ref="formPageRef" :items="formItems"></CtForm>
   </CtDialog>
+  <CtDialog :visible="showEditEmail" :widthType="2" titleClass="text-h6" title="修改员工邮箱" @close="showEditEmail = false" @submit="handleEditEmailSubmit">
+    <CtForm ref="editEmailFormRef" class="mt-3" :items="emailFormItems"></CtForm>
+  </CtDialog>
 </template>
 
 <script setup>
@@ -67,6 +71,8 @@ import { getEnterpriseTree } from '@/api/recruit/enterprise/system/group'
 import { getEnterpriseUserList, systemUserEnable, systemUserDisable, systemUserBindingPost } from '@/api/recruit/enterprise/system/user'
 import Confirm from '@/plugins/confirm'
 import Snackbar from '@/plugins/snackbar'
+import { checkEmail } from '@/utils/validate'
+import { entUpdateEmail } from '@/api/enterprise'
 // import { useRouter } from 'vue-router'; const router = useRouter()
 
 const { t } = useI18n()
@@ -208,6 +214,51 @@ const handleSubmit = async () => {
   handleClose()
   getUserList()
 }
+
+const emailFormItems = ref({
+  options: [
+    {
+      type: 'text',
+      key: 'email',
+      value: '',
+      label: '电子邮箱',
+      disabled: false,
+      rules: [
+        value => {
+          if (value) return true
+          return '请输入联系邮箱'
+        },
+        value => {
+          if (checkEmail(value)) return true
+          return '请输入正确的电子邮箱'
+        }
+      ]
+    }
+  ]
+})
+// 修改员工邮箱
+const showEditEmail = ref(false)
+const editEmailFormRef = ref()
+let editEmailItem = {}
+const handleChangeEmail = async (item) => {
+  emailFormItems.value.options.forEach(e => { if (item[e.key]) { e.value = item[e.key] } })
+  editEmailItem = item
+  showEditEmail.value = true
+}
+// 提交
+const handleEditEmailSubmit = async () => {
+  const { valid } = await editEmailFormRef.value.formRef.validate()
+  if (!valid) return
+  if (!editEmailItem?.id) return
+  const obj = { id: editEmailItem.id }
+  emailFormItems.value.options.forEach(e => { obj[e.key] = e.value })
+  await entUpdateEmail(obj)
+  setTimeout(async () => {
+    showEditEmail.value = false
+    getUserList()
+    Snackbar.success(t('common.submittedSuccessfully'))
+  }, 1000)
+}
 </script>
 
 <style scoped lang="scss">

+ 5 - 1
src/views/recruit/enterprise/talentMap/components/filter.vue

@@ -32,10 +32,12 @@ const formItems = ref({
       counter: 500,
       rows: 5,
       resize: true,
-      label: '匹配内容',
+      autoGrow: true,
+      label: '请输入匹配内容',
       placeholder: '请输入要匹配内容',
       clearable: true,
       outlined: true,
+      autofocus: false,
     },
     {
       type: 'autocomplete',
@@ -81,6 +83,8 @@ const resetValue = () => {
 const setValue = (query) => {
   formItems.value.options.forEach(e => {
     if (query[e.key] !== undefined) e.value = query[e.key]
+    // console.log('CtFormRef', CtFormRef.value)
+    // if (e.key === 'content') e.autofocus = true
   })
 }
 

+ 15 - 3
src/views/recruit/enterprise/talentMap/index.vue

@@ -1,8 +1,8 @@
 <template>
   <v-card class="card-box pa-5" style="height: 100%;">
-    <div class="d-flex justify-space-between">
-      <div></div>
-      <v-btn color="primary" class="half-button" variant="tonal" @click="openDrawer">职位匹配</v-btn>
+    <div class="d-flex justify-center">
+      <TextUI v-model="query.content" :item="textItem" @focus="openDrawer" @appendInnerClick="openDrawer"></TextUI>
+      <!-- <v-btn color="primary" class="half-button" variant="tonal" @click="openDrawer">职位匹配</v-btn> -->
     </div>
     <!-- 人员信息表单 -->
     <v-data-table
@@ -69,6 +69,8 @@ import { dealDictArrayData } from '@/utils/position'
 import { getUserAvatar } from '@/utils/avatar'
 import { timesTampChange } from '@/utils/date'
 import FilterPage from './components/filter.vue'
+import TextUI from '@/components/FormUI/TextInput'
+
 import { computed, reactive, ref } from 'vue'
 
 const screen = ref(false)
@@ -141,6 +143,16 @@ const badgeColor = computed(() => (item) => {
 const badgeIcon = computed(() => (item) => {
   return (item && item.sex) ? (item.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'
 })
+
+const textItem = ref({
+  type: 'text',
+  width: 600,
+  value: '',
+  label: '职位匹配',
+  clearable: false,
+  appendInnerIcon: 'mdi-magnify'
+})
+
 </script>
 
 <style scoped lang="scss">

+ 8 - 1
src/views/recruit/personal/home/components/hotJobs.vue

@@ -10,12 +10,19 @@
 <script setup>
 import { getHotPositionList } from '@/api/common/index'
 import { useRouter } from 'vue-router'
+import Snackbar from '@/plugins/snackbar'
 import { ref } from 'vue';
 defineOptions({ name:'personal-hotJobs-list'})
 const router = useRouter()
 
 
-const handleClick = (item) => { router.push({ path: '/recruit/personal/position',query: item }) }
+const handleClick = (item) => { 
+  if (!item?.id) {
+    console.log('岗位信息失效 岗位id不存在')
+    return Snackbar.warning('岗位信息失效')
+  }
+  router.push({ path: '/recruit/personal/position',query: { positionId: item.id } })
+ }
 
 // 获取行业树形
 let jobs = ref(null)