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.
Files changed (88) hide show
  1. package/README.md +18 -0
  2. package/bin/index.js +16 -0
  3. package/lib/aesCreate.js +11 -0
  4. package/lib/axiosCreate.js +11 -0
  5. package/lib/create.js +172 -0
  6. package/lib/echartCreate.js +12 -0
  7. package/lib/jwtDecodeCreate.js +16 -0
  8. package/lib/rsaCreate.js +11 -0
  9. package/lib/stateCreate.js +34 -0
  10. package/lib/websocketCreate.js +16 -0
  11. package/package.json +21 -0
  12. package/templates/.env +1 -0
  13. package/templates/.env.dev +2 -0
  14. package/templates/.env.pro +2 -0
  15. package/templates/index.html +15 -0
  16. package/templates/package-lock.json +4058 -0
  17. package/templates/package.json +31 -0
  18. package/templates/public/config.js +1 -0
  19. package/templates/public/font/iconfont.css +579 -0
  20. package/templates/public/font/iconfont.js +1 -0
  21. package/templates/public/font/iconfont.ttf +0 -0
  22. package/templates/public/font/iconfont.woff +0 -0
  23. package/templates/public/font/iconfont.woff2 +0 -0
  24. package/templates/src/App.vue +35 -0
  25. package/templates/src/components/chart/barChart.vue +103 -0
  26. package/templates/src/components/chart/color.ts +43 -0
  27. package/templates/src/components/chart/lineChart.vue +114 -0
  28. package/templates/src/components/chart/mapChart.vue +135 -0
  29. package/templates/src/components/chart/mixedChart.vue +148 -0
  30. package/templates/src/components/chart/pieChart.vue +104 -0
  31. package/templates/src/components/chart/radarChart.vue +112 -0
  32. package/templates/src/components/chart/scatterChart.vue +144 -0
  33. package/templates/src/components/chart/sunburstChart.vue +183 -0
  34. package/templates/src/components/descript/index.vue +45 -0
  35. package/templates/src/components/dialog/index.vue +54 -0
  36. package/templates/src/components/drawer/index.vue +53 -0
  37. package/templates/src/components/form/component/cascader.vue +65 -0
  38. package/templates/src/components/form/component/checkbox.vue +31 -0
  39. package/templates/src/components/form/component/datePicker.vue +39 -0
  40. package/templates/src/components/form/component/dateRange.vue +36 -0
  41. package/templates/src/components/form/component/datetimePicker.vue +25 -0
  42. package/templates/src/components/form/component/fileUpload.vue +80 -0
  43. package/templates/src/components/form/component/formFun.ts +132 -0
  44. package/templates/src/components/form/component/imageUpload.vue +92 -0
  45. package/templates/src/components/form/component/input.vue +41 -0
  46. package/templates/src/components/form/component/location.vue +79 -0
  47. package/templates/src/components/form/component/radio.vue +31 -0
  48. package/templates/src/components/form/component/select.vue +66 -0
  49. package/templates/src/components/form/component/textarea.vue +26 -0
  50. package/templates/src/components/form/component/timePicker.vue +28 -0
  51. package/templates/src/components/form/component/upload.ts +20 -0
  52. package/templates/src/components/form/formInterface.ts +115 -0
  53. package/templates/src/components/form/index.vue +193 -0
  54. package/templates/src/components/form/item.vue +323 -0
  55. package/templates/src/components/groupForm/index.vue +91 -0
  56. package/templates/src/components/icon/index.vue +29 -0
  57. package/templates/src/components/layout/header.vue +238 -0
  58. package/templates/src/components/layout/index.vue +167 -0
  59. package/templates/src/components/layout/menu.vue +130 -0
  60. package/templates/src/components/layout/sideBarItem.vue +49 -0
  61. package/templates/src/components/searchBox/height.ts +9 -0
  62. package/templates/src/components/searchBox/index.vue +265 -0
  63. package/templates/src/components/table/index.vue +371 -0
  64. package/templates/src/components/table/table.ts +23 -0
  65. package/templates/src/components/tree/index.vue +222 -0
  66. package/templates/src/components/tree/lazyTree.vue +136 -0
  67. package/templates/src/data.d.ts +4 -0
  68. package/templates/src/main.ts +18 -0
  69. package/templates/src/router/index.ts +60 -0
  70. package/templates/src/store/menuInterface.ts +10 -0
  71. package/templates/src/store/permission.ts +59 -0
  72. package/templates/src/store/user.ts +24 -0
  73. package/templates/src/utils/alioss/index.ts +0 -0
  74. package/templates/src/utils/axios/http.ts +99 -0
  75. package/templates/src/utils/axios/index.ts +112 -0
  76. package/templates/src/utils/axios/service.ts +8 -0
  77. package/templates/src/utils/crypto/index.ts +28 -0
  78. package/templates/src/utils/rsa/index.ts +18 -0
  79. package/templates/src/utils/token/index.ts +6 -0
  80. package/templates/src/utils/tree/index.ts +74 -0
  81. package/templates/src/utils/websocket/index.ts +136 -0
  82. package/templates/src/views/login/index.vue +248 -0
  83. package/templates/src/views/templete/table.vue +122 -0
  84. package/templates/src/views/templete/tableConfig.ts +153 -0
  85. package/templates/tsconfig.app.json +19 -0
  86. package/templates/tsconfig.json +7 -0
  87. package/templates/tsconfig.node.json +23 -0
  88. 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>