hlq-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/bin/index.js +16 -0
- package/lib/aesCreate.js +11 -0
- package/lib/axiosCreate.js +11 -0
- package/lib/create.js +172 -0
- package/lib/echartCreate.js +12 -0
- package/lib/jwtDecodeCreate.js +16 -0
- package/lib/rsaCreate.js +11 -0
- package/lib/stateCreate.js +34 -0
- package/lib/websocketCreate.js +16 -0
- package/package.json +21 -0
- package/templates/.env +1 -0
- package/templates/.env.dev +2 -0
- package/templates/.env.pro +2 -0
- package/templates/index.html +15 -0
- package/templates/package-lock.json +4058 -0
- package/templates/package.json +31 -0
- package/templates/public/config.js +1 -0
- package/templates/public/font/iconfont.css +579 -0
- package/templates/public/font/iconfont.js +1 -0
- package/templates/public/font/iconfont.ttf +0 -0
- package/templates/public/font/iconfont.woff +0 -0
- package/templates/public/font/iconfont.woff2 +0 -0
- package/templates/src/App.vue +35 -0
- package/templates/src/components/chart/barChart.vue +103 -0
- package/templates/src/components/chart/color.ts +43 -0
- package/templates/src/components/chart/lineChart.vue +114 -0
- package/templates/src/components/chart/mapChart.vue +135 -0
- package/templates/src/components/chart/mixedChart.vue +148 -0
- package/templates/src/components/chart/pieChart.vue +104 -0
- package/templates/src/components/chart/radarChart.vue +112 -0
- package/templates/src/components/chart/scatterChart.vue +144 -0
- package/templates/src/components/chart/sunburstChart.vue +183 -0
- package/templates/src/components/descript/index.vue +45 -0
- package/templates/src/components/dialog/index.vue +54 -0
- package/templates/src/components/drawer/index.vue +53 -0
- package/templates/src/components/form/component/cascader.vue +65 -0
- package/templates/src/components/form/component/checkbox.vue +31 -0
- package/templates/src/components/form/component/datePicker.vue +39 -0
- package/templates/src/components/form/component/dateRange.vue +36 -0
- package/templates/src/components/form/component/datetimePicker.vue +25 -0
- package/templates/src/components/form/component/fileUpload.vue +80 -0
- package/templates/src/components/form/component/formFun.ts +132 -0
- package/templates/src/components/form/component/imageUpload.vue +92 -0
- package/templates/src/components/form/component/input.vue +41 -0
- package/templates/src/components/form/component/location.vue +79 -0
- package/templates/src/components/form/component/radio.vue +31 -0
- package/templates/src/components/form/component/select.vue +66 -0
- package/templates/src/components/form/component/textarea.vue +26 -0
- package/templates/src/components/form/component/timePicker.vue +28 -0
- package/templates/src/components/form/component/upload.ts +20 -0
- package/templates/src/components/form/formInterface.ts +115 -0
- package/templates/src/components/form/index.vue +193 -0
- package/templates/src/components/form/item.vue +323 -0
- package/templates/src/components/groupForm/index.vue +91 -0
- package/templates/src/components/icon/index.vue +29 -0
- package/templates/src/components/layout/header.vue +238 -0
- package/templates/src/components/layout/index.vue +167 -0
- package/templates/src/components/layout/menu.vue +130 -0
- package/templates/src/components/layout/sideBarItem.vue +49 -0
- package/templates/src/components/searchBox/height.ts +9 -0
- package/templates/src/components/searchBox/index.vue +265 -0
- package/templates/src/components/table/index.vue +371 -0
- package/templates/src/components/table/table.ts +23 -0
- package/templates/src/components/tree/index.vue +222 -0
- package/templates/src/components/tree/lazyTree.vue +136 -0
- package/templates/src/data.d.ts +4 -0
- package/templates/src/main.ts +18 -0
- package/templates/src/router/index.ts +60 -0
- package/templates/src/store/menuInterface.ts +10 -0
- package/templates/src/store/permission.ts +59 -0
- package/templates/src/store/user.ts +24 -0
- package/templates/src/utils/alioss/index.ts +0 -0
- package/templates/src/utils/axios/http.ts +99 -0
- package/templates/src/utils/axios/index.ts +112 -0
- package/templates/src/utils/axios/service.ts +8 -0
- package/templates/src/utils/crypto/index.ts +28 -0
- package/templates/src/utils/rsa/index.ts +18 -0
- package/templates/src/utils/token/index.ts +6 -0
- package/templates/src/utils/tree/index.ts +74 -0
- package/templates/src/utils/websocket/index.ts +136 -0
- package/templates/src/views/login/index.vue +248 -0
- package/templates/src/views/templete/table.vue +122 -0
- package/templates/src/views/templete/tableConfig.ts +153 -0
- package/templates/tsconfig.app.json +19 -0
- package/templates/tsconfig.json +7 -0
- package/templates/tsconfig.node.json +23 -0
- package/templates/vite.config.ts +34 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="chartConent">
|
|
3
|
+
<div ref="chartRef" class="chart-container"></div>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
<script lang="ts" setup>
|
|
7
|
+
import { ref, onMounted, watch, onUnmounted, nextTick } from "vue";
|
|
8
|
+
import * as echarts from "echarts";
|
|
9
|
+
import { colorList, colorList2 } from "./color";
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
data?: any;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
data: () => ({
|
|
17
|
+
indicator: [
|
|
18
|
+
{ name: "销售", max: 100 },
|
|
19
|
+
{ name: "利润", max: 100 },
|
|
20
|
+
{ name: "市场", max: 100 },
|
|
21
|
+
{ name: "研发", max: 100 },
|
|
22
|
+
{ name: "客服", max: 100 },
|
|
23
|
+
{ name: "管理", max: 100 }
|
|
24
|
+
],
|
|
25
|
+
series: [
|
|
26
|
+
{
|
|
27
|
+
name: "2023",
|
|
28
|
+
data: [65, 59, 90, 81, 56, 55]
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: "2024",
|
|
32
|
+
data: [28, 48, 40, 19, 96, 27]
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const chartRef = ref<HTMLElement | null>(null);
|
|
39
|
+
let chart: echarts.ECharts | null = null;
|
|
40
|
+
|
|
41
|
+
const initChart = () => {
|
|
42
|
+
if (!chartRef.value) return;
|
|
43
|
+
nextTick(() => {
|
|
44
|
+
chart = echarts.init(chartRef.value);
|
|
45
|
+
const option = {
|
|
46
|
+
tooltip: {},
|
|
47
|
+
legend: {
|
|
48
|
+
data: props.data.series.map((item: any) => item.name),
|
|
49
|
+
top: "top",
|
|
50
|
+
right: "10%",
|
|
51
|
+
orient: "horizontal"
|
|
52
|
+
},
|
|
53
|
+
radar: {
|
|
54
|
+
indicator: props.data.indicator,
|
|
55
|
+
radius: "65%"
|
|
56
|
+
},
|
|
57
|
+
series: props.data.series.map((item: any, index: number) => ({
|
|
58
|
+
name: item.name,
|
|
59
|
+
type: "radar",
|
|
60
|
+
data: [
|
|
61
|
+
{
|
|
62
|
+
value: item.data,
|
|
63
|
+
name: item.name,
|
|
64
|
+
areaStyle: {
|
|
65
|
+
color: colorList2[index % colorList2.length]
|
|
66
|
+
},
|
|
67
|
+
lineStyle: {
|
|
68
|
+
color: colorList[index % colorList.length]
|
|
69
|
+
},
|
|
70
|
+
itemStyle: {
|
|
71
|
+
color: colorList[index % colorList.length]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}))
|
|
76
|
+
};
|
|
77
|
+
chart.setOption(option);
|
|
78
|
+
chart?.resize();
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const handleResize = () => {
|
|
83
|
+
chart?.resize();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
onMounted(() => {
|
|
87
|
+
initChart();
|
|
88
|
+
window.addEventListener("resize", handleResize);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
onUnmounted(() => {
|
|
92
|
+
window.removeEventListener("resize", handleResize);
|
|
93
|
+
chart?.dispose();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
watch(
|
|
97
|
+
() => props.data,
|
|
98
|
+
() => {
|
|
99
|
+
initChart();
|
|
100
|
+
},
|
|
101
|
+
{ deep: true },
|
|
102
|
+
);
|
|
103
|
+
</script>
|
|
104
|
+
<style lang="scss" scoped>
|
|
105
|
+
.chartConent {
|
|
106
|
+
height: 100%;
|
|
107
|
+
}
|
|
108
|
+
.chart-container {
|
|
109
|
+
width: 100%;
|
|
110
|
+
height: 100%;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="chartConent">
|
|
3
|
+
<div ref="chartRef" class="chart-container"></div>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
<script lang="ts" setup>
|
|
7
|
+
import { ref, onMounted, watch, onUnmounted, nextTick } from "vue";
|
|
8
|
+
import * as echarts from "echarts";
|
|
9
|
+
import { colorList, colorList2 } from "./color";
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
data?: any;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
data: () => ({
|
|
17
|
+
series: [
|
|
18
|
+
{
|
|
19
|
+
name: "Group A",
|
|
20
|
+
data: [
|
|
21
|
+
[10.0, 8.04],
|
|
22
|
+
[8.07, 6.95],
|
|
23
|
+
[13.0, 7.58],
|
|
24
|
+
[9.05, 8.81],
|
|
25
|
+
[11.0, 8.33],
|
|
26
|
+
[14.0, 9.96],
|
|
27
|
+
[6.08, 7.24],
|
|
28
|
+
[4.03, 4.26],
|
|
29
|
+
[12.0, 10.84],
|
|
30
|
+
[7.03, 4.82],
|
|
31
|
+
[5.0, 5.68]
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "Group B",
|
|
36
|
+
data: [
|
|
37
|
+
[10.0, 9.14],
|
|
38
|
+
[8.0, 8.14],
|
|
39
|
+
[13.0, 8.74],
|
|
40
|
+
[9.05, 8.77],
|
|
41
|
+
[11.0, 9.26],
|
|
42
|
+
[14.0, 8.1],
|
|
43
|
+
[6.08, 6.13],
|
|
44
|
+
[4.03, 3.1],
|
|
45
|
+
[12.0, 9.13],
|
|
46
|
+
[7.03, 7.26],
|
|
47
|
+
[5.0, 4.74]
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const chartRef = ref<HTMLElement | null>(null);
|
|
55
|
+
let chart: echarts.ECharts | null = null;
|
|
56
|
+
|
|
57
|
+
const initChart = () => {
|
|
58
|
+
if (!chartRef.value) return;
|
|
59
|
+
nextTick(() => {
|
|
60
|
+
chart = echarts.init(chartRef.value);
|
|
61
|
+
const option = {
|
|
62
|
+
tooltip: {
|
|
63
|
+
trigger: "item",
|
|
64
|
+
axisPointer: {
|
|
65
|
+
type: "cross"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
legend: {
|
|
69
|
+
data: props.data.series.map((item: any) => item.name),
|
|
70
|
+
top: "top",
|
|
71
|
+
right: "10%",
|
|
72
|
+
orient: "horizontal"
|
|
73
|
+
},
|
|
74
|
+
grid: {
|
|
75
|
+
left: "3%",
|
|
76
|
+
right: "4%",
|
|
77
|
+
bottom: "3%",
|
|
78
|
+
top: "20%",
|
|
79
|
+
containLabel: true
|
|
80
|
+
},
|
|
81
|
+
xAxis: {
|
|
82
|
+
type: "value",
|
|
83
|
+
name: "X",
|
|
84
|
+
splitLine: {
|
|
85
|
+
lineStyle: {
|
|
86
|
+
type: "dashed"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
yAxis: {
|
|
91
|
+
type: "value",
|
|
92
|
+
name: "Y",
|
|
93
|
+
splitLine: {
|
|
94
|
+
lineStyle: {
|
|
95
|
+
type: "dashed"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
series: props.data.series.map((item: any, index: number) => ({
|
|
100
|
+
name: item.name,
|
|
101
|
+
type: "scatter",
|
|
102
|
+
data: item.data,
|
|
103
|
+
symbolSize: 10,
|
|
104
|
+
itemStyle: {
|
|
105
|
+
color: colorList[index % colorList.length]
|
|
106
|
+
}
|
|
107
|
+
}))
|
|
108
|
+
};
|
|
109
|
+
chart.setOption(option);
|
|
110
|
+
chart?.resize();
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const handleResize = () => {
|
|
115
|
+
chart?.resize();
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
onMounted(() => {
|
|
119
|
+
initChart();
|
|
120
|
+
window.addEventListener("resize", handleResize);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
onUnmounted(() => {
|
|
124
|
+
window.removeEventListener("resize", handleResize);
|
|
125
|
+
chart?.dispose();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
watch(
|
|
129
|
+
() => props.data,
|
|
130
|
+
() => {
|
|
131
|
+
initChart();
|
|
132
|
+
},
|
|
133
|
+
{ deep: true },
|
|
134
|
+
);
|
|
135
|
+
</script>
|
|
136
|
+
<style lang="scss" scoped>
|
|
137
|
+
.chartConent {
|
|
138
|
+
height: 100%;
|
|
139
|
+
}
|
|
140
|
+
.chart-container {
|
|
141
|
+
width: 100%;
|
|
142
|
+
height: 100%;
|
|
143
|
+
}
|
|
144
|
+
</style>
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="chartConent">
|
|
3
|
+
<div ref="chartRef" class="chart-container"></div>
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
<script lang="ts" setup>
|
|
7
|
+
import { ref, onMounted, watch, onUnmounted, nextTick } from "vue";
|
|
8
|
+
import * as echarts from "echarts";
|
|
9
|
+
import { colorList, colorList2 } from "./color";
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
data?: any;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
data: () => ({
|
|
17
|
+
series: [
|
|
18
|
+
{
|
|
19
|
+
name: "旭日图",
|
|
20
|
+
data: [
|
|
21
|
+
{
|
|
22
|
+
name: "类别1",
|
|
23
|
+
children: [
|
|
24
|
+
{
|
|
25
|
+
name: "子类1-1",
|
|
26
|
+
value: 10
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "子类1-2",
|
|
30
|
+
value: 20
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "子类1-3",
|
|
34
|
+
value: 15
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: "类别2",
|
|
40
|
+
children: [
|
|
41
|
+
{
|
|
42
|
+
name: "子类2-1",
|
|
43
|
+
value: 25
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "子类2-2",
|
|
47
|
+
value: 30
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "类别3",
|
|
53
|
+
children: [
|
|
54
|
+
{
|
|
55
|
+
name: "子类3-1",
|
|
56
|
+
value: 18
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: "子类3-2",
|
|
60
|
+
value: 22
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "子类3-3",
|
|
64
|
+
value: 16
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "子类3-4",
|
|
68
|
+
value: 24
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const chartRef = ref<HTMLElement | null>(null);
|
|
79
|
+
let chart: echarts.ECharts | null = null;
|
|
80
|
+
|
|
81
|
+
const initChart = () => {
|
|
82
|
+
if (!chartRef.value) return;
|
|
83
|
+
nextTick(() => {
|
|
84
|
+
chart = echarts.init(chartRef.value);
|
|
85
|
+
const option = {
|
|
86
|
+
tooltip: {
|
|
87
|
+
trigger: "item"
|
|
88
|
+
},
|
|
89
|
+
legend: {
|
|
90
|
+
data: props.data.series[0].data.map((item: any) => item.name),
|
|
91
|
+
top: "top",
|
|
92
|
+
right: "10%",
|
|
93
|
+
orient: "horizontal"
|
|
94
|
+
},
|
|
95
|
+
series: [
|
|
96
|
+
{
|
|
97
|
+
name: "旭日图",
|
|
98
|
+
type: "sunburst",
|
|
99
|
+
radius: ["10%", "90%"],
|
|
100
|
+
center: ["50%", "50%"],
|
|
101
|
+
data: props.data.series[0].data,
|
|
102
|
+
sort: null,
|
|
103
|
+
emphasis: {
|
|
104
|
+
focus: "ancestor"
|
|
105
|
+
},
|
|
106
|
+
levels: [
|
|
107
|
+
{},
|
|
108
|
+
{
|
|
109
|
+
r0: "15%",
|
|
110
|
+
r: "35%",
|
|
111
|
+
itemStyle: {
|
|
112
|
+
borderWidth: 2
|
|
113
|
+
},
|
|
114
|
+
label: {
|
|
115
|
+
rotate: "tangential"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
r0: "35%",
|
|
120
|
+
r: "70%",
|
|
121
|
+
label: {
|
|
122
|
+
align: "right"
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
r0: "70%",
|
|
127
|
+
r: "72%",
|
|
128
|
+
label: {
|
|
129
|
+
position: "outside",
|
|
130
|
+
padding: 3,
|
|
131
|
+
silent: false
|
|
132
|
+
},
|
|
133
|
+
itemStyle: {
|
|
134
|
+
borderWidth: 3
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
itemStyle: {
|
|
139
|
+
color: function(params: any) {
|
|
140
|
+
const depth = params.treePathInfo.length;
|
|
141
|
+
const colors = colorList;
|
|
142
|
+
return colors[(params.dataIndex + depth) % colors.length];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
};
|
|
148
|
+
chart.setOption(option);
|
|
149
|
+
chart?.resize();
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const handleResize = () => {
|
|
154
|
+
chart?.resize();
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
onMounted(() => {
|
|
158
|
+
initChart();
|
|
159
|
+
window.addEventListener("resize", handleResize);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
onUnmounted(() => {
|
|
163
|
+
window.removeEventListener("resize", handleResize);
|
|
164
|
+
chart?.dispose();
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
watch(
|
|
168
|
+
() => props.data,
|
|
169
|
+
() => {
|
|
170
|
+
initChart();
|
|
171
|
+
},
|
|
172
|
+
{ deep: true },
|
|
173
|
+
);
|
|
174
|
+
</script>
|
|
175
|
+
<style lang="scss" scoped>
|
|
176
|
+
.chartConent {
|
|
177
|
+
height: 100%;
|
|
178
|
+
}
|
|
179
|
+
.chart-container {
|
|
180
|
+
width: 100%;
|
|
181
|
+
height: 100%;
|
|
182
|
+
}
|
|
183
|
+
</style>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-descriptions
|
|
3
|
+
style="height: 100%; width: 100%; overflow-y: auto"
|
|
4
|
+
class="margin-top"
|
|
5
|
+
:title="descriptConfig.title"
|
|
6
|
+
:column="3"
|
|
7
|
+
border
|
|
8
|
+
>
|
|
9
|
+
<el-descriptions-item :rowspan="4" :colspan="1" label="图片" :width="180">
|
|
10
|
+
<el-image
|
|
11
|
+
style="width: 130px; height: 130px"
|
|
12
|
+
src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"
|
|
13
|
+
/>
|
|
14
|
+
</el-descriptions-item>
|
|
15
|
+
<el-descriptions-item
|
|
16
|
+
v-for="item in configList"
|
|
17
|
+
:label="item.label"
|
|
18
|
+
:key="item.key"
|
|
19
|
+
:span="1"
|
|
20
|
+
>
|
|
21
|
+
<template v-if="item.type === 'tag'">
|
|
22
|
+
<el-tag size="small">{{ item.value || '' }}</el-tag>
|
|
23
|
+
</template>
|
|
24
|
+
<template v-else>
|
|
25
|
+
{{ (data && data[item.key]) || item.value || '' }}
|
|
26
|
+
<!-- {{ showValue(item) }} -->
|
|
27
|
+
</template>
|
|
28
|
+
</el-descriptions-item>
|
|
29
|
+
</el-descriptions>
|
|
30
|
+
</template>
|
|
31
|
+
<script lang="ts" setup>
|
|
32
|
+
interface Props {
|
|
33
|
+
descriptConfig: Data
|
|
34
|
+
configList: any[]
|
|
35
|
+
data?: Data
|
|
36
|
+
}
|
|
37
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
38
|
+
descriptConfig: () => {
|
|
39
|
+
return {
|
|
40
|
+
title: '信息',
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
</script>
|
|
45
|
+
<style lang="scss" scoped></style>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-dialog
|
|
3
|
+
:destroy-on-close="destroy"
|
|
4
|
+
v-model="state.show"
|
|
5
|
+
:title="title"
|
|
6
|
+
:width="width"
|
|
7
|
+
@close="close"
|
|
8
|
+
draggable
|
|
9
|
+
>
|
|
10
|
+
<slot></slot>
|
|
11
|
+
<template #footer v-if="footerShow">
|
|
12
|
+
<div class="drawer-footer">
|
|
13
|
+
<el-button @click="close">取消</el-button>
|
|
14
|
+
<el-button type="primary" @click="submit"> 确定 </el-button>
|
|
15
|
+
</div>
|
|
16
|
+
</template>
|
|
17
|
+
</el-dialog>
|
|
18
|
+
</template>
|
|
19
|
+
<script lang="ts" setup>
|
|
20
|
+
import { reactive, watch } from 'vue'
|
|
21
|
+
|
|
22
|
+
interface Props {
|
|
23
|
+
modelValue: boolean
|
|
24
|
+
title: string
|
|
25
|
+
destroy?: boolean
|
|
26
|
+
width?: string
|
|
27
|
+
footerShow?: boolean
|
|
28
|
+
}
|
|
29
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
30
|
+
modelValue: false,
|
|
31
|
+
title: '',
|
|
32
|
+
destroy: false,
|
|
33
|
+
footerShow: true,
|
|
34
|
+
})
|
|
35
|
+
const state = reactive({
|
|
36
|
+
show: false,
|
|
37
|
+
})
|
|
38
|
+
const emits = defineEmits(['update:modelValue', 'submit'])
|
|
39
|
+
// 关闭
|
|
40
|
+
const close = () => {
|
|
41
|
+
emits('update:modelValue', false)
|
|
42
|
+
}
|
|
43
|
+
// 确定
|
|
44
|
+
const submit = () => {
|
|
45
|
+
emits('submit')
|
|
46
|
+
}
|
|
47
|
+
watch(
|
|
48
|
+
() => props.modelValue,
|
|
49
|
+
(val: boolean) => {
|
|
50
|
+
state.show = val
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
</script>
|
|
54
|
+
<style lang="scss" scoped></style>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-drawer
|
|
3
|
+
:destroy-on-close="destroy"
|
|
4
|
+
v-model="state.show"
|
|
5
|
+
:title="title"
|
|
6
|
+
:size="width"
|
|
7
|
+
@close="close"
|
|
8
|
+
>
|
|
9
|
+
<slot></slot>
|
|
10
|
+
<template #footer v-if="footerShow">
|
|
11
|
+
<div class="drawer-footer">
|
|
12
|
+
<el-button @click="close">取消</el-button>
|
|
13
|
+
<el-button type="primary" @click="submit"> 确定 </el-button>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
</el-drawer>
|
|
17
|
+
</template>
|
|
18
|
+
<script lang="ts" setup>
|
|
19
|
+
import { reactive, watch } from "vue";
|
|
20
|
+
|
|
21
|
+
interface Props {
|
|
22
|
+
modelValue: boolean;
|
|
23
|
+
title: string;
|
|
24
|
+
destroy?: boolean;
|
|
25
|
+
width?: string;
|
|
26
|
+
footerShow?: boolean;
|
|
27
|
+
}
|
|
28
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
29
|
+
modelValue: false,
|
|
30
|
+
title: "",
|
|
31
|
+
destroy: false,
|
|
32
|
+
footerShow: true,
|
|
33
|
+
});
|
|
34
|
+
const state = reactive({
|
|
35
|
+
show: false,
|
|
36
|
+
});
|
|
37
|
+
const emits = defineEmits(["update:modelValue", "submit"]);
|
|
38
|
+
// 关闭
|
|
39
|
+
const close = () => {
|
|
40
|
+
emits("update:modelValue", false);
|
|
41
|
+
};
|
|
42
|
+
// 确定
|
|
43
|
+
const submit = () => {
|
|
44
|
+
emits("submit");
|
|
45
|
+
};
|
|
46
|
+
watch(
|
|
47
|
+
() => props.modelValue,
|
|
48
|
+
(val) => {
|
|
49
|
+
state.show = val;
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
</script>
|
|
53
|
+
<style lang="scss" scoped></style>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-cascader
|
|
3
|
+
clearable
|
|
4
|
+
ref="cascaderRef"
|
|
5
|
+
v-model="formData[config.key]"
|
|
6
|
+
:placeholder="config.placeholder || '请选择' + config.label"
|
|
7
|
+
:disabled="disabled"
|
|
8
|
+
:options="
|
|
9
|
+
config.options && config.options.length ? config.options : state.options
|
|
10
|
+
"
|
|
11
|
+
:props="state.cascaderProp"
|
|
12
|
+
style="width: 100%"
|
|
13
|
+
filterable
|
|
14
|
+
:filter-method="filterMethod"
|
|
15
|
+
@change="close"
|
|
16
|
+
/>
|
|
17
|
+
</template>
|
|
18
|
+
<script lang="ts" setup>
|
|
19
|
+
import { debounce } from 'lodash'
|
|
20
|
+
import { nextTick, ref } from 'vue'
|
|
21
|
+
const cascaderRef = ref()
|
|
22
|
+
const closeFlag = ref(false)
|
|
23
|
+
const debouncedFilter = debounce((keyword: string) => {
|
|
24
|
+
nextTick(() => {
|
|
25
|
+
// 获取内部过滤后的选项
|
|
26
|
+
const options = cascaderRef.value?.cascaderPanelRef?.getFlattedNodes()
|
|
27
|
+
const filteredOptions = options.filter((option: any) => {
|
|
28
|
+
return option.label.indexOf(keyword) > -1
|
|
29
|
+
})
|
|
30
|
+
if (filteredOptions.length > 0) {
|
|
31
|
+
closeFlag.value = true
|
|
32
|
+
cascaderRef.value.cascaderPanelRef.handleCheckChange(
|
|
33
|
+
filteredOptions[0],
|
|
34
|
+
true,
|
|
35
|
+
false,
|
|
36
|
+
)
|
|
37
|
+
cascaderRef.value.cascaderPanelRef.calculateCheckedValue()
|
|
38
|
+
setTimeout(() => {
|
|
39
|
+
closeFlag.value = false
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
}, 1000)
|
|
44
|
+
interface Props {
|
|
45
|
+
config: FormCascaderConfig
|
|
46
|
+
data?: Data
|
|
47
|
+
formData: Data
|
|
48
|
+
disabled: boolean
|
|
49
|
+
state: any
|
|
50
|
+
}
|
|
51
|
+
const props = defineProps<Props>()
|
|
52
|
+
const filterMethod = (node: any, keyword: string) => {
|
|
53
|
+
debouncedFilter(keyword)
|
|
54
|
+
const { label } = node
|
|
55
|
+
return label.indexOf(keyword) > -1
|
|
56
|
+
}
|
|
57
|
+
const emits = defineEmits(['change'])
|
|
58
|
+
const close = (data?: any) => {
|
|
59
|
+
emits('change', data)
|
|
60
|
+
if (cascaderRef.value && !closeFlag.value) {
|
|
61
|
+
cascaderRef.value.togglePopperVisible(false)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
</script>
|
|
65
|
+
<style lang="scss" scoped></style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<el-checkbox-group
|
|
3
|
+
v-model="formData[config.key]"
|
|
4
|
+
style="width: 100%"
|
|
5
|
+
@change="change"
|
|
6
|
+
>
|
|
7
|
+
<el-checkbox
|
|
8
|
+
v-for="item in config.options"
|
|
9
|
+
:key="item.value"
|
|
10
|
+
:value="item.value"
|
|
11
|
+
>
|
|
12
|
+
{{ item.label }}
|
|
13
|
+
</el-checkbox>
|
|
14
|
+
</el-checkbox-group>
|
|
15
|
+
</template>
|
|
16
|
+
<script lang="ts" setup>
|
|
17
|
+
interface Props {
|
|
18
|
+
config: FormCheckBoxConfig;
|
|
19
|
+
data?: Data;
|
|
20
|
+
formData: Data;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
state: any;
|
|
23
|
+
}
|
|
24
|
+
const props = defineProps<Props>();
|
|
25
|
+
|
|
26
|
+
const emits = defineEmits(["change"]);
|
|
27
|
+
const change = (val: any) => {
|
|
28
|
+
emits("change", val);
|
|
29
|
+
};
|
|
30
|
+
</script>
|
|
31
|
+
<style lang="scss" scoped></style>
|