浏览代码

用户名更改后navbar同步内容

Xiao_123 11 月之前
父节点
当前提交
5ae09dd821

+ 5 - 1
src/layout/personal/navBar.vue

@@ -165,7 +165,11 @@ const items = ref([
   { title: '切换为招聘者', icon: 'mdi-swap-horizontal', change: changeLoginType },
   { title: '退出登录', icon: 'mdi-logout', change: handleLogout }
 ])
-const baseInfo = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
+
+let baseInfo = ref(JSON.parse(localStorage.getItem('baseInfo')) || {}) // 人才信息
+userStore.$subscribe((mutation, state) => {
+  baseInfo.value = state.baseInfo
+})
 
 const handleLogin = () => {
   router.push({ path: '/login' })

+ 65 - 89
src/store/user.js

@@ -1,5 +1,4 @@
 import { defineStore } from 'pinia'
-import { reactive } from 'vue'
 import { setToken, removeToken } from '@/utils/auth'
 import { smsLogin, passwordLogin, getBaseInfo } from '@/api/common/index'
 import { logout } from '@/api/common/index'
@@ -10,98 +9,75 @@ import { getBaseInfoDictOfName } from '@/utils/getText'
 
 
 export const useUserStore = defineStore('user',
-  () => {
-    let accountInfo = reactive({}) // 登录返回的信息
-    let userInfo = reactive({}) // 当前登录账号信息
-    let baseInfo = reactive({}) // 人才信息
-
-    // 短信登录
-    const handleSmsLogin = async (data) => {
-      return new Promise((resolve, reject) => {
-        smsLogin(data).then(res => {
-          console.log(res, 'login-phone')
-          setToken(res.accessToken)
-          accountInfo = res
-          localStorage.setItem('accountInfo', JSON.stringify(res))
-          localStorage.setItem('expiresTime', res.expiresTime) // token过期时间
-          getUserInfos()
-          getUserBaseInfos()
-          resolve()
-        }).catch(err => { reject(err) })
-      })
-    }
-
-    // 密码登录
-    const handlePasswordLogin = async (data) => {
-      return new Promise((resolve, reject) => {
-        passwordLogin(data).then(res => {
-          console.log(res, 'login-password')
-          setToken(res.accessToken)
-          accountInfo = res
-          localStorage.setItem('accountInfo', JSON.stringify(res))
-          localStorage.setItem('expiresTime', res.expiresTime) // token过期时间
-          getUserInfos()
-          getUserBaseInfos()
-          resolve()
-        }).catch(err => { reject(err) })
-      })
-    }
-
-    // 获取当前登录账户信息
-    const getUserInfos = async () => {
-      try {
-        const data = await getUserInfo({ id: accountInfo.userId })
-        userInfo = data
-        localStorage.setItem('userInfo', JSON.stringify(data))
-      } catch (error) {
-        Snackbar.error(error.msg)
-      }
-    }
-
-    // 获取当前登录账户的基本信息(人才信息)
-    const getUserBaseInfos = async (userId = null) => {
-      try {
-        const data = await getBaseInfo({ userId: userId || accountInfo.userId })
-        baseInfo = await getFieldText(data)
-        localStorage.setItem('baseInfo', JSON.stringify(baseInfo))
-      } catch (error) {
-        Snackbar.error(error.msg)
+  {
+    state: () => ({
+      accountInfo: {}, // 登录返回的信息
+      userInfo: {}, // 当前登录账号信息
+      baseInfo: {} // 人才信息
+    }),
+    actions: {
+      // 验证码&密码登录
+      async handleTypeLogin (type, data) {
+        // type: 1验证码登录 0密码登录
+        const api = type ? smsLogin : passwordLogin
+        return new Promise((resolve, reject) => {
+          api(data).then(res => {
+            setToken(res.accessToken)
+            this.accountInfo = res
+            localStorage.setItem('accountInfo', JSON.stringify(res))
+            localStorage.setItem('expiresTime', res.expiresTime) // token过期时间
+            this.getUserInfos()
+            this.getUserBaseInfos()
+            resolve()
+          }).catch(err => { reject(err) })
+        })
+      },
+      // 获取当前登录账户信息
+      async getUserInfos () {
+        try {
+          const data = await getUserInfo({ id: this.accountInfo.userId })
+          this.userInfo = data
+          localStorage.setItem('userInfo', JSON.stringify(data))
+        } catch (error) {
+          Snackbar.error(error.msg)
+        }
+      },
+      // 获取当前登录账户的基本信息(人才信息)
+      async getUserBaseInfos (userId = null) {
+        try {
+          const data = await getBaseInfo({ userId: userId || this.accountInfo.userId })
+          this.baseInfo = await this.getFieldText(data)
+          localStorage.setItem('baseInfo', JSON.stringify(this.baseInfo))
+        } catch (error) {
+          Snackbar.error(error.msg)
+        }
+      },
+      // 字典对应中文
+      async getFieldText (data) {
+        if (data.birthday && data.birthday !== 0) data.birthdayText = timesTampChange(data.birthday).slice(0, 10) // 出生日期
+        if (data.firstWorkTime && data.firstWorkTime !== 0) data.firstWorkTimeText = timesTampChange(data.firstWorkTime).slice(0, 10) // 首次工作时间
+        if (data.areaId && data.areaId !== 0) await getBaseInfoDictOfName(0, data, data.areaId, 'areaName') // 现居住地text
+        if (data.eduType && data.eduType !== 0) await getBaseInfoDictOfName(1, data, data.eduType, 'eduTypeText') // 学历
+        if (data.expType && data.expType !== 0) await getBaseInfoDictOfName(2, data, data.expType, 'expTypeText') // 工作经验
+        if (data.sex && data.sex !== 0) await getBaseInfoDictOfName(3, data, data.sex, 'sexTypeText') // 性别
+        if (data.jobType && data.jobType !== 0) await getBaseInfoDictOfName(4, data, data.jobType, 'jobTypeText') // 求职类型
+        if (data.jobStatus && data.jobStatus !== 0) await getBaseInfoDictOfName(5, data, data.jobStatus, 'jobStatusText') // 	求职状态
+        if (data.maritalStatus && data.maritalStatus !== 0) await getBaseInfoDictOfName(6, data, data.maritalStatus, 'maritalText') // 	婚姻状况
+        return data
+      },
+      // 退出登录
+      async userLogout () {
+        await logout()
+        removeToken()
+        this.userInfo = {}
+        this.baseInfo = {}
+        this.accountInfo = {}
+        localStorage.clear()
       }
     }
-    // 字典对应中文
-    const getFieldText = async (data) => {
-      if (data.birthday && data.birthday !== 0) data.birthdayText = timesTampChange(data.birthday).slice(0, 10) // 出生日期
-      if (data.firstWorkTime && data.firstWorkTime !== 0) data.firstWorkTimeText = timesTampChange(data.firstWorkTime).slice(0, 10) // 首次工作时间
-      if (data.areaId && data.areaId !== 0) await getBaseInfoDictOfName(0, data, data.areaId, 'areaName') // 现居住地text
-      if (data.eduType && data.eduType !== 0) await getBaseInfoDictOfName(1, data, data.eduType, 'eduTypeText') // 学历
-      if (data.expType && data.expType !== 0) await getBaseInfoDictOfName(2, data, data.expType, 'expTypeText') // 工作经验
-      if (data.sex && data.sex !== 0) await getBaseInfoDictOfName(3, data, data.sex, 'sexTypeText') // 性别
-      if (data.jobType && data.jobType !== 0) await getBaseInfoDictOfName(4, data, data.jobType, 'jobTypeText') // 求职类型
-      if (data.jobStatus && data.jobStatus !== 0) await getBaseInfoDictOfName(5, data, data.jobStatus, 'jobStatusText') // 	求职状态
-      if (data.maritalStatus && data.maritalStatus !== 0) await getBaseInfoDictOfName(6, data, data.maritalStatus, 'maritalText') // 	婚姻状况
-      return data
-    }
-
-    // 退出登录
-    const userLogout = async () => {
-      await logout()
-      removeToken()
-      userInfo = {}
-      baseInfo = {}
-      accountInfo = {}
-      localStorage.clear()
-    }
-    return {
-      userInfo,
-      baseInfo,
-      getUserBaseInfos,
-      handleSmsLogin,
-      userLogout,
-      handlePasswordLogin
-    }
   },
   {
-    persist: true,
+    persist: true
   }
 )
 

+ 3 - 3
src/views/Home/personal/components/hotPromotedPositions.vue

@@ -7,13 +7,13 @@
     </v-tabs>
     <v-window v-model="tab" class="mt-3">
       <v-window-item :value="1">
-        <PositionCard v-if="items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
+        <PositionCard v-if="items.filter(Boolean) && items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
       </v-window-item>
       <v-window-item :value="2">
-        <PositionCard v-if="items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
+        <PositionCard v-if="items.filter(Boolean) && items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
       </v-window-item>
       <v-window-item :value="3">
-        <PositionCard v-if="items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
+        <PositionCard v-if="items.filter(Boolean) && items.length" :items="items" @position="handlePosition" @enterprise="handleEnterprise"></PositionCard>
       </v-window-item>
     </v-window>
     <div class="text-center">

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

@@ -1,15 +1,14 @@
 <template>
   <div>
     <v-card class="pa-5">
-      <v-timeline class="card-box" align="start" side="end">
+      <v-timeline align="start" side="end">
         <v-timeline-item
           v-for="(val, i) in list"
           :key="i"
           :dot-color="val.color"
           :icon="val.icon"
-          style="width: 100%;"
         >
-          <div style="width: 100%;">
+          <div>
             <h2 class="mt-n1 headline font-weight-regular">{{ val.title }}</h2>
             <div class="mb-4 desc">{{ val.desc }}</div>
             <component class="mt-10" :is="val.path"></component>
@@ -47,9 +46,6 @@ const list = [
 </script>
 
 <style scoped lang="scss">
-.card-box {
-  width: 70%;
-}
 .desc {
   font-size: 13px;
   color: #777;

+ 1 - 12
src/views/enterprise/positionManagement/components/baseInfo.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <CtForm ref="formPageRef" :items="items" style="width: 100%;">
+    <CtForm ref="formPageRef" :items="items" style="width: 600px;">
       <template #enterpriseName="{ item }">
         <div class="mb-4">
           <span style="color: #777;">公司:</span>
@@ -49,17 +49,6 @@ const items = ref({
       label: '职位名称 *',
       rules: [v => !!v || '请选择职位名称']
     },
-    {
-      type: 'autocomplete',
-      key: 'jobType',
-      value: null,
-      label: '招聘类型 *',
-      itemText: 'label',
-      itemValue: 'value',
-      dictTypeName: 'menduner_job_type',
-      rules: [v => !!v || '请选择招聘类型'],
-      items: []
-    },
     {
       slotName: 'positionId',
       key: 'positionId',

+ 63 - 11
src/views/enterprise/positionManagement/components/jobRequirements.vue

@@ -1,20 +1,47 @@
 <template>
   <div style="width: 100%;">
-    <CtForm ref="formPageRef" :items="items" style="width: 100%;"></CtForm>
+    <CtForm ref="formPageRef" :items="items" style="width: 600px;">
+      <template #workAreaId="{ item }">
+        <v-menu :close-delay="1" :open-delay="0" v-bind="$attrs">
+            <template v-slot:activator="{  props }">
+              <textUI
+                v-model="item.value"
+                :item="item"
+                v-bind="props"
+                style="position: relative;"
+              ></textUI>
+            </template>
+            <areaType :select="[query.workAreaId].filter(Boolean)" @handleAreaClick="handleArea" class="jobTypeCardBox" isSingle></areaType>
+          </v-menu>
+      </template>
+    </CtForm>
   </div>
 </template>
 
 <script setup>
 defineOptions({ name: 'position-add-job-requirements'})
 import CtForm from '@/components/CtForm'
+import areaType from '@/components/AreaSelect'
+import textUI from '@/components/FormUI/TextInput'
 import { reactive, ref } from 'vue'
-// import { getDict } from '@/hooks/web/useDictionaries'
+import { getDict } from '@/hooks/web/useDictionaries'
 
 const formPageRef = ref()
 const query = reactive({})
 console.log(query, 'qqq')
 const items = ref({
   options: [
+    {
+      type: 'autocomplete',
+      key: 'jobType',
+      value: null,
+      label: '职位性质 *',
+      itemText: 'label',
+      itemValue: 'value',
+      dictTypeName: 'menduner_job_type',
+      rules: [v => !!v || '请选择职位性质'],
+      items: []
+    },
     {
       type: 'autocomplete',
       key: 'eduType',
@@ -59,20 +86,45 @@ const items = ref({
       suffix: '元',
       rules: [v => !!v || '请填写最高薪资'],
     },
+    {
+      slotName: 'workAreaId',
+      key: 'workAreaId',
+      value: null,
+      label: '工作城市 *',
+      rules: [v => !!v || '请选择最高学历']
+    },
+    {
+      type: 'text',
+      key: 'address',
+      value: '',
+      label: '详情地址 *',
+      rules: [v => !!v || '请填写详细地址'],
+    },
   ]
 })
 
 // 获取字典内容
-// const getDictData = async (dictTypeName) => {
-//   const item = items.value.options.find(e => e.dictTypeName === dictTypeName)
-//   if (item) {
-//     const { data } = await getDict(dictTypeName)
-//     item.items = data
-//   }
-// }
-// getDictData()
+items.value.options.forEach(async (e) => {
+  if (e.dictTypeName) {
+    const { data } = await getDict(e.dictTypeName)
+    e.items = data
+  }
+})
+
+// 工作城市
+const handleArea = (list, name) => {
+  if (!list.length) return
+  query.workAreaId = list[0]
+  const obj = items.value.options.find(e => e.key === 'workAreaId')
+  obj.value = name
+}
+
 </script>
 
 <style scoped lang="scss">
-
+.jobTypeCardBox {
+  position: absolute;
+  top: -22px;
+  left: 0;
+}
 </style>

+ 5 - 6
src/views/login/index.vue

@@ -75,15 +75,14 @@ const passRef = ref()
 const loginLoading = ref(false)
 const userStore = useUserStore()
 const handleLogin = async () => {
-  const { valid } = tab.value === 1 ? await phoneRef.value.phoneForm.validate() : await passRef.value.passwordForm.validate()
+  const { valid } = tab.value ? await phoneRef.value.phoneForm.validate() : await passRef.value.passwordForm.validate()
   if (!valid) return
   loginLoading.value = true
+  // type: 1验证码登录 0密码登录
+  const type = tab.value ? 1 : 0
+  const query = tab.value ? phoneRef.value.loginData : passRef.value.loginData
   try {
-    if (tab.value === 1) {
-      await userStore.handleSmsLogin(phoneRef.value.loginData)
-    } else {
-      await userStore.handlePasswordLogin(passRef.value.loginData)
-    }
+    await userStore.handleTypeLogin(type, query)
     Snackbar.success('登录成功')
     router.push({ path: '/home' })
   }

+ 0 - 1
src/views/resume/components/basicInfo.vue

@@ -126,7 +126,6 @@ import { useUserStore } from '@/store/user'
 import { uploadFile } from '@/api/common'
 import { useI18n } from '@/hooks/web/useI18n'
 import { ref } from 'vue';
-
 defineOptions({name: 'resume-components-basicInfo'})
 const { t } = useI18n()
 const userStore = useUserStore()