ソースを参照

无用文件删除

Xiao_123 2 ヶ月 前
コミット
0e9a85e58a

+ 1 - 1
components.d.ts

@@ -54,7 +54,7 @@ declare module 'vue' {
     LongCompany: typeof import('./src/components/Position/longCompany.vue')['default']
     LongStrip: typeof import('./src/components/Position/longStrip.vue')['default']
     NestedListGroup: typeof import('./src/components/FormUI/nestedListGroup/index.vue')['default']
-    Pay: typeof import('./src/components/personalRecharge/pay.vue')['default']
+    Pay: typeof import('./src/components/pay/index.vue')['default']
     PersonalRecharge: typeof import('./src/components/personalRecharge/index.vue')['default']
     PreviewImage: typeof import('./src/components/PreviewImg/previewImage.vue')['default']
     PreviewImg: typeof import('./src/components/PreviewImg/index.vue')['default']

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

@@ -62,32 +62,6 @@ const common = [
     name: 'advertisementPreferred',
     component: () => import('@/views/recruit/personal/home/components/advertisement/preferred.vue')
   },
-  {
-    path: '/recruit/enterprise/talentRecommendation',
-    component: () => import('@/views/recruit/enterprise/talentRecommendation/index.vue'),
-    name: 'talentRecommendation',
-    meta: {
-      title: '人才推荐'
-    }
-  },
-  {
-    path: '/recruit/enterprise/talentRecommendation/details/:id',
-    component: () => import('@/views/recruit/enterprise/talentRecommendation/details'),
-    name: 'talentRecommendationDetails',
-    meta: {
-      title: '人才详情',
-      hideSide: true
-    }
-  },
-  {
-    path: '/domainNameTest',
-    component: () => import('@/views/domainName'),
-    name: 'domainName',
-    meta: {
-      title: '访问配置业务域名',
-      hideSide: true
-    }
-  },
   {
     path: '/headhunting',
     component: Layout,

+ 0 - 14
src/router/modules/recruit.js

@@ -125,20 +125,6 @@ const recruit = [
       }
     ]
   },
-  {
-    path: '/flame',
-    component: Layout,
-    children: [
-      {
-        path: '/flame',
-        component: () => import('@/views/flame/index'),
-        name: 'flame',
-        meta: {
-          title: '火苗儿校企'
-        }
-      }
-    ]
-  },
   {
     path: '/recruit/personal/position',
     component: Layout,

+ 0 - 12
src/views/domainName/index.vue

@@ -1,12 +0,0 @@
-<!--  -->
-<template>
-  <div></div>
-</template>
-
-<script setup>
-defineOptions({name: 'domainName-index'})
-window.location.href = 'https://minio.menduner.com/dev/34b1e846f19d86cd1a805dc52e121904632c4d80daac64a74be87c1b0778f7da.txt'
-
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 18
src/views/flame/index.vue

@@ -1,18 +0,0 @@
-<template>
-	<div class="pa-3 default-width">
-		<div v-if="!getToken()" class="text-end mb-5">
-			<v-btn color="primary" to="/flameLogin">老师登录/注册</v-btn>
-		</div>
-		<v-img src="https://minio.menduner.com/dev/108ff7690ab0773374138568fd0a3a166ee45df1f39b78ff0b2cdaeddbf71261.png"></v-img>
-		<v-img class="mt-3" src="https://minio.menduner.com/dev/95502df43c2155c457c485e869066536566d5f58ae80313567f81e7215f7eb77.png"></v-img>
-	</div>
-</template>
-
-<script setup>
-defineOptions({ name: 'Flame'})
-import { getToken } from '@/utils/auth'
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 11
src/views/integral/integralRules/components/expiredOfPoints.vue

@@ -1,11 +0,0 @@
-<!-- 积分过期 -->
-<template>
-  <div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'personal-integralRules-expiredOfPoints'})
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 11
src/views/integral/integralRules/components/pointsViolation.vue

@@ -1,11 +0,0 @@
-<!-- 积分违规处理 -->
-<template>
-  <div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'personal-integralRules-pointsViolation'})
-</script>
-<style lang="scss" scoped>
-</style>

+ 0 - 11
src/views/integral/integralRules/components/transferOfPoints.vue

@@ -1,11 +0,0 @@
-<!-- 积分转让 -->
-<template>
-  <div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'personal-integralRules-transferOfPoints'})
-</script>
-<style lang="scss" scoped>
-</style>

