Просмотр исходного кода

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

lifanagju_citu 11 месяцев назад
Родитель
Сommit
e9c5a77502

+ 5 - 0
src/api/common/index.js

@@ -133,4 +133,9 @@ export const getBaseInfo = async (params) => {
     url: '/app-api/menduner/system/person/get',
     params
   })
+}
+
+// 上传文件
+export const uploadFile = async (data) => {
+  return await request.upload({ url: '/app-api/infra/file/upload', data })
 }

+ 6 - 2
src/components/Enterprise/details.vue

@@ -68,8 +68,8 @@
                 <div class="desc ellipsis">{{ val.desc }}</div>
               </div>
             </div>
-            <div class="text-center mt-3">
-              <v-btn class="buttons" color="primary" variant="outlined">{{ $t('position.allBtn') }}</v-btn>
+            <div class="text-center mt-3" v-if="tab === 1">
+              <v-btn class="buttons" color="primary" variant="outlined" @click="handleMorePosition">{{ $t('position.allBtn') }}</v-btn>
             </div>
           </div>
         </div>
@@ -106,6 +106,10 @@ const handleTabClick = () => {
   router.push(`${route.path}?key=${tab.value === 1 ? 'briefIntroduction' : 'recruitmentPositions'}`)
 }
 
+const handleMorePosition = () => {
+  window.open(`/enterprise/details/${props.id}?key=recruitmentPositions`)
+}
+
 // 企业详情
 const info = ref({})
 const getDetails = async () => {

+ 2 - 1
src/components/Enterprise/hotPromoted.vue

@@ -67,7 +67,8 @@ const handleClickEnterprise = (item) => {
 
 // 查看更多职位
 const handleMoreEnterprise = (item) => {
-  window.open(`/enterprise/details/${item.id}?key=recruitmentPositions`)
+  if (!item.enterprise.id) return
+  window.open(`/enterprise/details/${item.enterprise.id}?key=recruitmentPositions`)
 }
 </script>
 

+ 5 - 4
src/components/Enterprise/info.vue

@@ -4,7 +4,7 @@
     <div style="height: 50px;">
       <v-img class="float-left" :src="props.info.enterprise.logoUrl || 'https://minio.citupro.com/dev/menduner/company-avatar.png'" :width="45" height="45"></v-img>
       <div class="ml-3 float-left">
-        <p class="enterprise-name cursor-pointer" @click="handleEnterprise">{{ props.info.enterprise.anotherName }}</p>
+        <p class="enterprise-name cursor-pointer" @click="handleEnterprise(0)">{{ props.info.enterprise.anotherName }}</p>
         <v-icon color="primary" size="20">mdi-shield-check</v-icon> <!-- mdi-shield-remove -->
         <span style="color: var(--v-primary-base);font-size: 14px;">已认证</span>
       </div>
@@ -17,7 +17,7 @@
     </div>
     <div style="font-size: 12px;height: 50px; line-height: 50px">
       <span class="float-left">共<span style="color: var(--v-primary-base)">9</span>个在招职位</span>
-      <span class="float-right more-position">查看全部职位<v-icon>mdi-chevron-right</v-icon></span>
+      <span class="float-right more-position" @click="handleEnterprise(1)">查看全部职位<v-icon>mdi-chevron-right</v-icon></span>
     </div>
   </div>
 </template>
@@ -45,8 +45,9 @@ const getData = async () => {
 }
 getData()
 
-const handleEnterprise = () => {
-  window.open(`/enterprise/details/${props.info.enterprise.id}?key=briefIntroduction`)
+const handleEnterprise = (val) => {
+  const key = val ? 'recruitmentPositions' : 'briefIntroduction'
+  window.open(`/enterprise/details/${props.info.enterprise.id}?key=${key}`)
 }
 </script>
 

+ 5 - 1
src/components/Position/similarPositions.vue

@@ -11,7 +11,7 @@
       </div>
     </div>
     <div class="text-center more-btn">
-      <v-btn color="primary" variant="outlined" class="buttons">查看全部职位</v-btn>
+      <v-btn color="primary" variant="outlined" class="buttons" :to="`/enterprise/details/${props.info.enterpriseId}?key=recruitmentPositions`">查看全部职位</v-btn>
     </div>
   </div>
 </template>
@@ -21,6 +21,10 @@ const props = defineProps({
   list: {
     type: Array,
     default: () => []
+  },
+  info: {
+    type: Object,
+    default: () => {}
   }
 })
 const handlePosition = (item) => {

+ 2 - 2
src/layout/personal/navBar.vue

@@ -94,7 +94,7 @@
 </template>
 
 <script setup>
-import { ref } from 'vue'
+import { reactive, ref } from 'vue'
 import { getToken } from '@/utils/auth'
 import { useUserStore } from '@/store/user'
 import { useLocaleStore } from '@/store/locale'
@@ -152,7 +152,7 @@ const items = ref([
   { title: '切换为招聘者', icon: 'mdi-swap-horizontal', change: changeRole },
   { title: '退出登录', icon: 'mdi-logout', change: handleLogout }
 ])
-const baseInfo = JSON.parse(localStorage.getItem('baseInfo')) // 人才信息
+const baseInfo = reactive(JSON.parse(localStorage.getItem('baseInfo'))) // 人才信息
 
 const handleLogin = () => {
   router.push({ path: '/login' })

+ 5 - 0
src/locales/en.js

@@ -7,6 +7,11 @@ export default {
     save: 'Save',
     add: 'Add',
     change: 'Change',
+    saveMsg: 'Save successful',
+    addMsg: 'New successfully added',
+    delMsg: 'Delete successful',
+    uploadSucMsg: 'Upload successful',
+    uploadErrMsg: 'Upload failed'
   },
   sys: {
     api: {

+ 5 - 0
src/locales/zh-CN.js

@@ -7,6 +7,11 @@ export default {
     save: '保存',
     add: '新增',
     change: '更改',
+    saveMsg: '保存成功',
+    addMsg: '新增成功',
+    delMsg: '删除成功',
+    uploadSucMsg: '上传成功',
+    uploadErrMsg: '上传失败'
   },
   sys: {
     api: {

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

@@ -17,7 +17,7 @@
       </v-window-item>
     </v-window>
     <div class="text-center">
-      <v-btn class="buttons" color="primary">{{ $t('position.moreBtn') }}</v-btn>
+      <v-btn class="buttons" color="primary" to="/recruit/position">{{ $t('position.moreBtn') }}</v-btn>
     </div>
   </div>
 </template>

+ 1 - 1
src/views/Home/personal/components/popularEnterprises.vue

@@ -2,7 +2,7 @@
   <div>
     <HotPromoted :items="items"></HotPromoted>
     <div class="text-center">
-      <v-btn class="buttons" color="primary">{{ $t('enterprise.moreBtn') }}</v-btn>
+      <v-btn class="buttons" color="primary" to="/recruit/company">{{ $t('enterprise.moreBtn') }}</v-btn>
     </div>
   </div>
 </template>

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

@@ -67,7 +67,7 @@
             <!-- 公司信息 -->
             <EnterpriseInfo :info="{ ...info, position: { ...positionInfo } }"></EnterpriseInfo>
             <!-- 相似职位 -->
-            <similarPositions class="mt-3" :list="similarList"></similarPositions>
+            <similarPositions class="mt-3" :list="similarList" :info="info"></similarPositions>
           </div>
         </div>
       </div>

+ 39 - 3
src/views/resume/components/basicInfo.vue

@@ -13,8 +13,17 @@
           offset-y="33" 
           :color="baseInfo?.sex ? (baseInfo?.sex === '1' ? '#1867c0' : 'error') : 'error'" 
           :icon="baseInfo?.sex ? (baseInfo?.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'">
-          <v-avatar size=80 :image="baseInfo.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
-          <div v-show="showIcon" class="mdi mdi-camera-outline"></div>
+          <v-avatar size=80 :image="baseInfo.avatar || 'https://minio.citupro.com/dev/menduner/7.png'">
+          </v-avatar>
+          <div v-show="showIcon" @click="openFileInput" v-bind="$attrs" class="mdi mdi-camera-outline">
+            <input
+              type="file"
+              ref="fileInput"
+              accept="image/png, image/jpg, image/jpeg"
+              style="display: none;"
+              @change="handleUploadFile"
+            />
+          </div>
         </v-badge>
       </div>
       <!-- 基础信息 -->
@@ -114,9 +123,12 @@ import { getDict } from '@/hooks/web/useDictionaries'
 import { getTimeStamp, timesTampChange } from '@/utils/date'
 import { saveResumeBasicInfo } from '@/api/resume'
 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()
 const CtFormRef = ref()
 const isEdit = ref(false)
@@ -130,6 +142,30 @@ const getBasicInfo = () => { // 获取基础信息
 }
 getBasicInfo()
 
+// 选择文件
+const fileInput = ref()
+const clicked = ref(false)
+const openFileInput = () => {
+  if (clicked.value) return
+  clicked.value = true
+  fileInput.value.click()
+  clicked.value = false
+}
+
+// 上传头像
+const handleUploadFile = async (e) => {
+  const file = e.target.files[0]
+  const formData = new FormData()
+  formData.append('file', file)
+  const { data } = await uploadFile(formData)
+  if (!data) return
+  Snackbar.success(t('common.uploadSucMsg'))
+  // 保存信息
+  await saveResumeBasicInfo({ ...baseInfo.value, avatar: data })
+  await userStore.getUserBaseInfos(baseInfo.value.userId)
+  getBasicInfo()
+}
+
 const formItems = ref({
   options: [
     {
@@ -315,7 +351,7 @@ const handleSave = async () => {
     else obj[e.key] = e.value
   })
   await saveResumeBasicInfo(obj)
-  Snackbar.success('保存成功!')
+  Snackbar.success(t('common.saveMsg'))
   isEdit.value = false
   // 获取当前登录账户信息
   await userStore.getUserBaseInfos(baseInfo.value.userId)

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

@@ -196,7 +196,6 @@ formItems.value.options.forEach((e, index) => {
   if (((index + 2) % 2 === 0) && Boolean(e.col) && e.col !== 12) e.flexStyle = 'mr-3'
 })
 
-console.log('dictItemsObj', dictItemsObj)
 // 获取数据
 const dataList = ref([])
 const getData = async () => {

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

@@ -162,7 +162,6 @@ formItems.value.options.forEach((e, index) => {
   if (((index + 2) % 2 === 0) && Boolean(e.col) && e.col !== 12) e.flexStyle = 'mr-3'
 })
 
-console.log('dictItemsObj', dictItemsObj)
 // 获取数据
 const dataList = ref([])
 const getData = async () => {