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

chore: update

上级 2502a080
...@@ -108,6 +108,7 @@ ...@@ -108,6 +108,7 @@
"useAttrs": true, "useAttrs": true,
"useBase64": true, "useBase64": true,
"useBattery": true, "useBattery": true,
"useBluetooth": true,
"useBreakpoints": true, "useBreakpoints": true,
"useBroadcastChannel": true, "useBroadcastChannel": true,
"useBrowserLocation": true, "useBrowserLocation": true,
...@@ -154,6 +155,7 @@ ...@@ -154,6 +155,7 @@
"useGamepad": true, "useGamepad": true,
"useGeolocation": true, "useGeolocation": true,
"useIdle": true, "useIdle": true,
"useImage": true,
"useInfiniteScroll": true, "useInfiniteScroll": true,
"useIntersectionObserver": true, "useIntersectionObserver": true,
"useInterval": true, "useInterval": true,
......
...@@ -109,6 +109,7 @@ declare global { ...@@ -109,6 +109,7 @@ declare global {
const useAttrs: typeof import('vue')['useAttrs'] const useAttrs: typeof import('vue')['useAttrs']
const useBase64: typeof import('@vueuse/core')['useBase64'] const useBase64: typeof import('@vueuse/core')['useBase64']
const useBattery: typeof import('@vueuse/core')['useBattery'] const useBattery: typeof import('@vueuse/core')['useBattery']
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
...@@ -155,6 +156,7 @@ declare global { ...@@ -155,6 +156,7 @@ declare global {
const useGamepad: typeof import('@vueuse/core')['useGamepad'] const useGamepad: typeof import('@vueuse/core')['useGamepad']
const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
const useIdle: typeof import('@vueuse/core')['useIdle'] const useIdle: typeof import('@vueuse/core')['useIdle']
const useImage: typeof import('@vueuse/core')['useImage']
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
const useInterval: typeof import('@vueuse/core')['useInterval'] const useInterval: typeof import('@vueuse/core')['useInterval']
......
差异被折叠。
...@@ -15,11 +15,12 @@ ...@@ -15,11 +15,12 @@
"dependencies": { "dependencies": {
"@tinymce/tinymce-vue": "^5.0.0", "@tinymce/tinymce-vue": "^5.0.0",
"@vant/area-data": "^1.3.1", "@vant/area-data": "^1.3.1",
"@vueuse/head": "^0.7.6",
"axios": "^0.27.2", "axios": "^0.27.2",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"countup.js": "^2.2.0", "countup.js": "^2.2.0",
"dayjs": "^1.11.3", "dayjs": "^1.11.3",
"element-plus": "^2.2.5", "element-plus": "^2.2.6",
"pinia": "^2.0.14", "pinia": "^2.0.14",
"qs": "^6.10.5", "qs": "^6.10.5",
"vue": "^3.2.37", "vue": "^3.2.37",
...@@ -37,9 +38,9 @@ ...@@ -37,9 +38,9 @@
"chalk": "^5.0.1", "chalk": "^5.0.1",
"eslint": "^8.17.0", "eslint": "^8.17.0",
"eslint-plugin-vue": "^9.1.1", "eslint-plugin-vue": "^9.1.1",
"sass": "^1.52.3", "sass": "^1.53.0",
"typescript": "~4.7.3", "typescript": "~4.7.3",
"unplugin-auto-import": "^0.8.8", "unplugin-auto-import": "^0.9.0",
"vite": "^2.9.12", "vite": "^2.9.12",
"vite-plugin-checker": "^0.4.6", "vite-plugin-checker": "^0.4.6",
"vue-tsc": "^0.37.9" "vue-tsc": "^0.37.9"
......
import { createApp } from 'vue' import { createApp } from 'vue'
import { createPinia } from 'pinia' import { createPinia } from 'pinia'
import { createHead } from '@vueuse/head'
import App from './App.vue' import App from './App.vue'
import router from './router' import router from './router'
...@@ -32,5 +33,6 @@ modules({ router }) ...@@ -32,5 +33,6 @@ modules({ router })
app.use(createPinia()) app.use(createPinia())
app.use(router) app.use(router)
app.use(ElementPlus, { locale: zhCn, size: 'large' }) app.use(ElementPlus, { locale: zhCn, size: 'large' })
app.use(createHead())
app.mount('#app') app.mount('#app')
...@@ -165,8 +165,8 @@ const rows: Record<string, any>[] = [ ...@@ -165,8 +165,8 @@ const rows: Record<string, any>[] = [
} }
if (user.projects.length === 0) { if (user.projects.length === 0) {
ElMessage({ message: '请联系我们完成企业注册' }) ElMessage({ message: '请联系我们完成企业注册' })
} else if (user.hasCompany) { // } else if (user.hasCompany) {
window.open('/hr/company/view') // window.open('/hr/company/view')
} else { } else {
window.open('/hr/company/create') window.open('/hr/company/create')
} }
......
...@@ -20,3 +20,8 @@ export function getAlumniDetail(params: { id: string }) { ...@@ -20,3 +20,8 @@ export function getAlumniDetail(params: { id: string }) {
export function getAlumniUserInfo() { export function getAlumniUserInfo() {
return httpRequest.get('/api/hr/api/v1/alumni-talent/login-user-info') 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"> <script setup lang="ts">
import { ElMessage, ElMessageBox } from 'element-plus'
import { useArea } from '@/composables/useArea' import { useArea } from '@/composables/useArea'
import { useClasses } from '@/composables/useClasses' import { useClasses } from '@/composables/useClasses'
import { sex, projectPrefix, industryCategory, industryCategoryList } from '@/utils/dictionary' import { sex, projectPrefix, industryCategory, industryCategoryList } from '@/utils/dictionary'
import { getAlumniList } from '../api' import { getAlumniList, checkInvite } from '../api'
import type { AlumniType } from '../types' import type { AlumniType } from '../types'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
...@@ -87,12 +88,30 @@ const listOptions = computed(() => ({ ...@@ -87,12 +88,30 @@ const listOptions = computed(() => ({
] ]
})) }))
// 搜索
function handleSearch() { function handleSearch() {
nextTick(() => { nextTick(() => {
appList.value?.search() 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(() => { onMounted(() => {
if (!user.projects.length) { if (!user.projects.length) {
router.replace('/') router.replace('/')
...@@ -102,9 +121,6 @@ onMounted(() => { ...@@ -102,9 +121,6 @@ onMounted(() => {
<template> <template>
<AppList v-bind="listOptions" ref="appList"> <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> <template #filter-province>
<el-select filterable clearable v-model="provinceValue" @change="handleSearch" style="width: 250px"> <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> <el-option v-for="item in provinceList" :value="item.label" :key="item.code"></el-option>
...@@ -122,6 +138,10 @@ onMounted(() => { ...@@ -122,6 +138,10 @@ onMounted(() => {
<el-option v-for="item in cityList" :value="item.label" :key="item.code"></el-option> <el-option v-for="item in cityList" :value="item.label" :key="item.code"></el-option>
</el-select> </el-select>
</template> </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> </AppList>
</template> </template>
......
...@@ -34,7 +34,10 @@ const rules = reactive<FormRules>({ ...@@ -34,7 +34,10 @@ const rules = reactive<FormRules>({
{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] } { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
], ],
nature: [{ required: true, message: '请选择公司性质', trigger: 'blur' }], 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' }] business_licence: [{ required: true, message: '请上传营业执照附件', trigger: 'change' }]
}) })
...@@ -45,7 +48,7 @@ function onProvinceChange() { ...@@ -45,7 +48,7 @@ function onProvinceChange() {
} }
// 审核不通过可以修改 // 审核不通过可以修改
const disabled = computed(() => { 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(() => { ...@@ -86,10 +89,12 @@ onMounted(() => {
<p class="company-register__tips">请完成企业信息认证,完成后即可发布职位</p> <p class="company-register__tips">请完成企业信息认证,完成后即可发布职位</p>
<AppCard> <AppCard>
<div class="company-register__status"> <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> <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> </div>
<el-form <el-form
ref="formRef" ref="formRef"
...@@ -133,7 +138,7 @@ onMounted(() => { ...@@ -133,7 +138,7 @@ onMounted(() => {
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="社会统一信用代码" prop="code"> <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>
<el-form-item label="营业执照附件" prop="business_licence"> <el-form-item label="营业执照附件" prop="business_licence">
<AppUpload v-model="form.business_licence" accept="image/*" :disabled="disabled"></AppUpload> <AppUpload v-model="form.business_licence" accept="image/*" :disabled="disabled"></AppUpload>
......
...@@ -39,7 +39,14 @@ onMounted(() => { ...@@ -39,7 +39,14 @@ onMounted(() => {
fetchData() fetchData()
}) })
let isUploading = $ref(false)
const uploadFileUrl = ref('') const uploadFileUrl = ref('')
function handleUploadProgress(e: any) {
isUploading = true
if (e.percent === 100) {
isUploading = false
}
}
function handleUploadSuccess(file: any) { function handleUploadSuccess(file: any) {
submitResume({ id: props.id, resume: file.raw.url }) submitResume({ id: props.id, resume: file.raw.url })
.then(() => { .then(() => {
...@@ -70,9 +77,10 @@ function handleUploadSuccess(file: any) { ...@@ -70,9 +77,10 @@ function handleUploadSuccess(file: any) {
:disabled="isUploaded" :disabled="isUploaded"
v-model="uploadFileUrl" v-model="uploadFileUrl"
accept="application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document" accept="application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
:on-progress="handleUploadProgress"
@success="handleUploadSuccess" @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 }} {{ uploadButtonText }}
</el-button> </el-button>
</AppUpload> </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({ ...@@ -28,7 +28,8 @@ export const useUserStore = defineStore({
this.user = res.data this.user = res.data
if (this.isLogin) { if (this.isLogin) {
const { data: alumniUser } = await getAlumniUserInfo() 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 this.projects = alumniUser.projects
} }
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论