ファイルの差分が大きいため隠しています
+ 0 - 6
src/views/integral/integralRules/index.vue


+ 0 - 85
src/views/recruit/enterprise/systemManagement/postManagement/index.vue

@@ -1,85 +0,0 @@
-<template>
-  <v-card class="pa-5 card-box">
-    <CtTable
-      :items="items"
-      :headers="headers"
-      :loading="false"
-      :elevation="0"
-      :showPage="true"
-      :total="total"
-      :page-info="query"
-      itemKey="id"
-      @add="handleAdd"
-      @edit="handleEdit"
-      @del="handleDelete"
-      @pageHandleChange="handleChangePage"
-    >
-    </CtTable>
-  </v-card>
-</template>
-
-<script setup>
-defineOptions({ name: 'system-post-index'})
-import { ref } from 'vue'
-import { useRouter } from 'vue-router'
-import { timesTampChange } from '@/utils/date'
-import { useI18n } from '@/hooks/web/useI18n'
-import { getEnterprisePostPage, deleteEnterprisePost, checkPost } from '@/api/recruit/enterprise/system/post'
-import Confirm from '@/plugins/confirm'
-import Snackbar from '@/plugins/snackbar'
-
-const { t } = useI18n()
-const router = useRouter()
-const total = ref(10)
-const items = ref([])
-const query = ref({
-  pageNo: 1,
-  pageSize: 10
-})
-
-const headers = [
-  { title: '岗位名称', key: 'nameCn', sortable: false },
-  { title: '英文名称', key: 'nameEn', sortable: false },
-  { title: '岗位缩写', key: 'code', sortable: false },
-  { title: '岗位级别', key: 'sort', sortable: false },
-  { title: '状态', key: 'status', value: item => item.status === '1' ? '停用' : '正常', sortable: false },
-  { title: '备注', key: 'remark', sortable: false },
-  { title: '更新时间', key: 'updateTime', value: item => timesTampChange(item.updateTime), sortable: false },
-  { title: t('common.actions'), key: 'actions', sortable: false }
-]
-
-const getList = async () => {
-  const res = await getEnterprisePostPage(query.value)
-  items.value = res.list
-  total.value = res.total
-}
-getList()
-
-const handleChangePage = (e) => {
-  query.value.pageNo = e
-  getList()
-}
-
-const handleAdd = () => {
-  router.push('/recruit/enterprise/systemManagement/postManagement/add')
-}
-
-const handleEdit = (item) => {
-  if (!item.id) return
-  router.push(`/recruit/enterprise/systemManagement/postManagement/edit?id=${item.id}`)
-}
-
-const handleDelete = async ({ id }) => {
-  const check = await checkPost(id)
-  if (check) return Snackbar.warning('查询到该岗位有绑定用户,请先到用户管理里面修改后再试')
-  Confirm(t('common.confirmTitle'), '是否确认删除此项内容?').then(async () => {
-    await deleteEnterprisePost(id)
-    Snackbar.success(t('common.delMsg'))
-    getList()
-  })
-}
-</script>
-
-<style scoped lang="scss">
-
-</style>

+ 0 - 104
src/views/recruit/enterprise/systemManagement/postManagement/save.vue

