提交 ba4f9dff authored 作者: 刘旭's avatar 刘旭

更新代码

上级 cf071c6d
......@@ -19,7 +19,7 @@
"element-plus": "^2.3.8",
"mockjs": "^1.1.0",
"pinia": "^2.1.4",
"pinia-plugin-persist": "^1.0.0",
"pinia-plugin-persistedstate": "^3.2.0",
"sass": "^1.64.1",
"vue": "^3.3.4",
"vue-router": "4"
......
......@@ -29,9 +29,9 @@ dependencies:
pinia:
specifier: ^2.1.4
version: 2.1.4(typescript@5.1.6)(vue@3.3.4)
pinia-plugin-persist:
specifier: ^1.0.0
version: 1.0.0(pinia@2.1.4)(vue@3.3.4)
pinia-plugin-persistedstate:
specifier: ^3.2.0
version: 3.2.0(pinia@2.1.4)
sass:
specifier: ^1.64.1
version: 1.64.1
......@@ -2789,19 +2789,12 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
/pinia-plugin-persist@1.0.0(pinia@2.1.4)(vue@3.3.4):
resolution: {integrity: sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==}
/pinia-plugin-persistedstate@3.2.0(pinia@2.1.4):
resolution: {integrity: sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==}
peerDependencies:
'@vue/composition-api': ^1.0.0
pinia: ^2.0.0
vue: ^2.0.0 || >=3.0.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
pinia: 2.1.4(typescript@5.1.6)(vue@3.3.4)
vue: 3.3.4
vue-demi: 0.12.5(vue@3.3.4)
dev: false
/pinia@2.1.4(typescript@5.1.6)(vue@3.3.4):
......@@ -3418,21 +3411,6 @@ packages:
fsevents: 2.3.2
dev: true
/vue-demi@0.12.5(vue@3.3.4):
resolution: {integrity: sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.3.4
dev: false
/vue-demi@0.14.5(vue@3.3.4):
resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==}
engines: {node: '>=12'}
......
......@@ -34,11 +34,22 @@
type="primary"
target=""
@click="login"
>登录/注册</el-link
>{{ token ? '已登录' : '登录/注册' }}</el-link
>
</template>
</div>
<div class="info-name">欢迎货拉拉科技</div>
<div class="info-name">
<div v-if="isPersonalOrCompany && token">{{ companyInfo?.FNAME }}</div>
<div v-if="!isPersonalOrCompany && token" class="flx-align-center">
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
:title="'欢迎' + personalInfo?.FNAME"
>欢迎{{ personalInfo?.FNAME }}</span
>
</div>
</div>
</div>
</div>
</div>
......@@ -47,22 +58,33 @@
<script lang="ts" setup>
import { menuList } from './config'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { baseURL } from '@/services'
import loginVue from '@/views/login/index.vue'
const route = useRoute()
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const activeName = ref('')
const show = ref(false)
const token = computed(() => globalStore.getToken)
const isPersonalOrCompany = computed(() => userInfoStore.isPersonalOrCompany)
const personalInfo = computed(() => userInfoStore.getPersonalInfo)
const companyInfo = computed(() => userInfoStore.getCompanyInfo)
watch(
() => route.fullPath,
(newPath: any) => {
activeName.value = newPath.split('?')[0]
activeName.value = '/' + newPath.split('/')[1].split('?')[0]
},
{ immediate: true }
)
const login = () => {
if (token.value) return
show.value = true
}
......@@ -114,12 +136,12 @@ const handleClick = (item: any) => {
}
.menu-list {
.item {
font-weight: 400;
font-size: 14px;
padding: 10px 24px 9px;
}
}
.info-name {
width: 150px;
white-space: nowrap;
color: var(--el-color-primary);
cursor: pointer;
......
......@@ -28,6 +28,8 @@ defineProps({
box-sizing: border-box;
display: flex;
flex-direction: column;
cursor: pointer;
img {
width: 100%;
min-height: 238px;
......
<template>
<div class="conditional-select" @mouseover="mouseover" @mouseleave="mouseleave">
<div style="padding-bottom: 10px">
<div ref="selectRef" class="current-select">
{{ name }}
<el-icon :color="iconColor">
<i-ep-CaretBottom
v-show="iconColor === '#C0C4CC'"
:style="{ color: modelValue ? '#177CFA' : '' }"
/>
<i-ep-CaretTop v-show="iconColor !== '#C0C4CC'" />
</el-icon>
</div>
</div>
<div ref="dropdownRef" class="filter-select-dropdown">
<div
v-for="(item, index) in list"
:key="index"
class="dropdown-item flx-justify-between"
@click="handleChange(item)"
>
<span :style="{ color: item.value === modelValue ? '#177CFA' : '' }">{{ item.label }}</span>
<el-icon color="#177CFA"><i-ep-Check v-show="item.value === modelValue" /></el-icon>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const props = defineProps({
modelValue: {
type: Number || String,
default: ''
},
name: {
type: String,
default: '工作经验'
},
list: {
type: Array,
default: () => []
} as any
})
const emits = defineEmits(['change', 'update:modelValue'])
const iconColor = ref('#C0C4CC')
const selectRef = ref()
const dropdownRef = ref()
watch(
() => props.modelValue,
() => {
if (props.modelValue) {
selectRef.value.style.backgroundColor = '#DCECFF'
selectRef.value.style.color = '#177CFA'
} else {
selectRef.value.style.backgroundColor = '#f8f8f8'
selectRef.value.style.color = '#222222'
}
}
)
const mouseover = () => {
selectRef.value.style.backgroundColor = '#DCECFF'
selectRef.value.style.color = '#177CFA'
dropdownRef.value.style.display = 'block'
iconColor.value = '#177CFA'
}
const mouseleave = () => {
if (!props.modelValue) {
selectRef.value.style.backgroundColor = '#f8f8f8'
selectRef.value.style.color = '#222222'
}
iconColor.value = '#C0C4CC'
dropdownRef.value.style.display = 'none'
}
const handleChange = (item: any) => {
dropdownRef.value.style.display = 'none'
if (item.value === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.value)
emits('change', item.value)
}
</script>
<style lang="scss" scoped>
.conditional-select {
position: relative;
margin-right: 20px;
.current-select {
padding: 6px 12px;
border-radius: 4px;
font-size: 14px;
font-weight: 400;
display: flex;
align-items: center;
background-color: #f8f8f8;
color: #222222;
cursor: pointer;
}
.filter-select-dropdown {
display: none;
position: absolute;
cursor: pointer;
top: 40px;
padding: 6px 10px;
border-radius: 8px;
min-width: 92px;
min-height: 50px;
border: 1px solid #ededed;
background-color: #ffffff;
transition: opacity 10 linear;
z-index: 99;
.dropdown-item {
box-sizing: border-box;
width: 168px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px;
font-size: 14px;
font-weight: 400;
color: #222222;
&:hover {
background-color: #f8f8f8;
color: #177cfa;
}
span {
display: block;
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.el-icon {
display: flex;
justify-content: flex-end;
width: 40px;
}
}
}
}
</style>
......@@ -6,7 +6,7 @@
<span class="poliy-item-order" :class="index > 2 ? 'poliy-item-postorder' : ''">{{
index + 1
}}</span>
<el-link>{{ item.detail }}</el-link>
<el-link>{{ item.FTITLE }}</el-link>
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
<div v-show="isMore" class="policy-footer">
......
......@@ -2,7 +2,7 @@
<div class="search-group">
<el-input
v-model="searchValue"
placeholder="请输入搜索关键字"
:placeholder="placeholder"
class="input-with-select"
@change="handleSearch"
>
......@@ -21,11 +21,20 @@
</template>
<script setup lang="ts">
defineProps({
placeholder: {
type: String,
default: '请输入搜索关键字'
}
})
const searchValue = ref()
const selectValue = ref('1')
const emits = defineEmits(['searchChange'])
const handleSearch = () => {
console.log(searchValue.value)
// console.log(searchValue.value)
emits('searchChange', searchValue.value)
}
</script>
......
......@@ -20,6 +20,18 @@ const routes = [
component: () => import('@/views/recruitmentManagement/index.vue')
},
{
path: '/recruitmentManagement/enterpriseRecruitment',
component: () => import('@/views/recruitmentManagement/enterpriseRecruitment.vue')
},
{
path: '/recruitmentManagement/personal',
component: () => import('@/views/recruitmentManagement/personalRecruitment.vue')
},
{
path: '/recruitmentManagement/enterprise',
component: () => import('@/views/recruitmentManagement/enterpriseRecruitment.vue')
},
{
path: '/specialRecruitment',
component: () => import('@/views/specialRecruitment/index.vue')
},
......@@ -80,6 +92,18 @@ const routes = [
{
path: '/RichTextEditor',
component: () => import('@/views/editor/index.vue')
},
{
path: '/home1',
component: () => import('@/views/home/index1.vue')
},
{
path: '/job',
component: () => import('@/views/job/index.vue')
},
{
path: '/details',
component: () => import('@/views/home/details.vue')
}
//{
//配置404页面
......@@ -89,14 +113,6 @@ const routes = [
//}
]
// {
// path: '/job',
// component: () => import('@/views/job/index.vue')
// },
// {
// path: '/details',
// component: () => import('@/views/home/details.vue')
// }
// 路由
const router = createRouter({
history: createWebHashHistory(),
......
import request from '@/services'
// 获取验证码
export const getCode = (Phone: string) => {
return request.post(
'/K3Cloud/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.Verification,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
{ Phone }
)
}
// 登录注册
export const loginSign = (data: any) => {
return request.post(
'/K3Cloud/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.LoginSign,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
import request from '@/services'
// 查询
export const getPolicy = (data: any) => {
return request.post(
'/K3Cloud/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SePolicyNoticeHome,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
export const getPolicyList = (data: any) => {
return request.post(
'/K3Cloud/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SePolicyNotice,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -6,7 +6,7 @@ import axios, {
AxiosResponse
} from 'axios'
import { ElMessage } from 'element-plus'
import { useGlobalStore } from '@/stores'
import { useGlobalStore } from '@/stores/modules/global'
import { LOGIN_URL } from '@/utils'
import router from '@/routers'
......@@ -28,7 +28,7 @@ interface ResultData<T = any> extends Result {
data?: T
}
let URL: string = ''
export let baseURL: string = '/K3Cloud'
enum RequestEnums {
TIMEOUT = 20000, // 请求超时
......@@ -41,7 +41,7 @@ let IsError = false
const config = {
// 默认地址
baseURL: URL as string,
baseURL: '',
// 设置超时时间
timeout: RequestEnums.TIMEOUT as number,
// 跨域时候允许携带凭证
......
import { PersistStrategy } from 'pinia-plugin-persist'
import { PersistedStateOptions } from 'pinia-plugin-persistedstate'
/**
* @description pinia持久化参数配置
* @description pinia 持久化参数配置
* @param {String} key 存储到持久化的 name
* @param {Array} paths 需要持久化的 state name
* @return persist
* */
const piniaPersistConfig = (paths?: any[]) => {
const persist: PersistStrategy = {
storage: localStorage,
// storage: sessionStorage,
const piniaPersistConfig = (key: string, paths?: string[]) => {
const persist: PersistedStateOptions = {
key,
// storage: localStorage,
storage: sessionStorage,
paths
}
return persist
......
import { defineStore, createPinia } from 'pinia'
import piniaPersistConfig from '../utils/piniaPersist'
import piniaPersist from 'pinia-plugin-persist'
export const useGlobalStore = defineStore('globalStore', {
// 相当于data
state: () => {
return {
token: '',
jobDetail: null as any
}
},
// 相当于计算属性
getters: {
getJobDtail: state => state.jobDetail
},
actions: {
setToken(token: string) {
this.token = token
},
setJobDetail(jobDetail: any) {
this.jobDetail = jobDetail
}
},
persist: {
enabled: true,
strategies: [{ storage: localStorage, paths: ['jobDetail'] }]
}
})
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
// pinia persist
const pinia = createPinia()
pinia.use(piniaPersist)
pinia.use(piniaPluginPersistedstate)
export default pinia
export interface GlobalState {
token: string
}
import { defineStore } from 'pinia'
import { GlobalState } from '../interface'
import piniaPersistConfig from '../helper/piniaPersist'
export const useGlobalStore = defineStore('globalStore', {
// 相当于data
state: (): GlobalState => {
return {
token: ''
}
},
// 相当于计算属性
getters: {
getToken: state => state.token
},
actions: {
setToken(token: string) {
this.token = token
}
},
persist: piniaPersistConfig('globalStore')
})
import { defineStore } from 'pinia'
import piniaPersistConfig from '../helper/piniaPersist'
export const useUserInfoStore = defineStore('userInfoStore', {
// 相当于data
state: () => {
return {
personalInfo: {} as any,
companyInfo: {} as any
}
},
// 相当于计算属性
getters: {
getPersonalInfo: state => state.personalInfo,
getCompanyInfo: state => state.companyInfo,
isPersonalOrCompany: state => {
if (JSON.stringify(state.personalInfo) !== '{}') return 0
if (JSON.stringify(state.companyInfo) !== '{}') return 1
}
},
actions: {
setPersonalInfo(personalInfo: any) {
this.personalInfo = personalInfo
},
setCompanyInfo(companyInfo: any) {
this.companyInfo = companyInfo
}
},
persist: piniaPersistConfig('userInfoStore')
})
......@@ -69,7 +69,7 @@
<el-empty v-else description="数据为空" />
</el-tab-pane>
</el-tabs>
<span class="n-more">查看更多</span>
<span v-show="positionList.length" class="n-more">查看更多</span>
</div>
</div>
</div>
......
<template>
<div class="container">
<div class="details-header">
<div class="content">
<div>
<div class="details-header-top">
<div>装卸</div>
<div class="salary-range">{{ detailData?.salaryRange }}</div>
</div>
<div class="details-header-center">
{{ detailData?.cityName }}/{{
detailData?.workingLife ? detailData?.workingLife : '经验不限'
}}/{{ detailData?.academicRequirement ? detailData?.academicRequirement : '学历不限' }}
</div>
<div class="details-header-bottom">
<img src="https://rms.junrunrenli.com/static/img/money02.df9ff2d6.png" class="icon" />
推荐金额
<div>{{ detailData?.rewards }}</div>
</div>
</div>
<div class="submit">
<el-button @click="show = !show">立即投递</el-button>
<div v-if="show" class="popupbox">
<img src="https://rms.junrunrenli.com/static/img/popup02.691d38c2.png" />
</div>
</div>
</div>
</div>
<div class="details-content">
<div class="content">
<div class="n-title">职位描述:</div>
<div class="text">
{{ detailData?.positionDescribe }}
</div>
<div class="n-title">工作地点</div>
<div class="text">
<img :src="locationIcon" class="address" />
{{ detailData?.workingplaceAddress }}
</div>
<div class="n-title">公司信息</div>
<div class="text">
<img :src="companyIcon" class="comp" />
{{ detailData?.customerName }}
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { companyIcon, locationIcon } from '@/utils/index'
import { useGlobalStore } from '@/stores/index'
const globalStore = useGlobalStore()
const detailData = computed(() => globalStore.getJobDtail)
const show = ref(false)
</script>
<style lang="scss" scoped>
.container {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
.details-header {
background-color: #f5f5f5;
width: 100%;
height: 238px;
display: flex;
justify-content: center;
.content {
padding-top: 40px;
width: 1316px;
display: flex;
justify-content: space-between;
.details-header-top {
display: flex;
font-size: 18px;
color: #242424;
margin-bottom: 25px;
align-items: flex-end;
.salary-range {
font-size: 16px;
color: #f3911d;
margin-left: 20px;
}
}
.details-header-center {
color: #666;
font-size: 15px;
display: inline-block;
margin-bottom: 25px;
}
.details-header-bottom {
font-size: 16px;
display: flex;
align-items: flex-end;
.icon {
width: 18px;
height: 18px;
margin-right: 10px;
}
div {
margin-left: 10px;
color: #f3911d;
}
}
.submit {
position: relative;
.el-button {
width: 140px;
height: 48px;
line-height: 48px;
background-color: #f3911d;
border-radius: 4px;
color: #fff;
padding: 0;
font-size: 20px;
}
.popupbox {
position: absolute;
z-index: 20;
right: -5px;
top: 50px;
img {
height: 171px;
width: 170px;
}
}
}
}
}
.details-content {
width: 100%;
background-color: #ffffff;
padding-top: 40px;
display: flex;
justify-content: center;
.content {
width: 1316px;
.title {
font-size: 18px;
margin-bottom: 16px;
color: #242424;
font-weight: 700;
}
.text {
font-size: 13px;
color: #666;
margin-bottom: 30px;
vertical-align: middle;
display: flex;
align-items: center;
.address {
width: 18px;
height: 20px;
display: inline-block;
margin-right: 10px;
vertical-align: middle;
padding-bottom: 2px;
}
.comp {
width: 50px;
height: 50px;
margin-right: 20px;
display: inline-block;
vertical-align: middle;
}
}
}
}
}
</style>
......@@ -38,6 +38,7 @@
justify-content: space-between;
margin-top: 24px;
.recruit-item {
cursor: pointer;
flex-basis: calc(25% - 7.5px); /* 让每个盒子占据四分之一的宽度,并减去间距 */
margin-bottom: 15px; /* 设置下方的间距 */
......
<template>
<div class="container">
<div class="top">
<el-carousel height="400px">
<el-carousel-item v-for="item in urls" :key="item">
<el-image
style="width: 100%; height: 100%; border-radius: 10px"
:src="item"
fit="cover"
/>
</el-carousel-item>
</el-carousel>
</div>
<div class="content">
<div v-for="item in 3" :key="item" :span="7" class="content-box">
<div class="header">公告</div>
<el-card shadow="never">
<template #default>
<el-scrollbar max-height="400px">
<div v-for="item1 in 13" :key="item1" class="link">
<el-link class="text" title="深圳市创业场租补贴办事指南"
>深圳市创业场租补贴办事指南</el-link
>
<el-icon><i-ep-search /></el-icon>
</div>
</el-scrollbar>
<div class="card-footer">
<el-link type="primary" :underline="false" href="">查看更多>>></el-link>
</div>
</template>
</el-card>
</div>
</div>
<div class="bottom">
<div style="text-align: center; margin-bottom: 20px">
<el-input
v-model="listQuery.obj.postName"
placeholder="搜索职位、公司"
:suffix-icon="Search"
size="large"
style="width: 70%"
@change="inputChange"
/>
</div>
<el-row class="job-item">
<el-col v-for="item in positionList" :key="item.id" :span="8" @click="toDetails(item)">
<el-card shadow="never">
<template #header>
<div class="card-header">
<div class="card-header-top">
<div class="card-header-top-left">{{ item.postName }}</div>
<div class="card-header-top-right">
<div>
{{
item.salaryRange?.substring(0, item.salaryRange.indexOf('元'))
? item.salaryRange?.substring(0, item.salaryRange.indexOf('元'))
: item.salaryRange
}}
</div>
<text v-show="item.salaryRange?.substring(0, item.salaryRange.indexOf('元'))"
>元/月</text
>
</div>
</div>
<div class="card-header-bottom">
{{ item.academicRequirement }} | {{ item.workingLife }} | 招聘{{
item.recruitingNumbers
}}
</div>
</div>
</template>
<div class="card-content">
<div>{{ item.customerName }}</div>
<div class="card-content-bottom">
{{ item.recruitingType }} | {{ item.ageRequirement }} 人 | 餐饮
</div>
</div>
</el-card>
</el-col>
</el-row>
</div>
</div>
</template>
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue'
import { getPositionList } from '@/services/api/home'
import { useGlobalStore } from '@/stores/index'
const globalStore = useGlobalStore()
const urls = [
'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg'
]
const router = useRouter()
const listQuery = reactive({
obj: {
postName: ''
},
currentPage: 1,
pageSize: 6
})
const positionList = ref([] as any)
const inputChange = (val: string) => {
init()
}
const toDetails = (row: any) => {
globalStore.setJobDetail(row)
router.push('/details')
}
const init = async () => {
const res: any = await getPositionList(listQuery)
if (res.code === 200) {
positionList.value = res.data.obj
}
}
init()
</script>
<style lang="scss" scoped>
// :deep(.el-tabs__item) {
// border: 1px solid #ccc;
// }
:deep(.el-tabs__nav-wrap::after) {
height: 0;
}
:deep(.el-tabs__active-bar) {
height: 0;
}
:deep(.is-active) {
color: #303133;
}
.container {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
.top {
width: 1316px;
border-radius: 10px;
margin: 30px;
}
.content {
width: 1316px;
// height: 410px;
display: flex;
margin-bottom: 40px;
.content-box {
width: calc((100% - 30px) / 3);
display: flex;
flex-direction: column;
.header {
width: 100%;
height: 40px;
color: #ffffff;
background-color: #409eff;
display: flex;
justify-content: center;
align-items: center;
}
.el-card {
width: 100%;
flex: 1;
box-sizing: border-box;
:deep(.el-card__body) {
padding: 0;
}
:deep(.el-scrollbar) {
padding: 10px;
box-sizing: border-box;
}
.card-footer {
height: 30px;
line-height: 30px;
text-align: right;
margin-right: 10px;
padding-bottom: 10px;
.el-link {
font-size: 12px;
}
}
.link {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
margin: 5px 0;
.text {
width: 50%;
text-align: left;
:deep(.el-link__inner) {
display: inline-block;
width: 100%; /* 设置宽度 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
white-space: nowrap; /* 阻止文本换行 */
}
}
}
}
}
& .content-box:nth-child(2) {
margin: 0 15px;
}
}
.bottom {
width: 1316px;
margin-bottom: 20px;
.job-item {
// :deep(.el-card__header) {
// padding: 26px 20px 10px;
// }
.card-header {
display: flex;
flex-direction: column;
.card-header-top {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.card-header-top-left {
font-weight: bolder;
}
.card-header-top-right {
div {
display: inline-block;
font-weight: bolder;
margin-right: 5px;
color: #f33f33;
}
text {
font-size: 12px;
color: #909399;
}
}
}
.card-header-bottom {
font-size: 14px;
color: #909399;
}
}
.card-content {
font-size: 14px;
.card-content-bottom {
color: #909399;
margin-top: 16px;
}
}
.el-col-8 {
margin-bottom: 15px;
max-width: calc((100% - 30px) / 3);
flex: 0 0 calc((100% - 30px) / 3);
}
.el-col-8:nth-child(3n + 2) {
margin: 0 15px;
}
}
}
}
</style>
<template>
<el-card></el-card>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped></style>
......@@ -8,8 +8,10 @@
>
<div class="login-dialog">
<div class="login-top">
<div class="info">个人用户</div>
<div class="switch-info">切换为企业用户>></div>
<div class="info">{{ state.userType }}</div>
<div class="switch-info" @click="switchUsers">
切换为{{ state.userType === '个人用户' ? '企业用户' : '个人用户' }}>>
</div>
</div>
<el-form ref="formRef" :model="state.loginForm" :rules="state.loginRules" label-width="0">
<el-form-item label="" prop="Phone">
......@@ -25,7 +27,9 @@
<img src="../../assets/img/pwd.png" alt="" />
</template>
<template #suffix>
<el-button type="primary" link :disabled="state.disabled">获取验证码</el-button>
<el-button type="primary" link :disabled="state.sended" @click="sendCode">{{
state.buttonText
}}</el-button>
</template>
</el-input>
</el-form-item>
......@@ -50,6 +54,10 @@
</template>
<script setup lang="ts">
import { getCode, loginSign } from '@/services/api/login'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
const props = defineProps({
show: {
type: Boolean,
......@@ -58,12 +66,15 @@ const props = defineProps({
})
const emits = defineEmits(['update:show'])
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const formRef = ref()
const state = reactive({
userType: '个人用户',
loginForm: {
Phone: '',
Code: ''
Phone: '18874693873',
Code: '3123'
},
loginRules: {
Phone: [
......@@ -76,15 +87,68 @@ const state = reactive({
],
Code: [{ required: true, message: '请输入验证码', trigger: 'blur' }]
},
disabled: false,
agreeWith: false
agreeWith: false,
sended: false,
buttonText: '获取验证码',
EnCode: '3cu2jF0iHXYVJfSnl0MkLg=='
})
const switchUsers = () => {
formRef.value?.resetFields()
if (state.userType === '企业用户') state.userType = '个人用户'
else state.userType = '企业用户'
}
const sendCode = () => {
formRef.value?.validateField(['Phone'], async (valid: boolean) => {
if (valid) {
// 发送验证码请求
const res: any = await getCode(state.loginForm.Phone)
if (res.code === 200) {
console.log(res)
state.EnCode = res.data
// 请求成功后将 sended 设为 true,按钮禁用,并显示倒计时
state.sended = true
state.buttonText = '已发送'
let countDown = 60
const timer = setInterval(() => {
if (countDown > 0) {
state.buttonText = `${countDown}s 后重试`
} else {
state.sended = false
state.buttonText = '获取验证码'
clearInterval(timer)
}
countDown--
}, 1000)
}
}
})
}
const onConfirm = () => {
formRef.value?.validate((valid: boolean, fields: any) => {
if (!state.agreeWith) return ElMessage.warning('请先同意授权!')
formRef.value?.validate(async (valid: boolean, fields: any) => {
if (valid) {
console.log(state.loginForm)
console.log('submit!')
const params = {
Phone: state.loginForm.Phone,
Code: state.loginForm.Code,
EnCode: state.EnCode,
Type: state.userType === '个人用户' ? 'GR' : 'QY' //企业:QY 个人:GR
}
const res: any = await loginSign(params)
if (res.code === 200) {
if (state.userType === '个人用户') {
userInfoStore.setCompanyInfo({})
userInfoStore.setPersonalInfo(res.data)
} else {
userInfoStore.setPersonalInfo({})
userInfoStore.setCompanyInfo(res.data)
}
globalStore.setToken(res.data.Token)
handleClose()
ElMessage.success('登录成功')
}
} else {
console.log('error submit!', fields)
}
......
<template>
<div class="policy-container flx-center">
<div class="policy-container flx-center" v-loading="loading">
<div class="container">
<img :src="imgUrl" height="560" style="width: 100%" />
<img
:src="baseURL + '/' + policyData?.HbData?.[0].FPOSTERPICTURE"
height="560"
style="width: 100%"
/>
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
<template #suffix>
<el-icon size="24" style="cursor: pointer" @click="search"><i-ep-Search /></el-icon>
</template>
</el-input>
<div class="flx-justify-between" style="margin-bottom: 64px">
<policy title="南山就业政策公告" :list="policyList" is-more />
<policy title="南山就业活动" :list="policyList" is-more />
<policy title="南山就业政策公告" :list="policyData?.GgData" is-more />
<policy title="南山就业活动" :list="policyData?.HdData" is-more />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { imgUrl } from '@/assets/imgUrl'
import { baseURL } from '@/services'
import { getPolicy } from '@/services/api/policy'
import policy from '@/components/policy.vue'
const policyList = [
......@@ -32,10 +37,24 @@ const policyList = [
{ detail: '关于协助做好2022年农村电商“省级精英训练营”宣传发动有关工作的通知' }
]
const searchValue = ref()
const loading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10 })
const policyData: any = ref()
const search = () => {
console.log(searchValue.value)
}
const init = async () => {
const res: any = await getPolicy(queryList.value)
if (res.code === 200) {
console.log(res)
policyData.value = res.data
loading.value = false
}
}
init()
</script>
<style lang="scss" scoped>
......
export const filterList = [
{
name: '工作经验',
list: [
{
value: '不限',
label: '不限'
},
{
value: '无经验',
label: '无经验'
},
{
value: '1年以下',
label: '1年以下'
},
{
value: '1-3年',
label: '1-3年'
},
{
value: '3-5年',
label: '3-5年'
}
]
},
{
name: '薪资待遇',
list: [
{
value: '不限',
label: '不限'
},
{
value: '4k以下',
label: '4k以下'
},
{
value: '4k-6k',
label: '4k-6k'
},
{
value: '6k-8k',
label: '6k-8k'
},
{
value: '8k-10k',
label: '8k-10k'
},
{
value: '50k以上',
label: '50k以上'
}
]
},
{
name: '学历要求',
list: [
{
value: '不限',
label: '不限'
},
{
value: '高中及以下',
label: '高中及以下'
},
{
value: '大专',
label: '大专'
},
{
value: '本科',
label: '本科'
},
{
value: '硕士',
label: '硕士'
},
{
value: '博士',
label: '博士'
}
]
},
{
name: '公司规模',
list: [
{
value: '不限',
label: '不限'
},
{
value: '20人以下',
label: '20人以下'
},
{
value: '20-99人',
label: '20-99人'
},
{
value: '100-299人',
label: '100-299人'
},
{
value: '300-499人',
label: '300-499人'
},
{
value: '500-999人',
label: '500-999人'
},
{
value: '1000-9999人',
label: '1000-9999人'
}
]
},
{
name: '融资情况',
list: [
{
value: '不限',
label: '不限'
},
{
value: '未融资',
label: '未融资'
},
{
value: '天使轮',
label: '天使轮'
},
{
value: 'A轮',
label: 'A轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'C轮',
label: 'C轮'
},
{
value: 'D轮及以上',
label: 'D轮及以上'
},
{
value: '已上市',
label: '已上市'
},
{
value: '不需要融资',
label: '不需要融资'
}
]
}
]
export const recruitStatus = [
{ statu: '简历未查看', value: '10份' },
{ statu: '简历待定', value: '10份' },
{ statu: '安排面试', value: '10份' },
{ statu: '已面试', value: '10份' },
{ statu: '已录用', value: '10份' },
{ statu: '已入职', value: '10份' },
{ statu: '人才库', value: '10份' },
{ statu: '黑名单', value: '10份' }
]
export const talentList = [
{ name: '人才储备', value: '' },
{ name: '业绩优秀', value: '' },
{ name: '背景优秀', value: '' },
{ name: '销售', value: '' },
{ name: '技术', value: '' }
]
<template>
<div class="enterprise-container">
<div class="container">
<div class="enterprise-header">
<div class="enterprise-header-lf">
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
<template #suffix>
<el-icon size="24" style="cursor: pointer" @click="search"><i-ep-Search /></el-icon>
</template>
</el-input>
<div style="position: relative">
<img src="@/assets/img/Banner.png" width="869" height="376" />
<span class="img-ct">深圳南山区就业服务平台</span>
</div>
</div>
<div class="enterprise-header-rg">
<div class="company-tp">
<img
src="@/assets/img/icon-can.png"
width="90"
height="90"
style="border-radius: 12px"
/>
<div class="flx-direction-column">
<span class="company-title">货拉拉科技</span>
<div>
<span class="info-label">互联网</span>
<span class="info-label">D轮及以上</span>
<span class="info-label">10000人以上</span>
</div>
<div class="company-addr">
<el-icon style="margin-right: 3px"><i-ep-Location /></el-icon>
深圳市南山区南山街道办1109号7-6楼
</div>
</div>
</div>
<div class="company-detail">
货拉拉于2013年创立,成长于粤港澳大湾区。是一家从事同城/跨城货运、企业版物流服务、搬家、零担、汽车租售及车后市场服务的互联网物流商城。[7-8]
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
</div>
<el-divider style="margin: 12px 0" />
<div class="recruit-status">
<div class="flx-justify-between" style="margin-bottom: 12px; flex-wrap: wrap">
<div
v-for="(item, index) in recruitStatus"
:key="index"
class="flx-align-center status-item"
style="width: 50%; margin-bottom: 12px"
>
<div class="label">{{ item.statu }}</div>
<span>{{ item.value }}</span>
</div>
</div>
</div>
<div class="flx-justify-between">
<span class="btn">编辑公司信息</span>
<span class="btn">发布职位</span>
</div>
</div>
</div>
<el-tabs v-model="activeName" stretch style="margin-bottom: 30px">
<el-tab-pane
v-for="(item, index) in recruitStatus"
:key="index"
:label="item.statu"
:name="item.statu"
>
<div style="display: flex">
<div v-show="item.statu === '人才库'">
<div class="talent-list">
<div
v-for="(col, colIndex) in talentList"
:key="colIndex"
class="talent-item"
:style="{ backgroundColor: talentActive === col.name ? '#dcecff' : '' }"
@click="talentChange(col)"
>
{{ col.name }}
</div>
</div>
</div>
<div style="flex: 1">
<div v-for="(col, colIndex) in 4" :key="colIndex" class="tab-item">
<div class="tab-item-tp">
<div class="tab-item-tp-lf">
<el-avatar :src="can" size="large" />
<div class="user-info">
<div>龙昌萍</div>
<div class="flx-align-center">
<span>未知</span>
<el-divider direction="vertical" style="margin-bottom: 0" />
<span>20岁</span>
</div>
<div class="flx-align-center">
<el-icon><i-ep-OfficeBuilding /></el-icon>
<span style="margin-left: 3px">在职求职中</span>
</div>
<div class="flx-align-center">
<el-icon><i-ep-OfficeBuilding /></el-icon>
<span style="margin-left: 3px">2021-09至2024-07</span>
</div>
</div>
</div>
<div class="tab-item-tp-rg">
<div class="flx-align-center">
<span class="info-label">简历待定</span>
<span class="info-label">安排面试</span>
<el-dropdown>
<span class="info-label">更多</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>已面试</el-dropdown-item>
<el-dropdown-item>已录用</el-dropdown-item>
<el-dropdown-item>已入职</el-dropdown-item>
<el-dropdown-item>人才库</el-dropdown-item>
<el-dropdown-item>黑名单</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<div class="recommend flx-align-center">
推荐指数
<el-rate v-model="rateValue" style="margin-left: 8px" />
</div>
</div>
</div>
<div class="tab-item-bt flx-justify-between">
<div>
<span class="user-label">大专</span>
<el-divider direction="vertical" />
<span class="user-label">长江工程职业技术学校</span>
<el-divider direction="vertical" />
<span class="user-label">计算机软件技术</span>
</div>
<div>
<span class="user-label">抖音运营</span>
<el-divider direction="vertical" />
<span class="user-label">2023/07/10投递</span>
<el-divider direction="vertical" />
<span class="user-label">3323234</span>
</div>
</div>
</div>
<el-pagination background layout="->, prev, pager, next" :total="1000" />
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script setup lang="ts">
import { recruitStatus, talentList } from './config/index'
import can from '@/assets/img/icon-can.png'
const searchValue = ref()
const rateValue = ref(4)
const talentActive = ref('人才储备')
const activeName = ref('简历未查看')
const search = () => {
console.log(searchValue.value)
}
const talentChange = (row: any) => {
talentActive.value = row.name
}
</script>
<style lang="scss" scoped>
@import url(./style/enterprise.scss);
</style>
<template>
<div class="main-container">
<search style="margin: 25px 0" />
<search style="margin: 25px 0" @search-change="searchChange" />
<div class="banner-group">
<div class="job-menu">
<el-menu class="el-menu-vertical-demo">
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div class="menu-item-title">
<span>{{ item.name }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
</el-menu-item>
</el-menu>
<div class="job-menu-sub" @mouseover="mouseover" @mouseout="mouseout">
<el-scrollbar height="400px">
<el-descriptions v-for="item in 10" :key="item" :column="4">
<div style="width: 444px; box-sizing: border-box" @mouseover="mouseover" @mouseout="mouseout">
<div class="job-menu">
<el-menu class="el-menu-vertical-demo">
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div style="font-size: 14px; font-weight: 400">销售</div>
<div class="menu-item-title">
<span>{{ item.name }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
<el-descriptions-item v-for="item1 in 4" :key="item1">
<template #default>
<el-link :underline="false" href="/job">销售业务</el-link>
</el-menu-item>
</el-menu>
<div class="job-menu-sub" @mouseover="mouseover" @mouseout="mouseout">
<el-scrollbar height="400px">
<el-descriptions v-for="item in 10" :key="item" :column="4">
<template #title>
<div style="font-size: 14px; font-weight: 400">销售</div>
</template>
</el-descriptions-item>
</el-descriptions>
</el-scrollbar>
<el-descriptions-item v-for="item1 in 4" :key="item1">
<template #default>
<el-link :underline="false" href="/job">销售业务</el-link>
</template>
</el-descriptions-item>
</el-descriptions>
</el-scrollbar>
</div>
</div>
</div>
<div class="street-list">
......@@ -146,6 +148,8 @@ import Frame515 from '@/assets/img/Frame515.png'
import Frame381 from '@/assets/img/Frame381.png'
import Frame382 from '@/assets/img/Frame382.png'
const router = useRouter()
const menuList = [
{
index: 0,
......@@ -212,7 +216,13 @@ const tabsList = [
]
const activeName = ref(0)
const handleClick = (tab: string) => {}
const handleClick = (tab: string) => {
router.push({ path: '/recruitmentManagement/enterprise' })
}
const searchChange = (searchValue: string) => {
router.push({ path: '/recruitmentManagement/personal', query: { searchValue } })
}
// 鼠标移入
const mouseover = (row?: any) => {
......@@ -221,6 +231,7 @@ const mouseover = (row?: any) => {
jobMenuJob.style.display = 'block'
jobMenu.style.borderRadius = '12px 0 0 12px'
jobMenuJob.style.borderRadius = '0 12px 12px 0'
if (!row) return
}
// 鼠标离开
......@@ -230,9 +241,10 @@ const mouseout = (row?: any) => {
jobMenuJob.style.display = 'none'
jobMenu.style.borderRadius = '12px'
jobMenuJob.style.borderRadius = '12px'
if (!row) return
}
</script>
<style lang="scss" scoped>
@import url(./index.scss);
@import url(./style/index.scss);
</style>
<template>
<div class="personal-container flx-center">
<div class="container">
<div class="personal-filter flx-direction-column">
<div class="personal-header">
<search
placeholder="搜索关键字"
style="margin-bottom: 22px"
@search-change="searchChange"
/>
<el-tabs v-model="activeName">
<el-tab-pane label="所属街道办" name="0"></el-tab-pane>
</el-tabs>
<div class="street-list">
<el-button
v-for="(item, index) in streetList"
:key="index"
:type="item.active ? 'primary' : ''"
link
@click="streetChange(index)"
>{{ item.name }}</el-button
>
</div>
<div class="flx-justify-between">
<div class="select-list">
<customSelect
v-for="(item, index) in filterList"
:key="index"
v-model="filterState['selectVal' + index]"
:name="item.name"
:list="item.list"
/>
</div>
<el-link class="clear-filter" :underline="false" target="" @click="clearFilter"
>清空筛选条件</el-link
>
</div>
</div>
<div class="personal-contnet">
<div v-for="item in 6" :key="item" class="personal-ct-item">
<div class="personal-ct-item-tp">
<div class="personal-ct-item-tp-lf">
<div style="margin-bottom: 12px">电销质培主管 [深圳·南山区·科技园]</div>
<div>
<div class="salary" style="font-size: 16px">8-13K</div>
<span class="info-label">3-5年</span>
<span class="info-label">大专</span>
</div>
</div>
<div class="personal-ct-item-tp-ct">
<img
src="@/assets/img/icon-can.png"
width="54"
height="54"
style="margin-right: 12px"
/>
<div class="flx-column-start-between">
<div class="company-name nowrap-ellipsis">货拉拉科技</div>
<div>
<span class="info-label">互联网</span>
<span class="info-label">D轮及以上</span>
<span class="info-label">10000人以上</span>
</div>
</div>
</div>
<div class="personal-ct-item-tp-bt">
<span>投递</span>
</div>
</div>
<div class="personal-ct-item-bt flx-align-center">
<div style="width: 416px">
<span>全职</span>
<el-divider direction="vertical" />
<span>远程办公</span>
<el-divider direction="vertical" />
<span>线下办公</span>
<el-divider direction="vertical" />
<span>抖音</span>
<el-divider direction="vertical" />
<span>快手</span>
</div>
<p class="nowrap-ellipsis">
交通补助,带薪年假,节日福利,员工旅游,零食下午茶,交通补助,带薪年假,节日福利,员工旅游,零食下午茶.
</p>
</div>
</div>
<div style="text-align: center; margin-top: 8px">
<span class="n-more">查看更多</span>
</div>
</div>
<!-- <el-empty description="暂无数据" /> -->
</div>
<div class="personal-info">
<div class="personal-info-tp">
<div class="personal-info-tp-lf">{{ personalInfo?.FNAME }}</div>
<div class="personal-info-tp-rg">编辑简历</div>
</div>
<div class="personal-info-ct">
<span>年龄:{{ personalInfo?.AGE }}</span>
<span>工作年限:2年</span>
<span>学历:{{ personalInfo?.F_LQKJ_EDUCATIONS }}</span>
</div>
<el-divider />
<div class="personal-info-bt">
<div class="personal-info-bt-item">
<div class="personal-info-label">求职状态</div>
<span>{{ personalInfo?.F_LQKJ_DEPARTREMAIN }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已投递</div>
<span>{{ personalInfo?.DeliverCount }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已面试</div>
<span>{{ personalInfo?.InteriviewCount }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { filterList } from './config/index'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
import search from '@/components/search.vue'
import customSelect from '@/components/customSelect.vue'
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const activeName = ref('0')
const streetActive = ref('粤海街道办')
const streetList = ref([
{ name: '粤海街道办', active: true },
{ name: '南山街道办', active: false },
{ name: '南头街道办', active: false },
{ name: '西明街道办', active: false },
{ name: '招商街道办', active: false },
{ name: '桃源街道办', active: false },
{ name: '沙河街道办', active: false },
{ name: '蛇口街道办', active: false }
])
const filterState: any = ref({
selectVal: '',
selectVal1: '',
selectVal2: '',
selectVal3: '',
selectVal4: ''
})
const token = computed(() => globalStore.getToken)
const personalInfo = computed(() => userInfoStore.getPersonalInfo)
const searchChange = (searchValue: string) => {}
const streetChange = (index: number) => {
streetActive.value = streetList.value[index].name
streetList.value.map((item: any, i: number) => {
if (i === index) item.active = true
else item.active = false
})
}
const clearFilter = () => {
filterState.value = {
selectVal: '',
selectVal1: '',
selectVal2: '',
selectVal3: '',
selectVal4: ''
}
}
</script>
<style lang="scss" scoped>
@import url(./style/personal.scss);
</style>
.enterprise-container {
display: flex;
justify-content: center;
.container {
width: 1316px;
padding-top: 24px;
.enterprise-header {
margin-bottom: 48px;
display: flex;
.enterprise-header-lf {
width: 869px;
margin-right: 24px;
.el-input {
height: 62px;
margin-bottom: 24px;
:deep(.el-input__wrapper) {
border-radius: 29px;
padding: 0 45px;
}
}
img {
border-radius: 12px;
display: block; /* 将图片设置为块级元素 */
max-width: 100%; /* 保证图片在其父元素内部自适应大小 */
}
.img-ct {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 28px;
font-weight: 500;
color: #ffffff;
}
}
.enterprise-header-rg {
flex: 1;
background: #ffffff;
border-radius: 12px;
padding: 20px 16px 32px;
.company-tp {
display: flex;
img {
margin-right: 16px;
}
.company-title {
font-size: 16px;
font-weight: 400;
color: #222222;
margin-bottom: 14px;
}
.company-addr {
font-size: 12px;
font-weight: 400;
color: #999999;
line-height: 14px;
margin-top: 16px;
display: flex;
align-items: center;
}
}
.company-detail {
width: 391px;
height: 80px;
font-size: 12px;
font-weight: 400;
color: #666666;
display: -webkit-box;
-webkit-line-clamp: 5;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 25px;
}
.recruit-status {
margin-bottom: 12px;
.status-item {
&:nth-child(2n) {
display: flex;
justify-content: flex-end;
}
.label {
width: 70px;
font-size: 14px;
font-weight: 400;
color: #222222;
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
margin-left: 12px;
}
}
}
.btn {
display: block;
width: 180px;
height: 45px;
line-height: 45px;
text-align: center;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 8px;
font-size: 14px;
font-weight: 400;
color: #ffffff;
cursor: pointer;
}
}
}
.talent-list {
width: 222px;
min-height: 20px;
background: #ffffff;
box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.05);
margin-right: 24px;
border-radius: 8px;
.talent-item {
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
&:first-child {
border-radius: 8px 8px 0 0;
}
&:last-child {
border-radius: 0 0 8px 8px;
}
&:hover {
background: #f8f8f8;
}
}
}
.tab-item {
background: #ffffff;
border-radius: 12px;
margin-bottom: 16px;
.tab-item-tp {
padding: 16px 24px;
display: flex;
justify-content: space-between;
.tab-item-tp-lf {
display: flex;
.user-info {
display: flex;
flex-direction: column;
margin-left: 8px;
div {
margin-bottom: 12px;
&:last-child {
margin-bottom: 0;
}
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
.tab-item-tp-rg {
display: flex;
flex-direction: column;
justify-content: space-between;
.recommend {
font-size: 16px;
font-weight: 400;
color: #222222;
}
:deep(.el-dropdown) {
line-height: normal;
}
}
}
.tab-item-bt {
background: linear-gradient(90deg, #e3f0ff 0%, rgba(227, 240, 255, 0.15) 100%);
border-radius: 0px 0px 12px 12px;
padding: 15px 26px 15px 86px;
.user-label {
font-size: 12px;
font-weight: 400;
color: #666666;
}
}
}
:deep(.el-tabs__active-bar) {
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
}
}
.info-label {
padding: 2px 8px;
background: #c0dcff;
border-radius: 4px;
font-size: 14px;
font-weight: 400;
color: #177cfa;
margin-right: 8px;
cursor: pointer;
&:focus {
outline: 0 !important;
}
}
}
......@@ -34,7 +34,7 @@
display: none;
position: absolute;
top: 0;
left: 418px;
left: 444px;
z-index: 10;
width: 904px;
height: 418px;
......@@ -53,9 +53,9 @@
}
}
.street-list {
width: 888px;
width: 872px;
height: 418px;
margin-left: 16px;
// margin-left: 16px;
display: flex;
flex-wrap: wrap;
img {
......@@ -79,6 +79,7 @@
display: flex;
flex-wrap: wrap;
.position-item {
cursor: pointer;
width: calc((100% - 32px) / 3);
flex: 0 0 calc((100% - 32px) / 3);
margin: 0 16px 24px 0;
......@@ -121,6 +122,7 @@
flex-wrap: wrap;
margin-top: 24px;
.company-item {
cursor: pointer;
width: calc((100% - 32px) / 3);
flex: 0 0 calc((100% - 32px) / 3);
margin: 0 16px 16px 0;
......
.personal-container {
width: 100%;
.container {
width: 1316px;
display: flex;
padding: 24px 0;
.personal-filter {
flex: 1;
.personal-header {
padding: 26px 20px 16px;
background: #ffffff;
border-radius: 12px;
margin-bottom: 16px;
:deep(.el-tabs__active-bar) {
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
}
:deep(.el-tabs__nav-wrap::after) {
display: none;
}
:deep(.el-input__wrapper) {
border: 1px solid #cccccc;
}
:deep(.el-select) {
.el-input__wrapper {
border: 0;
}
}
.street-list {
display: flex;
flex-wrap: wrap;
margin-bottom: 21px;
.el-button {
margin: 0 30px 0 0;
}
}
.select-list {
display: flex;
flex-wrap: wrap;
}
.clear-filter {
width: 84px;
font-size: 14px;
font-weight: 400;
}
}
.personal-contnet {
width: 100%;
.personal-ct-item {
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
margin-bottom: 15px;
.personal-ct-item-tp {
display: flex;
.personal-ct-item-tp-lf {
width: 440px;
padding: 16px 24px;
font-size: 16px;
font-weight: 400;
color: #222222;
box-sizing: border-box;
}
.personal-ct-item-tp-ct {
width: 364px;
padding: 16px 10px;
box-sizing: border-box;
display: flex;
align-items: center;
.company-name {
width: 100%;
height: 22px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-bottom: 14px;
}
}
.personal-ct-item-tp-bt {
flex: 1;
display: flex;
align-items: end;
justify-content: flex-end;
padding-right: 24px;
cursor: pointer;
span {
display: block;
width: 92px;
height: 42px;
line-height: 42px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 8px;
font-size: 16px;
font-weight: 500;
color: #ffffff;
text-align: center;
}
}
}
.personal-ct-item-bt {
background: linear-gradient(90deg, #e3f0ff 0%, rgba(227, 240, 255, 0.15) 100%);
border-radius: 0px 0px 12px 12px;
padding: 15px 24px;
span {
font-size: 12px;
font-weight: 400;
color: #666666;
}
p {
width: 324px;
height: 18px;
font-size: 12px;
font-weight: 400;
color: #666666;
line-height: 18px;
}
}
}
}
}
.personal-info {
box-shadow: 0px 4px 6px 0px rgba(0, 0, 0, 0.03);
border-radius: 12px;
background-color: #ffffff;
margin-left: 24px;
padding: 12px 20px;
height: 145px;
.personal-info-tp {
display: flex;
align-items: center;
margin-bottom: 8px;
.personal-info-tp-lf {
text-align: center;
flex: 1;
font-size: 18px;
font-weight: 500;
color: #222222;
}
.personal-info-tp-rg {
width: 48px;
font-size: 12px;
font-weight: 400;
color: #177cfa;
cursor: pointer;
}
}
.personal-info-ct {
font-size: 14px;
font-weight: 400;
color: #666666;
span {
margin-right: 16px;
}
}
.el-divider {
margin: 8px 0;
}
.personal-info-bt {
.personal-info-bt-item {
margin-bottom: 5px;
display: flex;
align-items: center;
.personal-info-label {
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
width: 64px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-right: 24px;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
}
.info-label {
background: #f8f8f8;
border-radius: 4px;
font-size: 12px;
font-weight: 400;
color: #666666;
padding: 2px 8px;
margin-left: 8px;
}
}
}
......@@ -67,6 +67,57 @@
}
}
.sub-district-office {
.sub-district-office-list {
display: flex;
margin: 24px 0 48px;
.sub-district-office-item {
position: relative;
flex: 0 0 25%;
box-sizing: border-box;
width: 329px;
height: 80px;
background: #022756;
font-size: 18px;
font-weight: 500;
color: #ffffff;
line-height: 80px;
border-right: 1px solid #ffffff;
cursor: pointer;
&:last-child {
border-radius: 0 8px 8px 0;
}
&:first-child {
border-radius: 8px 0 0 8px;
}
.sub-district-triangle {
position: absolute;
bottom: 0;
left: 50%;
transform: translate(-50%, 100%);
width: 0;
height: 0;
border-left: 12px solid transparent;
border-right: 12px solid transparent;
border-top: 24px solid #177cfa;
}
}
}
.sub-district-office-detail {
padding: 24px 26px;
background: #ffffff;
margin-bottom: 64px;
border-radius: 12px;
font-size: 14px;
font-weight: 400;
color: #333333;
line-height: 25px;
text-align: start;
}
}
.hot-position {
margin-bottom: 64px;
text-align: center;
......
......@@ -17,6 +17,26 @@
</div>
</div>
<!-- 街道办 -->
<div class="sub-district-office">
<div class="n-title">粤海街道办</div>
<div class="sub-district-office-list">
<div
v-for="(item, index) in streetList"
:key="index"
class="sub-district-office-item"
:style="{ backgroundColor: item.active ? '#177CFA' : '' }"
@click="streeChange(index)"
>
{{ item.name }}
<div v-show="item.active" class="sub-district-triangle"></div>
</div>
</div>
<div class="sub-district-office-detail">
{{ streetDetail }}
</div>
</div>
<div class="hot-position">
<div class="n-title">热招职位</div>
<div class="hot-position-list">
......@@ -72,7 +92,41 @@
</div>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
const streetList = [
{
name: '街道概况',
active: true,
detail:
'南山区位于广东省深圳市中西部,地域由陆地与内伶仃岛、大铲岛、孖洲岛、大矾石岛、小矾石岛组成,地理坐标北纬22°24′~22°39′、东经113°47′~114°01′。行政区域东起车公庙与福田区毗邻,西至南头安乐村、赤尾村与宝安区相连,北靠羊台山与宝安区、龙华区接壤,南临蛇口港、大铲岛和内伶仃岛,东南隔深圳湾与香港元朗比邻,西南隔珠江口与澳门、珠海相望。地形为南北长、东西窄。辖区土地面积185.30平方千米,海岸线长43.7千米。东南距香港元朗5.5千米(直线距离,下同),'
},
{
name: '工作时间',
active: false,
detail: '996'
},
{
name: '工商信息',
active: false,
detail: '东南距香港元朗5.5千米(直线距离,下同)'
},
{
name: '联系电话',
active: false,
detail: '1008600010101'
}
]
const streetDetail = ref(streetList[0].detail)
const streeChange = (index: number) => {
streetList.map((item: any, i: number) => {
if (index === i) item.active = true
else item.active = false
})
streetDetail.value = streetList[index].detail
}
</script>
<style lang="scss" scoped>
@import './index.scss';
......
......@@ -8,38 +8,59 @@ export {}
declare module 'vue' {
export interface GlobalComponents {
ContentBlock: typeof import('./../src/components/contentBlock.vue')['default']
CustomSelect: typeof import('./../src/components/customSelect.vue')['default']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElButton: typeof import('element-plus/es')['ElButton']
ElCard: typeof import('element-plus/es')['ElCard']
ElCarousel: typeof import('element-plus/es')['ElCarousel']
ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCol: typeof import('element-plus/es')['ElCol']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
ElEmpty: typeof import('element-plus/es')['ElEmpty']
ElForm: typeof import('element-plus/es')['ElForm']
ElFormItem: typeof import('element-plus/es')['ElFormItem']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElImage: typeof import('element-plus/es')['ElImage']
ElInput: typeof import('element-plus/es')['ElInput']
ElLink: typeof import('element-plus/es')['ElLink']
ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElRate: typeof import('element-plus/es')['ElRate']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
IEpArrowRight: typeof import('~icons/ep/arrow-right')['default']
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpCheck: typeof import('~icons/ep/check')['default']
IEpDArrowRight: typeof import('~icons/ep/d-arrow-right')['default']
IEpLocation: typeof import('~icons/ep/location')['default']
IEpOfficeBuilding: typeof import('~icons/ep/office-building')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpView: typeof import('~icons/ep/view')['default']
NSelect: typeof import('./../src/components/n-select.vue')['default']
Policy: typeof import('./../src/components/policy.vue')['default']
RichTextEditor: typeof import('./../src/components/RichTextEditor.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Search: typeof import('./../src/components/search.vue')['default']
Select: typeof import('./../src/components/select.vue')['default']
VerificationCode: typeof import('./../src/components/verificationCode.vue')['default']
}
export interface ComponentCustomProperties {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论