提交 79724b62 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 2502a080
......@@ -108,6 +108,7 @@
"useAttrs": true,
"useBase64": true,
"useBattery": true,
"useBluetooth": true,
"useBreakpoints": true,
"useBroadcastChannel": true,
"useBrowserLocation": true,
......@@ -154,6 +155,7 @@
"useGamepad": true,
"useGeolocation": true,
"useIdle": true,
"useImage": true,
"useInfiniteScroll": true,
"useIntersectionObserver": true,
"useInterval": true,
......
......@@ -109,6 +109,7 @@ declare global {
const useAttrs: typeof import('vue')['useAttrs']
const useBase64: typeof import('@vueuse/core')['useBase64']
const useBattery: typeof import('@vueuse/core')['useBattery']
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
......@@ -155,6 +156,7 @@ declare global {
const useGamepad: typeof import('@vueuse/core')['useGamepad']
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
const useIdle: typeof import('@vueuse/core')['useIdle']
const useImage: typeof import('@vueuse/core')['useImage']
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
const useInterval: typeof import('@vueuse/core')['useInterval']
......
差异被折叠。
......@@ -15,11 +15,12 @@
"dependencies": {
"@tinymce/tinymce-vue": "^5.0.0",
"@vant/area-data": "^1.3.1",
"@vueuse/head": "^0.7.6",
"axios": "^0.27.2",
"blueimp-md5": "^2.19.0",
"countup.js": "^2.2.0",
"dayjs": "^1.11.3",
"element-plus": "^2.2.5",
"element-plus": "^2.2.6",
"pinia": "^2.0.14",
"qs": "^6.10.5",
"vue": "^3.2.37",
......@@ -37,9 +38,9 @@
"chalk": "^5.0.1",
"eslint": "^8.17.0",
"eslint-plugin-vue": "^9.1.1",
"sass": "^1.52.3",
"sass": "^1.53.0",
"typescript": "~4.7.3",
"unplugin-auto-import": "^0.8.8",
"unplugin-auto-import": "^0.9.0",
"vite": "^2.9.12",
"vite-plugin-checker": "^0.4.6",
"vue-tsc": "^0.37.9"
......
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import { createHead } from '@vueuse/head'
import App from './App.vue'
import router from './router'
......@@ -32,5 +33,6 @@ modules({ router })
app.use(createPinia())
app.use(router)
app.use(ElementPlus, { locale: zhCn, size: 'large' })
app.use(createHead())
app.mount('#app')
......@@ -165,8 +165,8 @@ const rows: Record<string, any>[] = [
}
if (user.projects.length === 0) {
ElMessage({ message: '请联系我们完成企业注册' })
} else if (user.hasCompany) {
window.open('/hr/company/view')
// } else if (user.hasCompany) {
// window.open('/hr/company/view')
} else {
window.open('/hr/company/create')
}
......
......@@ -20,3 +20,8 @@ export function getAlumniDetail(params: { id: string }) {
export function getAlumniUserInfo() {
return httpRequest.get('/api/hr/api/v1/alumni-talent/login-user-info')
}
// 验证是否能沟通校友
export function checkInvite(data: { id: string }) {
return httpRequest.post(`/api/hr/api/v1/alumni-talent/${data.id}/check-invite`, data)
}
<script setup lang="ts">
import { ElMessage, ElMessageBox } from 'element-plus'
import { useArea } from '@/composables/useArea'
import { useClasses } from '@/composables/useClasses'
import { sex, projectPrefix, industryCategory, industryCategoryList } from '@/utils/dictionary'
import { getAlumniList } from '../api'
import { getAlumniList, checkInvite } from '../api'
import type { AlumniType } from '../types'
import { useUserStore } from '@/stores/user'
......@@ -87,12 +88,30 @@ const listOptions = computed(() => ({
]
}))
// 搜索
function handleSearch() {
nextTick(() => {
appList.value?.search()
})
}
// 沟通
function handleConcat(row: AlumniType) {
const url = `https://e-saas.ezijing.com/whisper?from_id=${user.user?.id}&to_id=${row.id}`
ElMessageBox.confirm(
`【紫荆教育】尊敬的用户,您好,紫荆教育校友诚邀您参与项目合作机会,请点击如下链接<a href="${url}" target="_blank">${url}</a>,期待您的回复。`,
{ confirmButtonText: '确认发送', dangerouslyUseHTMLString: true }
).then(() => {
checkInvite({ id: row.id })
.then(() => {
ElMessage.success('发送成功')
})
.catch(res => {
ElMessage.error(res.message)
})
})
}
onMounted(() => {
if (!user.projects.length) {
router.replace('/')
......@@ -102,9 +121,6 @@ onMounted(() => {
<template>
<AppList v-bind="listOptions" ref="appList">
<template #table-actions="{ row }">
<router-link :to="`/hr/alumni/view/${row.id}`" target="_blank" style="color: #399ee8">查看</router-link>
</template>
<template #filter-province>
<el-select filterable clearable v-model="provinceValue" @change="handleSearch" style="width: 250px">
<el-option v-for="item in provinceList" :value="item.label" :key="item.code"></el-option>
......@@ -122,6 +138,10 @@ onMounted(() => {
<el-option v-for="item in cityList" :value="item.label" :key="item.code"></el-option>
</el-select>
</template>
<template #table-actions="{ row }">
<router-link :to="`/hr/alumni/view/${row.id}`" target="_blank" style="color: #399ee8">查看</router-link>
<a href="javascript:;" style="color: #399ee8; margin-left: 10px" @click="handleConcat(row)">沟通</a>
</template>
</AppList>
</template>
......
......@@ -34,7 +34,10 @@ const rules = reactive<FormRules>({
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
],
nature: [{ required: true, message: '请选择公司性质', trigger: 'blur' }],
code: [{ required: true, message: '请输入社会统一信用代码', trigger: 'blur' }],
code: [
{ required: true, message: '请输入社会统一信用代码', trigger: 'blur' },
{ pattern: /[\w]{18}/, message: '请输入正确社会统一信用代码', trigger: 'blur' }
],
business_licence: [{ required: true, message: '请上传营业执照附件', trigger: 'change' }]
})
......@@ -45,7 +48,7 @@ function onProvinceChange() {
}
// 审核不通过可以修改
const disabled = computed(() => {
return form.audit_status === 1 || form.audit_status === 3
return form.status === 2 || form.audit_status === 1 || form.audit_status === 3
})
// 提交
......@@ -86,10 +89,12 @@ onMounted(() => {
<p class="company-register__tips">请完成企业信息认证,完成后即可发布职位</p>
<AppCard>
<div class="company-register__status">
<p style="color: #1dc388" v-if="form.audit_status === 1">审核通过</p>
<p style="color: #898989" v-if="form.audit_status === 2">审核不通过</p>
<p style="color: #60b0ea" v-if="form.audit_status === 3">待审核</p>
<p style="color: #f8524b" v-if="form.status === 2">已禁用</p>
<template v-else>
<p style="color: #1dc388" v-if="form.audit_status === 1">审核通过</p>
<p style="color: #898989" v-if="form.audit_status === 2">审核不通过</p>
<p style="color: #60b0ea" v-if="form.audit_status === 3">待审核</p>
</template>
</div>
<el-form
ref="formRef"
......@@ -133,7 +138,7 @@ onMounted(() => {
</el-select>
</el-form-item>
<el-form-item label="社会统一信用代码" prop="code">
<el-input v-model="form.code" placeholder="请输入" />
<el-input v-model="form.code" placeholder="请输入" maxlength="18" />
</el-form-item>
<el-form-item label="营业执照附件" prop="business_licence">
<AppUpload v-model="form.business_licence" accept="image/*" :disabled="disabled"></AppUpload>
......
......@@ -39,7 +39,14 @@ onMounted(() => {
fetchData()
})
let isUploading = $ref(false)
const uploadFileUrl = ref('')
function handleUploadProgress(e: any) {
isUploading = true
if (e.percent === 100) {
isUploading = false
}
}
function handleUploadSuccess(file: any) {
submitResume({ id: props.id, resume: file.raw.url })
.then(() => {
......@@ -70,9 +77,10 @@ function handleUploadSuccess(file: any) {
:disabled="isUploaded"
v-model="uploadFileUrl"
accept="application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
:on-progress="handleUploadProgress"
@success="handleUploadSuccess"
>
<el-button type="primary" :disabled="isUploaded" style="border-radius: 10px">
<el-button type="primary" :disabled="isUploaded" :loading="isUploading" style="border-radius: 10px">
{{ uploadButtonText }}
</el-button>
</AppUpload>
......
import httpRequest from '@/utils/axios'
// 获取校友的受邀信息
export function getInviteInfo(params: { id: string }) {
return httpRequest.get(`/api/hr/api/v1/message/alumni-invited-info/${params.id}`, { params })
}
import type { RouteRecordRaw } from 'vue-router'
export const routes: Array<RouteRecordRaw> = [
{
path: '/whisper',
component: () => import('./views/Index.vue')
}
]
<script setup lang="ts">
import { useHead } from '@vueuse/head'
import { getInviteInfo } from '../api'
import { projectPrefix } from '@/utils/dictionary'
let windowWidth = $ref(0)
let htmlFontsize = $ref(0)
function resizeRoot() {
windowWidth =
screen.width > 0
? window.innerWidth >= screen.width || window.innerWidth == 0
? screen.width
: window.innerWidth
: window.innerWidth
htmlFontsize = ((windowWidth > 750 ? 750 : windowWidth) / 375) * 50
}
useHead({
meta: [
{
name: `viewport`,
content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover'
}
],
htmlAttrs: computed(() => [{ style: `font-size: ${htmlFontsize}px;` }])
})
const route = useRoute()
const data = reactive({
project_prefix: '',
username: '',
class_name: ''
})
const projectName = computed(() => {
return projectPrefix[data.project_prefix] || data.project_prefix
})
function fetchData() {
getInviteInfo({ id: route.query.to_id as string }).then(res => {
Object.assign(data, res.data.detail)
})
}
onMounted(() => {
fetchData()
resizeRoot()
window.addEventListener('resize', resizeRoot, false)
})
onUnmounted(() => {
window.removeEventListener('resize', resizeRoot, false)
})
</script>
<template>
<div class="invite">
<div class="invite-main">
<p class="t1">
您好:<br />
我是您的紫荆校友,<b>{{ projectName }}</b
>项目<b>{{ data.class_name }}</b
>学员,<b>{{ data.username }}</b>
</p>
<p class="t2">现诚邀您参与我的项目</p>
<p class="t4">参与项目</p>
<p class="t3">*点击后将发送您的联系方式给紫荆校友</p>
</div>
</div>
</template>
<style lang="scss" scoped>
.invite {
position: relative;
max-width: 750px;
margin: 0 auto;
height: 100vh;
background: url('@/assets/images/yao_bg.png') no-repeat center top;
background-size: 100% auto;
}
.invite-main {
width: 4.9rem;
margin: 0 auto;
padding-top: 4.2rem;
.t1 {
height: 3.6rem;
font-size: 0.35rem;
color: #fff;
margin: 0 0.3rem;
b {
font-weight: bold;
}
}
.t2 {
font-size: 0.46rem;
color: #ece4c8;
text-align: center;
}
.t3 {
font-size: 0.24rem;
color: #fff;
text-align: center;
}
.t4 {
width: 3.7rem;
height: 0.85rem;
margin: 1.3rem auto 0.16rem;
font-size: 0.3rem;
color: #b28c43;
line-height: 0.85rem;
text-align: center;
background-color: #fff;
border-radius: 0.2rem;
cursor: pointer;
}
}
</style>
......@@ -28,7 +28,8 @@ export const useUserStore = defineStore({
this.user = res.data
if (this.isLogin) {
const { data: alumniUser } = await getAlumniUserInfo()
this.hasCompany = alumniUser.is_registered_company && alumniUser.company_audit_status === 1
this.hasCompany =
alumniUser.is_registered_company && alumniUser.company_audit_status === 1 && alumniUser.company_status === 1
this.projects = alumniUser.projects
}
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论