@@ -1,104 +0,0 @@
-<template>
-  <v-card class="pa-5 card-box d-flex align-center justify-center flex-column" style="height: 600px;">
-    <CtForm ref="formPageRef" :items="items" style="width: 600px;"></CtForm>
-    <div>
-      <v-btn class="half-button mr-3" color="primary" variant="outlined" @click="handleCancel">{{ $t('common.cancel') }}</v-btn>
-      <v-btn color="primary" class="half-button" @click="handleSave">{{ $t('common.submit') }}</v-btn>
-    </div>
-  </v-card>
-</template>
-
-<script setup>
-defineOptions({ name: 'system-post-add'})
-import { reactive, ref } from 'vue'
-import { useRouter, useRoute } from 'vue-router'
-import { useI18n } from '@/hooks/web/useI18n'
-import { getEnterprisePostDetail, createEnterprisePost, updateEnterprisePost } from '@/api/recruit/enterprise/system/post'
-import Snackbar from '@/plugins/snackbar'
-
-const route = useRoute()
-const router = useRouter()
-const { t } = useI18n()
-const formPageRef = ref()
-let query = reactive({})
-const items = ref({
-  options: [
-    {
-      type: 'ifRadio',
-      key: 'status',
-      value: '0',
-      label: '状态 *',
-      width: 90,
-      items: [
-        { label: '正常', value: '0' },
-        { label: '停用', value: '1' }
-      ]
-    },
-    {
-      type: 'text',
-      key: 'nameCn',
-      value: null,
-      label: '岗位中文名称 *',
-      rules: [v => !!v || '请填写岗位中文名称']
-    },
-    {
-      type: 'text',
-      key: 'nameEn',
-      value: null,
-      label: '岗位英文名称 *',
-      rules: [v => !!v || '请填写岗位英文名称']
-    },
-    {
-      type: 'text',
-      key: 'code',
-      value: null,
-      label: '岗位缩写'
-    },
-    {
-      type: 'number',
-      key: 'sort',
-      value: null,
-      label: '岗位级别 *',
-      rules: [v => !!v || '请填写岗位级别']
-    },
-    {
-      type: 'text',
-      key: 'remark',
-      value: null,
-      label: '备注'
-    }
-  ]
-})
-
-const getPostDetail = async (id) => {
-  const data = await getEnterprisePostDetail(id)
-  if (!data) return
-  query.id = data.id
-  items.value.options.forEach(val => {
-    val.value = data[val.key]
-  })
-}
-
-const handleCancel = () => {
-  router.push('/recruit/enterprise/systemManagement/postManagement')
-}
-
-const handleSave = async () => {
-  const { valid } = await formPageRef.value.formRef.validate()
-  if (!valid) return
-  items.value.options.forEach(val => {
-    query[val.key] = val.value
-  })
-  const api = query.id ? updateEnterprisePost : createEnterprisePost
-  await api(query)
-  Snackbar.success(t('common.submittedSuccessfully'))
-  handleCancel()
-}
-
-if (route.query && route.query.id) {
-  if (route.query.id) getPostDetail(route.query.id)
-}
-</script>
-
-<style scoped lang="scss">
-</style>

+ 0 - 206
src/views/recruit/enterprise/talentRecommendation/components/filter.vue

