新功能: 新增大数据选择组件
This commit is contained in:
@@ -404,10 +404,11 @@ PLUGINS_URL_PATTERNS = []
|
|||||||
# ********** 一键导入插件配置开始 **********
|
# ********** 一键导入插件配置开始 **********
|
||||||
# 例如:
|
# 例如:
|
||||||
# from dvadmin_upgrade_center.settings import * # 升级中心
|
# from dvadmin_upgrade_center.settings import * # 升级中心
|
||||||
from dvadmin_celery.settings import * # celery 异步任务
|
#from dvadmin_celery.settings import * # celery 异步任务
|
||||||
# from dvadmin_third.settings import * # 第三方用户管理
|
# from dvadmin_third.settings import * # 第三方用户管理
|
||||||
# from dvadmin_ak_sk.settings import * # 秘钥管理管理
|
# from dvadmin_ak_sk.settings import * # 秘钥管理管理
|
||||||
# from dvadmin_tenants.settings import * # 租户管理
|
# from dvadmin_tenants.settings import * # 租户管理
|
||||||
#from dvadmin_social_auth.settings import *
|
#from dvadmin_social_auth.settings import *
|
||||||
|
#from dvadmin_uniapp.settings import *
|
||||||
# ...
|
# ...
|
||||||
# ********** 一键导入插件配置结束 **********
|
# ********** 一键导入插件配置结束 **********
|
||||||
|
|||||||
@@ -47,12 +47,12 @@ class RoleCreateUpdateSerializer(CustomModelSerializer):
|
|||||||
def validate(self, attrs: dict):
|
def validate(self, attrs: dict):
|
||||||
return super().validate(attrs)
|
return super().validate(attrs)
|
||||||
|
|
||||||
def save(self, **kwargs):
|
# def save(self, **kwargs):
|
||||||
is_superuser = self.request.user.is_superuser
|
# is_superuser = self.request.user.is_superuser
|
||||||
if not is_superuser:
|
# if not is_superuser:
|
||||||
self.validated_data.pop('admin')
|
# self.validated_data.pop('admin')
|
||||||
data = super().save(**kwargs)
|
# data = super().save(**kwargs)
|
||||||
return data
|
# return data
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Role
|
model = Role
|
||||||
|
|||||||
@@ -12,14 +12,16 @@ from collections import OrderedDict
|
|||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
from django.db import models
|
||||||
from django.db.models import Q, F
|
from django.db.models import Q, F
|
||||||
from django.db.models.constants import LOOKUP_SEP
|
from django.db.models.constants import LOOKUP_SEP
|
||||||
from django_filters import utils, FilterSet
|
from django_filters import utils, FilterSet
|
||||||
|
from django_filters.constants import ALL_FIELDS
|
||||||
from django_filters.filters import CharFilter, DateTimeFromToRangeFilter
|
from django_filters.filters import CharFilter, DateTimeFromToRangeFilter
|
||||||
from django_filters.rest_framework import DjangoFilterBackend
|
from django_filters.rest_framework import DjangoFilterBackend
|
||||||
from django_filters.utils import get_model_field
|
from django_filters.utils import get_model_field
|
||||||
from rest_framework.filters import BaseFilterBackend
|
from rest_framework.filters import BaseFilterBackend
|
||||||
|
from django_filters.conf import settings
|
||||||
from dvadmin.system.models import Dept, ApiWhiteList, RoleMenuButtonPermission
|
from dvadmin.system.models import Dept, ApiWhiteList, RoleMenuButtonPermission
|
||||||
from dvadmin.utils.models import CoreModel
|
from dvadmin.utils.models import CoreModel
|
||||||
|
|
||||||
@@ -203,6 +205,7 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
"$": "iregex",
|
"$": "iregex",
|
||||||
"~": "icontains",
|
"~": "icontains",
|
||||||
}
|
}
|
||||||
|
filter_fields = "__all__"
|
||||||
|
|
||||||
def construct_search(self, field_name, lookup_expr=None):
|
def construct_search(self, field_name, lookup_expr=None):
|
||||||
lookup = self.lookup_prefixes.get(field_name[0])
|
lookup = self.lookup_prefixes.get(field_name[0])
|
||||||
@@ -210,14 +213,16 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
field_name = field_name[1:]
|
field_name = field_name[1:]
|
||||||
else:
|
else:
|
||||||
lookup = lookup_expr
|
lookup = lookup_expr
|
||||||
if field_name.endswith(lookup):
|
if lookup:
|
||||||
return field_name
|
if field_name.endswith(lookup):
|
||||||
return LOOKUP_SEP.join([field_name, lookup])
|
return field_name
|
||||||
|
return LOOKUP_SEP.join([field_name, lookup])
|
||||||
|
return field_name
|
||||||
|
|
||||||
def find_filter_lookups(self, orm_lookups, search_term_key):
|
def find_filter_lookups(self, orm_lookups, search_term_key):
|
||||||
for lookup in orm_lookups:
|
for lookup in orm_lookups:
|
||||||
# if lookup.find(search_term_key) >= 0:
|
# if lookup.find(search_term_key) >= 0:
|
||||||
new_lookup = lookup.split("__")[0]
|
new_lookup = LOOKUP_SEP.join(lookup.split(LOOKUP_SEP)[:-1]) if len(lookup.split(LOOKUP_SEP)) > 1 else lookup
|
||||||
# 修复条件搜索错误 bug
|
# 修复条件搜索错误 bug
|
||||||
if new_lookup == search_term_key:
|
if new_lookup == search_term_key:
|
||||||
return lookup
|
return lookup
|
||||||
@@ -233,18 +238,22 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
# TODO: remove assertion in 2.1
|
# TODO: remove assertion in 2.1
|
||||||
if filterset_class is None and hasattr(view, "filter_class"):
|
if filterset_class is None and hasattr(view, "filter_class"):
|
||||||
utils.deprecate(
|
utils.deprecate(
|
||||||
"`%s.filter_class` attribute should be renamed `filterset_class`."
|
"`%s.filter_class` attribute should be renamed `filterset_class`." % view.__class__.__name__
|
||||||
% view.__class__.__name__
|
|
||||||
)
|
)
|
||||||
filterset_class = getattr(view, "filter_class", None)
|
filterset_class = getattr(view, "filter_class", None)
|
||||||
|
|
||||||
# TODO: remove assertion in 2.1
|
# TODO: remove assertion in 2.1
|
||||||
if filterset_fields is None and hasattr(view, "filter_fields"):
|
if filterset_fields is None and hasattr(view, "filter_fields"):
|
||||||
utils.deprecate(
|
utils.deprecate(
|
||||||
"`%s.filter_fields` attribute should be renamed `filterset_fields`."
|
"`%s.filter_fields` attribute should be renamed `filterset_fields`." % view.__class__.__name__
|
||||||
% view.__class__.__name__
|
|
||||||
)
|
)
|
||||||
filterset_fields = getattr(view, "filter_fields", None)
|
self.filter_fields = getattr(view, "filter_fields", None)
|
||||||
|
if isinstance(self.filter_fields, (list, tuple)):
|
||||||
|
filterset_fields = [
|
||||||
|
field[1:] if field[0] in self.lookup_prefixes.keys() else field for field in self.filter_fields
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
filterset_fields = self.filter_fields
|
||||||
|
|
||||||
if filterset_class:
|
if filterset_class:
|
||||||
filterset_model = filterset_class._meta.model
|
filterset_model = filterset_class._meta.model
|
||||||
@@ -264,6 +273,51 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
MetaBase = getattr(self.filterset_base, "Meta", object)
|
MetaBase = getattr(self.filterset_base, "Meta", object)
|
||||||
|
|
||||||
class AutoFilterSet(self.filterset_base):
|
class AutoFilterSet(self.filterset_base):
|
||||||
|
@classmethod
|
||||||
|
def get_all_model_fields(cls, model):
|
||||||
|
opts = model._meta
|
||||||
|
|
||||||
|
return [
|
||||||
|
f.name
|
||||||
|
for f in sorted(opts.fields + opts.many_to_many)
|
||||||
|
if (f.name == "id")
|
||||||
|
or not isinstance(f, models.AutoField)
|
||||||
|
and not (getattr(f.remote_field, "parent_link", False))
|
||||||
|
]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_fields(cls):
|
||||||
|
"""
|
||||||
|
Resolve the 'fields' argument that should be used for generating filters on the
|
||||||
|
filterset. This is 'Meta.fields' sans the fields in 'Meta.exclude'.
|
||||||
|
"""
|
||||||
|
model = cls._meta.model
|
||||||
|
fields = cls._meta.fields
|
||||||
|
exclude = cls._meta.exclude
|
||||||
|
|
||||||
|
assert not (fields is None and exclude is None), (
|
||||||
|
"Setting 'Meta.model' without either 'Meta.fields' or 'Meta.exclude' "
|
||||||
|
"has been deprecated since 0.15.0 and is now disallowed. Add an explicit "
|
||||||
|
"'Meta.fields' or 'Meta.exclude' to the %s class." % cls.__name__
|
||||||
|
)
|
||||||
|
|
||||||
|
# Setting exclude with no fields implies all other fields.
|
||||||
|
if exclude is not None and fields is None:
|
||||||
|
fields = ALL_FIELDS
|
||||||
|
|
||||||
|
# Resolve ALL_FIELDS into all fields for the filterset's model.
|
||||||
|
if fields == ALL_FIELDS:
|
||||||
|
fields = cls.get_all_model_fields(model)
|
||||||
|
|
||||||
|
# Remove excluded fields
|
||||||
|
exclude = exclude or []
|
||||||
|
if not isinstance(fields, dict):
|
||||||
|
fields = [(f, [settings.DEFAULT_LOOKUP_EXPR]) for f in fields if f not in exclude]
|
||||||
|
else:
|
||||||
|
fields = [(f, lookups) for f, lookups in fields.items() if f not in exclude]
|
||||||
|
|
||||||
|
return OrderedDict(fields)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_filters(cls):
|
def get_filters(cls):
|
||||||
"""
|
"""
|
||||||
@@ -292,9 +346,12 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
if field is None:
|
if field is None:
|
||||||
undefined.append(field_name)
|
undefined.append(field_name)
|
||||||
# 更新默认字符串搜索为模糊搜索
|
# 更新默认字符串搜索为模糊搜索
|
||||||
if isinstance(field, (models.CharField)) and filterset_fields == '__all__' and lookups == [
|
if (
|
||||||
'exact']:
|
isinstance(field, (models.CharField))
|
||||||
lookups = ['icontains']
|
and filterset_fields == "__all__"
|
||||||
|
and lookups == ["exact"]
|
||||||
|
):
|
||||||
|
lookups = ["icontains"]
|
||||||
for lookup_expr in lookups:
|
for lookup_expr in lookups:
|
||||||
filter_name = cls.get_filter_name(field_name, lookup_expr)
|
filter_name = cls.get_filter_name(field_name, lookup_expr)
|
||||||
|
|
||||||
@@ -304,20 +361,15 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if field is not None:
|
if field is not None:
|
||||||
filters[filter_name] = cls.filter_for_field(
|
filters[filter_name] = cls.filter_for_field(field, field_name, lookup_expr)
|
||||||
field, field_name, lookup_expr
|
|
||||||
)
|
|
||||||
|
|
||||||
# Allow Meta.fields to contain declared filters *only* when a list/tuple
|
# Allow Meta.fields to contain declared filters *only* when a list/tuple
|
||||||
if isinstance(cls._meta.fields, (list, tuple)):
|
if isinstance(cls._meta.fields, (list, tuple)):
|
||||||
undefined = [
|
undefined = [f for f in undefined if f not in cls.declared_filters]
|
||||||
f for f in undefined if f not in cls.declared_filters
|
|
||||||
]
|
|
||||||
|
|
||||||
if undefined:
|
if undefined:
|
||||||
raise TypeError(
|
raise TypeError(
|
||||||
"'Meta.fields' must not contain non-model field names: %s"
|
"'Meta.fields' must not contain non-model field names: %s" % ", ".join(undefined)
|
||||||
% ", ".join(undefined)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add in declared filters. This is necessary since we don't enforce adding
|
# Add in declared filters. This is necessary since we don't enforce adding
|
||||||
@@ -339,22 +391,31 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
|
|||||||
return queryset
|
return queryset
|
||||||
if filterset.__class__.__name__ == "AutoFilterSet":
|
if filterset.__class__.__name__ == "AutoFilterSet":
|
||||||
queryset = filterset.queryset
|
queryset = filterset.queryset
|
||||||
orm_lookups = []
|
filter_fields = filterset.filters if self.filter_fields == "__all__" else self.filter_fields
|
||||||
for search_field in filterset.filters:
|
orm_lookup_dict = dict(
|
||||||
if isinstance(filterset.filters[search_field], CharFilter):
|
zip(
|
||||||
orm_lookups.append(
|
[field for field in filter_fields],
|
||||||
self.construct_search(six.text_type(search_field), filterset.filters[search_field].lookup_expr)
|
[filterset.filters[lookup].lookup_expr for lookup in filterset.filters.keys()],
|
||||||
)
|
)
|
||||||
else:
|
)
|
||||||
orm_lookups.append(search_field)
|
orm_lookups = [
|
||||||
|
self.construct_search(lookup, lookup_expr) for lookup, lookup_expr in orm_lookup_dict.items()
|
||||||
|
]
|
||||||
|
# print(orm_lookups)
|
||||||
conditions = []
|
conditions = []
|
||||||
queries = []
|
queries = []
|
||||||
for search_term_key in filterset.data.keys():
|
for search_term_key in filterset.data.keys():
|
||||||
orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key)
|
orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key)
|
||||||
if not orm_lookup:
|
if not orm_lookup or filterset.data.get(search_term_key) == '':
|
||||||
continue
|
continue
|
||||||
query = Q(**{orm_lookup: filterset.data[search_term_key]})
|
filterset_data_len = len(filterset.data.getlist(search_term_key))
|
||||||
queries.append(query)
|
if filterset_data_len == 1:
|
||||||
|
query = Q(**{orm_lookup: filterset.data[search_term_key]})
|
||||||
|
queries.append(query)
|
||||||
|
elif filterset_data_len == 2:
|
||||||
|
orm_lookup += '__range'
|
||||||
|
query = Q(**{orm_lookup: filterset.data.getlist(search_term_key)})
|
||||||
|
queries.append(query)
|
||||||
if len(queries) > 0:
|
if len(queries) > 0:
|
||||||
conditions.append(reduce(operator.and_, queries))
|
conditions.append(reduce(operator.and_, queries))
|
||||||
queryset = queryset.filter(reduce(operator.and_, conditions))
|
queryset = queryset.filter(reduce(operator.and_, conditions))
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"echarts": "^5.4.1",
|
"echarts": "^5.4.1",
|
||||||
"echarts-gl": "^2.0.9",
|
"echarts-gl": "^2.0.9",
|
||||||
"echarts-wordcloud": "^2.1.0",
|
"echarts-wordcloud": "^2.1.0",
|
||||||
"element-plus": "^2.3.9",
|
"element-plus": "^2.5.5",
|
||||||
"element-tree-line": "^0.2.1",
|
"element-tree-line": "^0.2.1",
|
||||||
"font-awesome": "^4.7.0",
|
"font-awesome": "^4.7.0",
|
||||||
"js-cookie": "^3.0.1",
|
"js-cookie": "^3.0.1",
|
||||||
|
|||||||
141
web/src/components/dvaSelect/index.vue
Normal file
141
web/src/components/dvaSelect/index.vue
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
<template>
|
||||||
|
<!-- 你的自定义受控组件-->
|
||||||
|
<el-select-v2
|
||||||
|
v-model="data"
|
||||||
|
:options="options"
|
||||||
|
style="width: 100%;"
|
||||||
|
:clearable="true"
|
||||||
|
:props="selectProps"
|
||||||
|
@change="onDataChange"
|
||||||
|
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import {ref, defineComponent, watch, computed, toRefs, toRaw, onMounted} from 'vue'
|
||||||
|
import {useUi} from "@fast-crud/fast-crud";
|
||||||
|
import {request} from "/@/utils/service";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
dict: { // 接收来自FastCrud配置中的dict数据
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
modelValue: {}
|
||||||
|
})
|
||||||
|
const emit = defineEmits(['update:modelValue'])
|
||||||
|
// 获取数据
|
||||||
|
const dataList = ref([])
|
||||||
|
|
||||||
|
function getData(params) {
|
||||||
|
request({
|
||||||
|
url: props.dict.url,
|
||||||
|
params: params
|
||||||
|
}).then(res => {
|
||||||
|
dataList.value = res.data
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// template上使用data
|
||||||
|
const data = ref()
|
||||||
|
// const data = computed({
|
||||||
|
// get: () => {
|
||||||
|
// console.log("有默认值", props.modelValue)
|
||||||
|
// //getData({id:props.modelValue})
|
||||||
|
//
|
||||||
|
// console.log(11, dataList)
|
||||||
|
// // const {data} = res
|
||||||
|
// // console.log("get",data[0][selectProps.value.label])
|
||||||
|
// if (dataList && dataList.length === 1) {
|
||||||
|
// return dataList[0][selectProps.value.value]
|
||||||
|
// } else {
|
||||||
|
// // console.log("aa",res.data)
|
||||||
|
// return props.modelValue
|
||||||
|
// }
|
||||||
|
// // return props.modelValue
|
||||||
|
// },
|
||||||
|
// set: (val) => {
|
||||||
|
// //data.value = val
|
||||||
|
// return val
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
const options = ref([])
|
||||||
|
const selectProps = ref({
|
||||||
|
label: 'label',
|
||||||
|
value: 'value'
|
||||||
|
})
|
||||||
|
watch(
|
||||||
|
() => {
|
||||||
|
return props.modelValue
|
||||||
|
}, // 监听modelValue的变化,
|
||||||
|
(value) => {
|
||||||
|
// data.value = value
|
||||||
|
request({
|
||||||
|
url: props.dict.url,
|
||||||
|
params: {
|
||||||
|
id: props.modelValue
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
const dataList = res.data
|
||||||
|
console.log(dataList)
|
||||||
|
if (dataList && dataList.length === 1) {
|
||||||
|
data.value = dataList[0][selectProps.value.label]
|
||||||
|
}else{
|
||||||
|
data.value = null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, // 当modelValue值触发后,同步修改data.value的值
|
||||||
|
{immediate: true} // 立即触发一次,给data赋值初始值
|
||||||
|
)
|
||||||
|
//获取表单校验上下文
|
||||||
|
const {ui} = useUi()
|
||||||
|
const formValidator = ui.formItem.injectFormItemContext();
|
||||||
|
// 当data需要变化时,上报给父组件
|
||||||
|
// 父组件监听到update:modelValue事件后,会更新props.modelValue的值
|
||||||
|
// 然后watch会被触发,修改data.value的值。
|
||||||
|
function onDataChange(value) {
|
||||||
|
emit('update:modelValue', value)
|
||||||
|
data.value = value
|
||||||
|
//触发校验
|
||||||
|
formValidator.onChange()
|
||||||
|
formValidator.onBlur()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (props.dict.url instanceof Function) {
|
||||||
|
request(props.dict.url).then((res) => {
|
||||||
|
options.value = res.data
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
selectProps.value.label = props.dict.label
|
||||||
|
selectProps.value.value = props.dict.value
|
||||||
|
request({
|
||||||
|
url: props.dict.url
|
||||||
|
}).then((res) => {
|
||||||
|
options.value = res.data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// onMounted(() => {
|
||||||
|
// getData({id: props.modelValue})
|
||||||
|
// })
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.el-select .el-input__wrapper .el-input__inner::placeholder {
|
||||||
|
//color: #a8abb2;
|
||||||
|
color: #0d84ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-select-v2 {
|
||||||
|
.el-select-v2__wrapper {
|
||||||
|
.el-select-v2__placeholder.is-transparent {
|
||||||
|
//color: #a8abb2;
|
||||||
|
color: #0d84ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,13 +1,80 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<fs-page>
|
||||||
测试框架外显示
|
<fs-crud ref="crudRef" v-bind="crudBinding">
|
||||||
</div>
|
<template #header-top>
|
||||||
|
<div id="myEcharts" v-show="isEcharts" v-resize-ob="handleResize" :style="{width: '100%', height: '300px'}"></div>
|
||||||
|
</template>
|
||||||
|
</fs-crud>
|
||||||
|
</fs-page>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="demo">
|
<script lang="ts" setup name="loginLog">
|
||||||
|
import { ref, onMounted } from 'vue';
|
||||||
|
import { useFs } from '@fast-crud/fast-crud';
|
||||||
|
import { createCrudOptions } from './crud';
|
||||||
|
import * as echarts from "echarts";
|
||||||
|
const isEcharts = ref(true)
|
||||||
|
const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions,isEcharts,initChart });
|
||||||
|
const myEcharts = echarts
|
||||||
|
|
||||||
|
function initChart() {
|
||||||
|
let chart = myEcharts.init(document.getElementById("myEcharts"), "purple-passion");
|
||||||
|
// 在这里请求API,例如:
|
||||||
|
/***
|
||||||
|
* request({url:'xxxx'}).then(res=>{
|
||||||
|
* // 把chart.setOption写在这里面
|
||||||
|
*
|
||||||
|
* })
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
chart.setOption({
|
||||||
|
title: {
|
||||||
|
text: "2021年各月份销售量(单位:件)",
|
||||||
|
left: "center",
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: "category",
|
||||||
|
data: [
|
||||||
|
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis"
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: "value"
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
data: [
|
||||||
|
606, 542, 985, 687, 501, 787, 339, 706, 383, 684, 669, 737
|
||||||
|
],
|
||||||
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
position: "top",
|
||||||
|
formatter: "{c}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
window.onresize = function () {
|
||||||
|
chart.resize();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleResize(size) {
|
||||||
|
console.log(size)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 页面打开后获取列表数据
|
||||||
|
onMounted(() => {
|
||||||
|
crudExpose.doRefresh();
|
||||||
|
initChart()
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user