feat(组件): 🎉 组件新增

新增一对多组件和多对多组件
This commit is contained in:
猿小天
2023-03-04 23:59:16 +08:00
parent 038c3959eb
commit 284f09f90d
4 changed files with 120 additions and 13 deletions

View File

@@ -121,12 +121,12 @@ class MessageCenterCreateSerializer(CustomModelSerializer):
users = initial_data.get('target_user', []) users = initial_data.get('target_user', [])
if target_type in [1]: # 按角色 if target_type in [1]: # 按角色
target_role = initial_data.get('target_role',[]) target_role = initial_data.get('target_role',[])
users = Users.objects.exclude(is_deleted=True).filter(role__id__in=target_role).values_list('id', flat=True) users = Users.objects.filter(role__id__in=target_role).values_list('id', flat=True)
if target_type in [2]: # 按部门 if target_type in [2]: # 按部门
target_dept = initial_data.get('target_dept',[]) target_dept = initial_data.get('target_dept',[])
users = Users.objects.exclude(is_deleted=True).filter(dept__id__in=target_dept).values_list('id', flat=True) users = Users.objects.filter(dept__id__in=target_dept).values_list('id', flat=True)
if target_type in [3]: # 系统通知 if target_type in [3]: # 系统通知
users = Users.objects.exclude(is_deleted=True).values_list('id', flat=True) users = Users.objects.values_list('id', flat=True)
targetuser_data = [] targetuser_data = []
for user in users: for user in users:
targetuser_data.append({ targetuser_data.append({

View File

@@ -0,0 +1,41 @@
<template>
<!-- 你的自定义受控组件-->
<div>
<el-tag :type="randomType">{{ data }}</el-tag>
</div>
</template>
<script lang="ts" setup>
import {watch, ref} from "vue";
const props = defineProps({
modelValue: String || Object,
displayLabel: {
type:String,
default: ""
}
})
// template上使用data
const data = ref()
watch(() => {
return props.modelValue
}, // 监听modelValue的变化
(value) => {
if (typeof value === "string") {
data.value = value
} else if (typeof value === "object") {
const {displayLabel} = props
data.value = value ? value[displayLabel] : null
} else {
data.value = null
}
}, // 当modelValue值触发后同步修改data.value的值
{immediate: true} // 立即触发一次给data赋值初始值
)
const tagType = ['success', 'info', 'warning', 'danger']
const randomType = (): string => {
return tagType[Math.floor(Math.random() * tagType.length)];
}
</script>

View File

@@ -0,0 +1,46 @@
<template>
<!-- 你的自定义受控组件-->
<div>
<el-tag class="many-to-many-tag" :type="randomType" v-for="(item,index) in data" :key="index">{{item}}</el-tag>
</div>
</template>
<script lang="ts" setup>
import {watch, ref} from "vue";
const props = defineProps({
modelValue: Array,
bindValue: Array,
displayLabel: {
type:String,
default: ""
}
})
// template上使用data
const data = ref()
watch(() => {
return props.bindValue
}, // 监听modelValue的变化
(value) => {
const {displayLabel} = props
const result = value ? value.map((item: any) => {
return item[displayLabel]
}) : null
data.value = result
}, // 当modelValue值触发后同步修改data.value的值
{immediate: true} // 立即触发一次给data赋值初始值
)
const tagType = ['success', 'info', 'warning', 'danger']
const randomType = (): string => {
return tagType[Math.floor(Math.random() * tagType.length)];
}
</script>
<style scoped>
.many-to-many-tag{
margin-right: 5px;
}
.many-to-many-tag:last-child {
margin-right: 0;
}
</style>

View File

@@ -4,6 +4,7 @@ import {request} from "/@/utils/service";
import {dictionary} from "/@/utils/dictionary"; import {dictionary} from "/@/utils/dictionary";
import tableSelector from "/@/components/tableSelector/index.vue" import tableSelector from "/@/components/tableSelector/index.vue"
import {shallowRef} from "vue"; import {shallowRef} from "vue";
import manyToMany from "/@/components/manyToMany/index.vue"
interface CreateCrudOptionsTypes { interface CreateCrudOptionsTypes {
crudOptions: CrudOptions; crudOptions: CrudOptions;
@@ -139,13 +140,15 @@ export const createCrudOptions = function ({crudExpose}: { crudExpose: CrudExpos
required: true, required: true,
message: '必填项' message: '必填项'
} }
], ]
}, },
column:{
component: { component: {
name: 'manyToMany', name: shallowRef(manyToMany),
valueBinding: 'user_info', vModel: "modelValue",
children: 'name' bindValue:compute(({row}) => {return row.user_info}),
displayLabel: 'name'
}
} }
}, },
target_role: { target_role: {
@@ -159,6 +162,12 @@ export const createCrudOptions = function ({crudExpose}: { crudExpose: CrudExpos
component: { component: {
name: shallowRef(tableSelector), name: shallowRef(tableSelector),
vModel: "modelValue", vModel: "modelValue",
displayLabel:compute(({row}) => {
if(row){
return row.role_info;
}
return null
}),
tableConfig: { tableConfig: {
url: '/api/system/role/', url: '/api/system/role/',
label: 'name', label: 'name',
@@ -184,10 +193,13 @@ export const createCrudOptions = function ({crudExpose}: { crudExpose: CrudExpos
} }
] ]
}, },
column:{
component: { component: {
name: 'manyToMany', name: shallowRef(manyToMany),
valueBinding: 'role_info', vModel: "modelValue",
children: 'name' bindValue:compute(({row}) => {return row.role_info}),
displayLabel: 'name'
}
} }
}, },
target_dept: { target_dept: {
@@ -233,6 +245,14 @@ export const createCrudOptions = function ({crudExpose}: { crudExpose: CrudExpos
message: '必填项' message: '必填项'
} }
] ]
},
column:{
component: {
name: shallowRef(manyToMany),
vModel: "modelValue",
bindValue:compute(({row}) => {return row.dept_info}),
displayLabel: 'name'
}
} }
}, },
content: { content: {