@@ -1,206 +0,0 @@
-<template>
-  <div style="max-height: 80vh;">
-    <div class="d-flex align-center mt-5">
-      <TextInput v-model="textItem.value" :item="textItem" @appendInnerClick="handleSearch"></TextInput>
-      <span class="pl-6 color-666" style="width: 60px; min-width: 60px;" @click="emit('close')">取消</span>
-    </div>
-    <v-divider class="my-3"></v-divider>
-    <!-- 地区 -->
-    <!-- <div>
-      <div class="mb-2 font-size-20">地区</div>
-      <Cascade :item="areaItem" v-model="query.areaIds"></Cascade>
-    </div> -->
-    <!-- 职位类型 -->
-    <div class="my-3">
-      <div class="mb-2 font-size-20">职位类型</div>
-      <div class="d-flex font-size-14 flex-wrap">
-        <div v-for="val in items" :key="val.id" class="mr-2 tag mb-2" :class="{'active': val.active}" @click="handleFirst(val)">{{ val.nameCn }}</div>
-      </div>
-      <div v-if="children.length" class="mt-1 font-size-14 d-flex flex-wrap triangle-container pa-3">
-        <div 
-          v-for="k in children" 
-          :key="k.id" 
-          class="second-tag mr-2 mb-2" 
-          :class="{'active': select.findIndex(e => e.id === k.id) !== -1}"
-          @click="handleSecond(k)"
-        >{{ k.nameCn }}</div>
-      </div>
-    </div>
-    <!-- 最高学历、工作经验 -->
-    <div v-for="val in list" :key="val.key" class="mb-3">
-      <div class="mb-2 font-size-20">{{ val.title }}</div>
-      <v-chip-group v-model="val.value" selected-class="text-primary" mandatory @update:modelValue="e => val.value = e" class="flex-wrap color-666">
-        <v-chip v-for="val in val.items" :key="val.id" :text="val.label" :value="val.value" label filter></v-chip>
-      </v-chip-group>
-    </div>
-    <div class="white-bgc pb-5" style="position: sticky; bottom: 0;">
-      <v-divider class="mb-5"></v-divider>
-      <div class="d-flex align-center">
-        <v-btn color="primary" variant="outlined" style="width: 130px;" @click="handleReset">清空筛选条件</v-btn>
-        <v-btn class="ml-5" color="primary" style="flex: 1;" @click="handleConfirm">确 定</v-btn>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'filterPage'})
-import { ref } from 'vue'
-import { getDict } from '@/hooks/web/useDictionaries'
-import Snackbar from '@/plugins/snackbar'
-
-const emit = defineEmits(['close', 'search'])
-const textItem = ref({
-  type: 'text',
-  value: '',
-  label: '请输入关键词搜索',
-  clearable: false,
-  hideDetails: true,
-  appendInnerIcon: 'mdi-magnify'
-})
-const query = ref({
-  content: '',
-  positionIds: [],
-  areaIds: [],
-  expType: '',
-  eduType: ''
-})
-// const areaItem = ref({
-//   itemText: 'name',
-//   itemValue: 'id',
-//   placeholder: '请选择工作城市',
-//   clearable: true,
-//   multiple: true,
-//   items: []
-// })
-const list = ref([
-  {
-    title: '最高学历',
-    dictTypeName: 'menduner_education_type',
-    items: [],
-    value: '',
-    key: 'eduType'
-  },
-  {
-    title: '工作经验',
-    dictTypeName: 'menduner_exp_type',
-    items: [],
-    value: '',
-    key: 'expType'
-  }
-])
-list.value.forEach(e => {
-  getDict(e.dictTypeName).then(({ data }) => {
-    e.items = data || []
-  })
-})
-// getDict('areaTreeData', null, 'areaTreeData').then(({ data }) => {
-//   data = data?.length && data || []
-//   console.log(data, 'data')
-//   areaItem.value.items = data.map(e => {
-//     e.children.forEach(k => {
-//       if (k?.children?.length) k.children = []
-//     })
-//     return e
-//   })
-// })
-
-// 职位树状
-const items = ref([])
-getDict('positionTreeData', {}, 'positionTreeData').then(({ data }) => {
-  if (!data) return
-  items.value = data.map(e => {
-    e.active = false
-    return e
-  })
-})
-const children = ref([])
-const handleFirst = (val) => {
-  if (val.active) {
-    val.active = false
-    children.value = []
-    select.value = select.value.filter(e => e.parentId !== val.id)
-    return
-  }
-  items.value.forEach(e => e.active = false)
-  val.active = !val.active
-  children.value = val.children || []
-}
-const handleSearch = () => {
-  query.value.content = textItem.value.value
-  emit('search', query.value)
-}
-const select = ref([])
-const handleSecond = (val) => {
-  const index = select.value.findIndex(e => e.id === val.id)
-  if (index !== -1) {
-    select.value.splice(index, 1)
-  } else select.value.push(val)
-}
-
-// 清空
-const handleReset = () => {
-  query.value = {
-    content: '',
-    positionIds: [],
-    areaIds: [],
-    expType: '',
-    eduType: ''
-  }
-  select.value = []
-  list.value.forEach(e => e.value = -1)
-  items.value.forEach(e => e.active = false)
-}
-
-const checkValue = (obj) => {
-  return Object.values(obj).some(value => {  
-    return value !== null && value !== undefined && value !== '' && (Array.isArray(value) ? value.length > 0 : true)
-  })
-}
-
-const handleConfirm = () => {
-  query.value.content = textItem.value.value
-  query.value.positionIds = select.value.map(e => e.id)
-  list.value.forEach(e => query.value[e.key] = e.value === -1 ? '' : e.value)
-
-  // 判断是否至少有选择一个条件
-  if (!checkValue(query.value)) return Snackbar.warning('至少选择一个条件进行搜索')
-  emit('search', query.value)
-}
-</script>
-
-<style scoped lang="scss">
-.active {
-  border: 1px solid var(--v-primary-base) !important;
-  color: var(--v-primary-base) !important;
-}
-.tag {
-  padding: 5px 15px;
-  border: 1px solid #d3d0d0;
-  border-radius: 5px;
-}
-.second-tag {
-  background-color: #fff;
-  color: #666;
-  padding: 5px 15px;
-  border-radius: 5px;
-}
-.triangle-container {
-  position: relative;
-  background-color: #f2f2f2;
-  &::after {  
-    content: "";  
-    position: absolute;  
-    left: 10%;
-    top: -19px;
-    margin-left: -5px;
-    border-width: 10px 10px 10px 10px;
-    border-style: solid;  
-    border-color: transparent transparent #f2f2f2 transparent;
-  }
-}
-:deep(.v-slide-group__content) {
-  width: 100% !important;
-  flex-wrap: wrap !important;
-}
-</style>

