提交 76c9c231 authored 作者: 王鹏飞's avatar 王鹏飞

Merge branch 'pro' into gdrtvu

...@@ -29,3 +29,8 @@ export function getMemberAttrs(params: { sso_id: string; member_meta_id: string ...@@ -29,3 +29,8 @@ export function getMemberAttrs(params: { sso_id: string; member_meta_id: string
export function getMemberMetaAttrs() { export function getMemberMetaAttrs() {
return httpRequest.get('/api/lab/v1/experiment/analyse/member-meta-attrs') return httpRequest.get('/api/lab/v1/experiment/analyse/member-meta-attrs')
} }
// 获取指定用户的标签
export function getUserTags(params: { sso_id: string; limit: number }) {
return httpRequest.get('/api/lab/v1/experiment/analyse/user-tags', { params })
}
<script setup>
import { getUserTags } from '../api'
const props = defineProps({ ssoId: String })
const list = ref([])
async function fetchList() {
if (!props.ssoId) return
const res = await getUserTags({ sso_id: props.ssoId, limit: 20 })
list.value = res.data.items.map(item => {
return { ...item, weight: parseFloat(item.weight) / 5 + 1 || 0 }
})
}
watch(
() => props.ssoId,
() => {
fetchList()
},
{ immediate: true }
)
</script>
<template>
<div class="user-label">
<ul>
<li v-for="item in list" :key="item.id" :style="{ scale: item.weight }">
<div class="user-label__inner">
{{ item.name }}
<span class="user-label__arrow"></span>
</div>
</li>
</ul>
</div>
</template>
<style lang="scss" scoped>
.user-label {
position: relative;
margin: 40px;
text-align: center;
background: url(@/assets/images/figure.png) no-repeat center center;
background-size: contain;
height: 600px;
display: flex;
justify-content: center;
align-items: center;
ul {
display: grid;
grid-template-columns: repeat(2, 1fr);
column-gap: 240px;
row-gap: 20px;
}
.user-label__inner {
position: relative;
display: inline-block;
padding: 4px 10px;
font-size: 14px;
text-align: left;
font-family: Roboto;
line-height: 24px;
color: rgba(16, 16, 16, 1);
background-color: rgba(231, 232, 232, 1);
border: 1px solid rgba(187, 187, 187, 1);
border-radius: 5px;
}
.user-label__arrow {
position: absolute;
height: 10px;
width: 10px;
&::before {
background: rgba(231, 232, 232, 1);
border: 1px solid rgba(187, 187, 187, 1);
box-sizing: border-box;
content: ' ';
height: 10px;
position: absolute;
transform: rotate(45deg);
width: 10px;
}
}
li:nth-child(odd) {
text-align: right;
.user-label__arrow {
right: -5px;
top: 0px;
transform: translate(0px, 10px);
&::before {
border-top-right-radius: 2px;
border-bottom-color: transparent !important;
border-left-color: transparent !important;
}
}
}
li:nth-child(even) {
text-align: left;
.user-label__arrow {
left: -5px;
top: 0px;
transform: translate(0px, 10px);
&::before {
border-bottom-left-radius: 2px;
border-right-color: transparent !important;
border-top-color: transparent !important;
}
}
}
}
</style>
<script setup> <script setup>
import ChartCard from '@/components/ChartCard.vue' import ChartCard from '@/components/ChartCard.vue'
import UserChart from '../components/UserChart.vue' import UserChart from '../components/UserChart.vue'
import UserLabel from '../components/UserLabel.vue'
import { DataLine } from '@element-plus/icons-vue' import { DataLine } from '@element-plus/icons-vue'
import { useUser } from '@/composables/useAllData' import { useUser } from '@/composables/useAllData'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
...@@ -177,6 +178,7 @@ const statusOption = computed(() => { ...@@ -177,6 +178,7 @@ const statusOption = computed(() => {
<b class="total">{{ userTotal }}</b> <b class="total">{{ userTotal }}</b>
</el-form-item> </el-form-item>
</el-form> </el-form>
<UserLabel :ssoId="userValue"></UserLabel>
<div class="row"> <div class="row">
<ChartCard title="用户性别分布" :options="genderOption" :loading="loading1"></ChartCard> <ChartCard title="用户性别分布" :options="genderOption" :loading="loading1"></ChartCard>
<ChartCard title="用户数据来源分布" :options="connectionOption" :loading="loading2"></ChartCard> <ChartCard title="用户数据来源分布" :options="connectionOption" :loading="loading2"></ChartCard>
......
...@@ -29,7 +29,8 @@ const form = reactive({ ...@@ -29,7 +29,8 @@ const form = reactive({
update_status: '2', update_status: '2',
update_rule: { type: 1, info: 1 }, update_rule: { type: 1, info: 1 },
status: '1', status: '1',
label: '' label: '',
weight: 0
}) })
watchEffect(() => { watchEffect(() => {
if (props.data) { if (props.data) {
...@@ -39,7 +40,7 @@ watchEffect(() => { ...@@ -39,7 +40,7 @@ watchEffect(() => {
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
Object.assign(form, props.data, { update_rule: updateRule }) Object.assign(form, props.data, { update_rule: updateRule, weight: parseFloat(props.data.weight) })
} }
}) })
...@@ -56,7 +57,15 @@ function handleSubmit() { ...@@ -56,7 +57,15 @@ function handleSubmit() {
} }
// 新建 // 新建
function handleCreate() { function handleCreate() {
const params = pick({ ...form, update_rule: JSON.stringify(form.update_rule) }, ['name', 'type_id', 'update_status', 'update_rule', 'status', 'label']) const params = pick({ ...form, update_rule: JSON.stringify(form.update_rule) }, [
'name',
'type_id',
'update_status',
'update_rule',
'status',
'label',
'weight'
])
createLabel(params).then(() => { createLabel(params).then(() => {
ElMessage({ message: '创建成功', type: 'success' }) ElMessage({ message: '创建成功', type: 'success' })
emit('update') emit('update')
...@@ -65,7 +74,16 @@ function handleCreate() { ...@@ -65,7 +74,16 @@ function handleCreate() {
} }
// 修改 // 修改
function handleUpdate() { function handleUpdate() {
const params = pick({ ...form, update_rule: JSON.stringify(form.update_rule) }, ['id', 'name', 'type_id', 'update_status', 'update_rule', 'status', 'label']) const params = pick({ ...form, update_rule: JSON.stringify(form.update_rule) }, [
'id',
'name',
'type_id',
'update_status',
'update_rule',
'status',
'label',
'weight'
])
updateLabel(params).then(() => { updateLabel(params).then(() => {
ElMessage({ message: '修改成功', type: 'success' }) ElMessage({ message: '修改成功', type: 'success' })
emit('update') emit('update')
...@@ -90,6 +108,9 @@ function handleUpdate() { ...@@ -90,6 +108,9 @@ function handleUpdate() {
<el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"></el-option> <el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="标签权重" prop="weight">
<el-slider v-model="form.weight" :max="1" :step="0.1" />
</el-form-item>
<el-form-item label="更新频率" prop="update_status"> <el-form-item label="更新频率" prop="update_status">
<el-radio-group v-model="form.update_status"> <el-radio-group v-model="form.update_status">
<el-radio v-for="item in updateStatusRuleList" :key="item.value" :value="item.value" :disabled="item.value === '1'"> <el-radio v-for="item in updateStatusRuleList" :key="item.value" :value="item.value" :disabled="item.value === '1'">
......
...@@ -27,6 +27,7 @@ export interface Label { ...@@ -27,6 +27,7 @@ export interface Label {
updated_time: string updated_time: string
updated_operator: Operator updated_operator: Operator
label: string label: string
weight: string
} }
// 标签更新规则 // 标签更新规则
export interface LabelUpdateRule { export interface LabelUpdateRule {
......
...@@ -66,6 +66,7 @@ const listOptions = computed(() => { ...@@ -66,6 +66,7 @@ const listOptions = computed(() => {
} }
}, },
{ label: '标签目录', prop: 'tag_type.name' }, { label: '标签目录', prop: 'tag_type.name' },
{ label: '标签权重', prop: 'weight' },
{ {
label: '更新频率', label: '更新频率',
prop: 'update_status', prop: 'update_status',
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论