|
@@ -0,0 +1,130 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <span>个人画像:</span>
|
|
|
+ <v-chip size="small" label v-for="(k, i) in list" :key="i" class="mr-2 mb-2" color="primary" closable @click:close="handleDelete(k)">{{ k }}</v-chip>
|
|
|
+ <v-btn icon="mdi-plus" variant="outlined" color="primary" size="small" @click="handleAdd"></v-btn>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <CtDialog
|
|
|
+ :visible="visible"
|
|
|
+ titleClass="text-h6"
|
|
|
+ title="个人画像标签选择"
|
|
|
+ :footer="true"
|
|
|
+ @close="handleCancel"
|
|
|
+ @submit="handleSubmit"
|
|
|
+ >
|
|
|
+ <div>已选中标签:</div>
|
|
|
+ <div v-if="select.length">
|
|
|
+ <v-chip v-for="(item, index) in select" :key="index" class="chip mr-2 mt-4" label color="#ea8d03">
|
|
|
+ {{ item }}
|
|
|
+ <v-icon size="18" color="#ea8d03" style="margin-left: 6px;" @click="handleCancelSelect(item)">mdi-close-circle</v-icon>
|
|
|
+ </v-chip>
|
|
|
+ </div>
|
|
|
+ <v-divider class="my-5"></v-divider>
|
|
|
+ <div v-for="val in tagList" :key="val.id" class="mb-8">
|
|
|
+ <span style="font-size: 16px;">{{ val?.nameCn || '--' }}</span>
|
|
|
+ <div v-if="val?.children?.length">
|
|
|
+ <v-chip
|
|
|
+ v-for="k in val.children"
|
|
|
+ :key="k.id"
|
|
|
+ class="mx-2 mt-4 cursor-pointer"
|
|
|
+ :text="k.nameCn"
|
|
|
+ variant="outlined"
|
|
|
+ color="primary"
|
|
|
+ :value="k.id"
|
|
|
+ label
|
|
|
+ :disabled="select.includes(k.nameCn)"
|
|
|
+ @click="handleSelect(k.nameCn)"
|
|
|
+ >
|
|
|
+ <v-icon icon="mdi-plus" start></v-icon>
|
|
|
+ {{ k?.nameCn || '--' }}
|
|
|
+ </v-chip>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </CtDialog>
|
|
|
+
|
|
|
+ <Loading :visible="loading"></Loading>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+// 逻辑思维能力
|
|
|
+defineOptions({ name: 'person-portrait'})
|
|
|
+import { ref } from 'vue'
|
|
|
+import { getTagTreeDataApi } from '@/api/enterprise'
|
|
|
+import { useUserStore } from '@/store/user'
|
|
|
+import { savePersonPortrait } from '@/api/recruit/personal/resume'
|
|
|
+import Snackbar from '@/plugins/snackbar'
|
|
|
+import cloneDeep from 'lodash/cloneDeep'
|
|
|
+
|
|
|
+const loading = ref(false)
|
|
|
+const visible = ref(false)
|
|
|
+const user = useUserStore()
|
|
|
+const baseInfo = ref(JSON.parse(localStorage.getItem('baseInfo')) || {})
|
|
|
+const list = ref(baseInfo.value?.tagList || [])
|
|
|
+const select = ref([])
|
|
|
+const tagList = ref([])
|
|
|
+
|
|
|
+user.$subscribe((mutation, state) => {
|
|
|
+ if (Object.keys(state.baseInfo).length) {
|
|
|
+ baseInfo.value = state.baseInfo
|
|
|
+ list.value = baseInfo.value?.tagList || []
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 获取标签字典数据
|
|
|
+const getTagList = async () => {
|
|
|
+ const data = await getTagTreeDataApi({ type: 0 })
|
|
|
+ tagList.value = data || []
|
|
|
+}
|
|
|
+getTagList()
|
|
|
+
|
|
|
+const handleAdd = () => {
|
|
|
+ visible.value = true
|
|
|
+ select.value = cloneDeep(list.value)
|
|
|
+}
|
|
|
+
|
|
|
+// 选择
|
|
|
+const handleSelect = (nameCn) => {
|
|
|
+ const result = select.value.includes(nameCn)
|
|
|
+ if (!result) return select.value.push(nameCn)
|
|
|
+ else select.value = select.value.filter(e => e !== nameCn)
|
|
|
+}
|
|
|
+
|
|
|
+const handleCancelSelect = (nameCn) => {
|
|
|
+ select.value = select.value.filter(e => e !== nameCn)
|
|
|
+}
|
|
|
+
|
|
|
+// 删除标签
|
|
|
+const handleDelete = async (k) => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ list.value = list.value.filter(e => e !== k)
|
|
|
+ await savePersonPortrait({ tagList: list.value })
|
|
|
+ await user.getUserBaseInfos()
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ Snackbar.success('删除成功')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 取消
|
|
|
+const handleCancel = () => {
|
|
|
+ visible.value = false
|
|
|
+}
|
|
|
+// 提交
|
|
|
+const handleSubmit = async () => {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ await savePersonPortrait({ tagList: select.value })
|
|
|
+ Snackbar.success('保存成功')
|
|
|
+ await user.getUserBaseInfos()
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ visible.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+
|
|
|
+</style>
|