+ 0 - 81
src/views/recruit/enterprise/talentRecommendation/details.vue

@@ -1,81 +0,0 @@
-<!-- 人才库 - 人才详情 -->
-<template>
-  <div class="d-flex justify-center mb-8">
-    <div v-if="Object.keys(cvData).length" style="width: 940px;background: #fff;" class="px-8 pb-12 pt-3 my-n3 mr-3">
-      <!-- 基本信息 -->
-      <baseInfo class="mt-5" :data="cvData.person"></baseInfo>
-      <!-- 个人优势 -->
-      <div class="d-flex mt-8" v-if="cvData?.person?.advantage">
-        <span class="mr-6">{{ $t('resume.personalAdvantages') }}</span>
-        <div style="flex: 1; white-space: pre-line; font-size: 15px;" v-if="cvData?.person?.advantage" v-html="cvData.person.advantage"></div>
-      </div>
-      <!-- 职业技能 -->
-      <div class="d-flex mt-8" v-if="cvData?.skillList?.length">
-        <span class="mr-6">{{ $t('resume.vocationalSkills') }}</span>
-        <vocationalSkills style="flex: 1;" :data="cvData.skillList"></vocationalSkills>
-      </div>
-      <!-- 求职意向 -->
-      <div class="d-flex mt-8" v-if="cvData?.interestedList?.length">
-        <span class="mr-6">{{ $t('resume.jobIntention') }}</span>
-        <jobIntention style="flex: 1;" :data="cvData.interestedList"></jobIntention>
-      </div>
-      <!-- 工作经历 -->
-      <div class="d-flex mt-8" v-if="cvData?.workList?.length">
-        <span class="mr-6">{{ $t('resume.workExperience') }}</span>
-        <workExperience style="flex: 1;" :data="cvData.workList"></workExperience>
-      </div>
-      <!-- 培训经历 -->
-      <div class="d-flex mt-8" v-if="cvData?.trainList?.length">
-        <span class="mr-6">{{ $t('resume.trainingExperience') }}</span>
-        <trainingExperience style="flex: 1;" :data="cvData.trainList"></trainingExperience>
-      </div>
-      <!-- 教育经历 -->
-      <div class="d-flex mt-8" v-if="cvData?.eduList?.length">
-        <span class="mr-6">{{ $t('resume.educationExp') }}</span>
-        <educationExp style="flex: 1;" :data="cvData.eduList"></educationExp>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-defineOptions({name: 'enterprise-talentPool-details'})
-import baseInfo from './details/baseInfo.vue'
-import vocationalSkills from '@/views/recruit/enterprise/talentPool/components/details/vocationalSkills.vue'
-import jobIntention from '@/views/recruit/enterprise/talentPool/components/details/jobIntention.vue'
-import workExperience from '@/views/recruit/enterprise/talentPool/components/details/workExperience.vue'
-import trainingExperience from '@/views/recruit/enterprise/talentPool/components/details/trainingExperience.vue'
-import educationExp from '@/views/recruit/enterprise/talentPool/components/details/educationExp.vue'
-import { getPersonCvDetail } from '@/api/enterprise'
-import { ref } from 'vue'
-import { useRouter, useRoute } from 'vue-router'
-
-const route = useRoute()
-const router = useRouter()
-
-// 获取人才详情
-const cvData = ref({})
-const getCvDetail = async () => {
-  const { id } = route.query
-  const { id: userId } = router.currentRoute.value.params
-  if (!id || !userId) return
-  try {
-    const data = await getPersonCvDetail(userId || id)
-    cvData.value = data
-  } catch (err) {
-    if (err.code === 401) {
-      router.push('/recruit/enterprise/talentRecommendation')
-    }
-  }
-}
-getCvDetail()
-
-</script>
-<style lang="scss" scoped>
-.operate {
-  width: 240px;
-  height: 500px; // 272px
-  position: sticky;
-  top: 60px;
-}
-</style>

+ 0 - 110
src/views/recruit/enterprise/talentRecommendation/details/baseInfo.vue

@@ -1,110 +0,0 @@
-<!-- 基本信息 -->
-<template>
-  <div>
-    <!-- 头像 -->
-    <div class="avatarsBox">
-      <v-badge
-        v-if="info?.sex === '1' || info?.sex === '2'"
-        bordered 
-        offset-x="-25" 
-        offset-y="33" 
-        :color="info?.sex ? (info?.sex === '1' ? '#1867c0' : 'error') : 'error'" 
-        :icon="info?.sex ? (info?.sex === '1' ? 'mdi-gender-male' : 'mdi-gender-female') : 'mdi-gender-female'">
-        <v-avatar size=80 :image="info?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
-      </v-badge>
-      <v-avatar v-else size=80 :image="info?.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
-    </div>
-    <div class="text-center mt-3 color-666 font-size-20 font-weight-bold">{{ info?.name }}</div>
-    <div>
-      <div class="mt-5 d-flex">
-        <div class="listBox">
-          <div v-for="k in list" :key="k.key" class="mb-1">
-            <span :class="[k.icon, { 'mdi': k.icon }]">{{ k.label ? k.label : '' }}</span>
-            <span>{{ k.isTime ?  timesTampChange(info[k.key], 'Y-M-D') || '未知' : info[k.key] || '未知' }}</span>
-          </div>
-        </div>
-      </div>
-      <div class="mt-4">
-        <span style="font-size: 15px;">个人画像:</span>
-        <span v-if="info?.tagList && info?.tagList.length > 0">
-          <v-chip size="small" label v-for="(k, i) in info.tagList" :key="i" class="mr-2 mb-2" color="primary">{{ k }}</v-chip>
-        </span>
-        <span v-else>暂无</span>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-// 已废弃
-defineOptions({name: 'enterprise-talentPool-details-baseInfo'})
-import { ref } from 'vue'
-import { timesTampChange } from '@/utils/date'
-import { dealDictObjData } from '@/utils/position'
-
-const props = defineProps({
-  data: Object
-})
-
-const list = [
-  { key: 'areaName', icon: 'mdi-map-marker-outline' },
-  { key: 'phone', icon: 'mdi-phone-outline' },
-  { key: 'email', icon: 'mdi-email-outline' },
-  { key: 'expName', icon: 'mdi-calendar-blank-outline' },
-  { key: 'eduName', icon: 'mdi-school-outline' },
-  { key: 'jobStatusName', icon: 'mdi-tag-outline' },
-  { key: 'birthday', icon: 'mdi-cake-variant-outline', isTime: true },
-  { key: 'maritalStatusName', icon: 'mdi-account-heart' },
-  { key: 'firstWorkTime', label: '首次工作时间:', isTime: true }
-]
-const info = ref({})
-if (props.data && Object.keys(props.data).length) {
-  info.value = dealDictObjData({}, props.data)
-}
-</script>
-
-<style lang="scss" scoped>
-.avatarsBox {
-  height: 80px;
-  width: 80px;
-  position: relative;
-  // margin-right: 40px;
-  margin: auto;
-  .img {
-    width: 100%;
-    height: 100%;
-  }
-  .mdi {
-    font-size: 42px;
-    color: #fff;
-  }
-  div {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    transform: translate(-50%, -50%);
-    border-radius: 50%;
-  }
-}
-.listBox {
-  display: flex;
-  flex-wrap: wrap; /* 允许换行 */
-  width: 100%; /* 设置容器宽度 */
-  overflow: hidden;
-  color: var(--color-666);
-  div {
-    width: 50%;
-    &:nth-child(2n) {
-      padding-left: 20px;
-    }
-    span {
-      height: 32px;
-      line-height: 32px;
-    }
-    .mdi {
-      font-size: 22px;
-      margin-right: 8px;
-    }
-  }
-}
-</style>

+ 0 - 286
src/views/recruit/enterprise/talentRecommendation/index.vue

@@ -1,286 +0,0 @@
-<template>
-  <div>
-    <div v-if="showLogin" class="login-content" :style="{'background-image': 'url(' + webContent.loginBgUrl + ')'}">
-      <div class="login-content-box pa-10">
-        <div class="login-content-box-title text-center mt-4">请先登录您的企业账号</div>
-        <passwordFrom class="mt-10" ref="passRef" placeholder="请输入企业邮箱" :validEmail="true"></passwordFrom>
-        <v-btn :loading="loading" color="primary" class="white--text mt-5" min-width="340" @click="handleLogin">登录</v-btn>
-      </div>
-    </div>
-    <div v-else class="content py-3" @scroll="handleScroll">
-      <v-card class="py-3 px-5" :style="{'width': isMobile ? '100%' : '750px'}" style="min-height: calc(100vh - 24px); box-sizing: border-box; margin: 0 auto;">
-        <div class="d-flex align-center" style="width: 340px; margin: auto;">
-          <TextInput v-model="textItem.value" :item="textItem" @click="openDrawer" @appendInnerClick="openDrawer"></TextInput>
-        </div>
-        <!-- 已发布职位 -->
-        <div class="text-end mb-1">
-          <v-menu transition="slide-y-transition">
-            <template v-slot:activator="{ props, isActive }">
-              <v-btn color="primary" v-bind="props" variant="tonal" :append-icon="isActive ? 'mdi mdi-menu-up' : 'mdi mdi-menu-down'">
-                {{ query?.jobId ? select : '选择已发布职位推荐' }}
-              </v-btn>
-            </template>
-            <v-list>
-              <v-list-item v-for="k in selectItems.items" :key="k.value" color="primary" :active="k.value === query?.jobId">
-                <v-list-item-title @click="handleActive(k)">{{ k.label }}</v-list-item-title>
-              </v-list-item>
-            </v-list>
-          </v-menu>
-          <v-icon v-if="query?.jobId" color="primary" size="30" class="ml-3" @click="handleClearJob">mdi-close-circle-outline</v-icon>
-        </div>
-        <v-divider></v-divider>
-        <div v-if="items.length">
-          <div v-for="(val, index) in items" :key="val.id" @click="handleDetail(val)">
-            <div class="py-3 d-flex align-center">
-              <v-avatar size="large">
-                <v-img :src="getUserAvatar(val.avatar, val.sex)" width="50" height="50"></v-img>
-              </v-avatar>
-              <div class="ml-3 d-flex flex-column">
-                <p class="font-size-20">{{ val.name }}</p>
-                <p class="color-999 font-size-16">
-                  {{ val.jobStatusName }}
-                  <span v-if="val.jobStatusName && val.expName" class="septal-line"></span>
-                  {{ val.expName }}
-                  <span v-if="val.eduName" class="septal-line"></span>
-                  {{ val.eduName }}
-                </p>
-              </div>
-            </div>
-            <div class="bg-box" v-if="index !== items.length - 1"></div>
-          </div>
-        </div>
-        <Empty v-else :elevation="false" message="暂无数据"></Empty>
-      </v-card>
-    </div>
-
-    <Loading :visible="loading"></Loading>
-
-    <v-navigation-drawer v-model="screen" location="top" temporary class="px-5" style="border-radius: 0 0 10px 10px;">
-      <FilterPage ref="filterRef" @close="screen = false" @search="handleSearch"></FilterPage>
-    </v-navigation-drawer>
-  </div>
-</template>
-
-<script setup>
-defineOptions({ name: 'talentRecommendation'})
-import { ref, onMounted } from 'vue'
-import passwordFrom from '@/views/login/components/passwordPage.vue'
-import Snackbar from '@/plugins/snackbar'
-import { useUserStore } from '@/store/user'
-import { passwordLogin } from '@/api/common'
-import { getJobAdvertised, getPersonSearchPage, getPersonRecommendPage } from '@/api/enterprise'
-import { dealDictArrayData } from '@/utils/position'
-import { getUserAvatar } from '@/utils/avatar'
-import { useRouter } from 'vue-router'
-import FilterPage from './components/filter.vue'
-import { webContentStore } from '@/store/webContent'
-
-const webContent = webContentStore()
-const router = useRouter()
-const loading = ref(false)
-const passRef = ref(null)
-const items = ref([])
-const total = ref(0)
-const query = ref({
-  pageNo: 1,
-  pageSize: 20
-})
-const select = ref('')
-const screen1 = ref(false)
-const token = ref(localStorage.getItem('ENT_ACCESS_TOKEN'))
-const showLogin = ref(token.value ? false : true)
-const selectItems = ref({
-  label: '已发布职位',
-  placeholder: '请选择要进行推荐的职位',
-  clearable: true,
-  width: 600,
-  items: []
-})
-const textItem = ref({
-  type: 'text',
-  width: 600,
-  value: '',
-  label: '输入关键词搜索',
-  clearable: false,
-  readonly: true,
-  appendInnerIcon: 'mdi-magnify'
-})
-
-// 已发布职位列表
-const getJobList = async () => {
-  const data = await getJobAdvertised({ status: 0, exTime: 0 })
-  if (data.length) {
-    const list = dealDictArrayData([], data)
-    selectItems.value.items = list.map(e => {
-      return {
-        label: `${e.name}_${e.areaName ? e.area?.str : '全国'} ${e.payFrom ? e.payFrom + '-' : ''}${e.payTo ? e.payTo : ''}${e.payName ? '/' + e.payName : ''}`,
-        value: e.id
-      }
-    })
-  }
-}
-
-const handleActive = (k) => {
-  select.value = k.label
-  query.value.jobId = k.value
-  query.value.pageNo = 1
-  screen1.value = false
-  getData(true)
-}
-
-const handleClearJob = () => {
-  select.value = ''
-  delete query.value.jobId
-  query.value.pageNo = 1
-  items.value = []
-  total.value = 0
-  screen1.value = false
-}
-
-// 组件挂载后添加事件监听器
-const isMobile = ref(false)
-onMounted(async () => {
-  await webContent.getSystemWebContent()
-  if (!token.value) {
-    Snackbar.warning('请先登录')
-    showLogin.value = true
-  }
-  else getJobList()
-  const userAgent = navigator.userAgent
-  isMobile.value = /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i.test(userAgent)
-})
-
-// 列表
-const getData = async (isEmpty) => {
-  // isEmpty:是否清空列表
-  loading.value = true
-  try {
-    const res = query.value?.jobId ? await getPersonRecommendPage(query.value) : await getPersonSearchPage(query.value)
-    const list = res.list || []
-    items.value = list.length ? !isEmpty ? [...items.value, ...dealDictArrayData([], list)] : dealDictArrayData([], list) : []
-    total.value = res.total
-  } catch (err) {
-    loading.value = false
-    if (err.code === 401) {
-      items.value = []
-      total.value = 0
-      token.value = null
-      query.value = {
-        pageNo: 1,
-        pageSize: 20
-      }
-      Snackbar.warning('请先登录')
-      showLogin.value = true
-    }
-  } finally {
-    loading.value = false
-  }
-}
-
-// 底部加载
-const handleScroll = (e) => {
-  if (!token.value) {
-    showLogin.value = true
-    Snackbar.warning('请先登录')
-    return
-  }
-  if (e.srcElement.scrollTop + e.srcElement.clientHeight > e.srcElement.scrollHeight - 10) {
-    if (items.value.length < total.value) {
-      query.value.pageNo++
-      getData()
-    }
-  }
-}
-
-// 登录
-const handleLogin = async () => {
-  const { valid } = await passRef.value.passwordForm.validate()
-  if (!valid) return
-  loading.value = true
-  try {
-    const data = await passwordLogin({ ...passRef.value.loginData, account: passRef.value.loginData.phone })
-    await useUserStore().changeRole({ ...data, type: 'emailLogin', noJump: true })
-    await getJobList()
-    if (data?.accessToken) {
-      token.value = data?.accessToken
-      showLogin.value = false
-    }
-  } catch (err) {
-    Snackbar.warning(err)
-  } finally {
-    loading.value = false
-  }
-}
-
-// 人才详情
-const handleDetail = ({ userId, id }) => {
-  if (!token.value) {
-    showLogin.value = true
-    Snackbar.warning('请先登录')
-    return
-  }
-  if (!userId || !id) return
-  router.push(`/recruit/enterprise/talentRecommendation/details/${userId}?id=${id}`)
-}
-
-// 筛选
-const filterRef = ref()
-const screen = ref(false)
-const openDrawer = () => {
-  if (!token.value) {
-    showLogin.value = true
-    Snackbar.warning('请先登录')
-    return
-  }
-  screen.value = true
-}
-
-const handleSearch = (val) => {
-  if (!token.value) {
-    showLogin.value = true
-    Snackbar.warning('请先登录')
-    return
-  }
-  screen.value = false
-  textItem.value.value = val.content
-  query.value.pageNo = 1
-  query.value = Object.assign(query.value, val)
-  getData(true)
-}
-</script>
-
-<style scoped lang="scss">
-.content {
-  background-color: #f2f4f7;
-  height: 100vh;
-  overflow-y: auto;
-}
-.login-content {
-  position: relative;
-  width: 100%;
-  height: 100vh;
-  background-size: cover;
-  &-box {
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    translate: -50% -50%;
-    width: 420px;
-    height: 380px;
-    background-color: #fff;
-    border-radius: 10px;
-    &-title {
-      color: #4c4c4c;
-      font-size: 24px;
-    }
-  }
-}
-.bg-box {
-  height: 10px;
-  background-color: #f2f4f7;
-}
-.active {
-  color: var(--v-primary-base);
-  border: 2px solid var(--v-primary-base);
-}
-</style>

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません