general-basic-form 1.0.25 → 2.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 CHANGED
@@ -1,191 +1,216 @@
1
- # GeneralBasicForm
2
-
3
- 一个兼容 Vue2 和 Vue3 的表单组件 <br/>
4
- 示例:
5
-
6
- <GeneralBasicForm
7
- :showSearch="showSearch"
8
- :getList="getList"
9
- :formItem="formItem"
10
- :size="size"
11
- ref="generalBasicForm"
12
- labelWidth="90px"
13
- >
14
- ...一些传入插槽的内容
15
- </GeneralBasicForm>
16
-
17
- ![image-20210903165502942](https://raw.githubusercontent.com/Alan1034/PicturesServer/main/PicGo_imgs/202109031655830.png)
18
-
19
- 在单纯作为表单的时候可以这样使用:
20
-
21
- <GeneralBasicForm
22
- formOnly
23
- :formItem="formItem"
24
- size="small"
25
- ref="generalBasicForm"
26
- :labelWidth="formLabelWidth"
27
- :formData: {
28
- // 外部传入的表单数据,用于回填
29
- }
30
- noUrlParameters
31
- />
32
-
33
- <style lang="scss" scoped>
34
- :deep {
35
- .el-form-item {
36
- margin-bottom: 22px;
37
- }
38
- }
39
- </style>
40
-
41
- 表单数据校验需要拿到内部表单的ref
42
-
43
- this.$refs["generalBasicForm"].$refs["queryFormRef"]
44
- .validate(
45
- async (valid) => {
46
- if (valid) {
47
- console.log(this.$refs["generalBasicForm"]["queryParams"]);
48
- }
49
- }
50
- );
51
-
52
- ![image-20211014191532067](https://raw.githubusercontent.com/Alan1034/PicturesServer/main/PicGo_imgs/202110141915657.png)
53
-
54
- 数据示例:
55
-
56
- showSearch: true, // 显示搜索条件
57
- getList(); // 请求数据的函数
58
- formOnly:true // 只展示表单不展示按钮
59
- noUrlParameters:true // 不接受和不改变url的参数
60
- formItem: [
61
- { label: "款式名称",
62
- prop: "bsName",
63
- type: "input",
64
- placeholder: "请输入图片名称/分类名称/图片标签",
65
- rules: [
66
- {
67
- message: "请输入信息"
68
- },
69
- {
70
- pattern: /^\w+[\,\,\-\w' '#]+$/,
71
- message: "请输入正确的Invoice单号"
72
- }
73
- ],
74
- template: {
75
- suffix: () => {
76
- return <svg-icon icon-class="baifenbi" />;
77
- },
78
- },
79
- maxlength: "3000"},
80
- {
81
- label: "二次工艺",
82
- prop: "spName",
83
- type: "select",
84
- multiple:true, //多选
85
- option: [
86
- { value: "3", desc: "满印" },
87
- { value: "1", desc: "区域印花" },
88
- { value: "2", desc: "绣花" },
89
- ],
90
- },
91
- {
92
- label: "创建时间",
93
- prop: "create_time",
94
- type: "date-picker",
95
- "value-format": "yyyyMMdd"
96
- },
97
- {
98
- label: "二次工艺成本价格(人民币分)",
99
- prop: "spCost",
100
- type: "input-number",
101
- "controls-position": "right",
102
- min: 0,
103
- rules: [
104
- {
105
- required: true,
106
- message: "请输入二次工艺成本价格",
107
- trigger: "blur",
108
- },
109
- ],
110
- },
111
- {
112
- label: "分类",
113
- prop: "分类",
114
- type: "cascader",
115
- options: [
116
- {
117
- value: "zhinan",
118
- label: "指南",
119
- children: [
120
- {
121
- value: "shejiyuanze",
122
- label: "设计原则",
123
- children: [
124
- {
125
- value: "yizhi",
126
- label: "一致",
127
- },
128
- {
129
- value: "fankui",
130
- label: "反馈",
131
- },
132
- {
133
- value: "xiaolv",
134
- label: "效率",
135
- },
136
- {
137
- value: "kekong",
138
- label: "可控",
139
- },
140
- ],
141
- },
142
- {
143
- value: "daohang",
144
- label: "导航",
145
- children: [
146
- {
147
- value: "cexiangdaohang",
148
- label: "侧向导航",
149
- },
150
- {
151
- value: "dingbudaohang",
152
- label: "顶部导航",
153
- },
154
- ],
155
- },
156
- ],
157
- },
158
- {
159
- value: "ziyuan",
160
- label: "资源",
161
- children: [
162
- {
163
- value: "axure",
164
- label: "Axure Components",
165
- },
166
- {
167
- value: "sketch",
168
- label: "Sketch Templates",
169
- },
170
- {
171
- value: "jiaohu",
172
- label: "组件交互文档",
173
- },
174
- ],
175
- },
176
- ],
177
- },
178
- ],
179
- //分别支持input输入框,select单选框,date-picker日期选择器,cascader层级选择器 四种组件
180
-
181
- //date-picker可以传入'start-placeholder'和'end-placeholder',其他组件支持placeholder传入
182
-
183
- //rules为表单校验规则,每个组件都可以传入
184
-
185
- //input支持template,支持以下几个属性:
186
- //prefix 输入框头部内容,只对 type="text"(默认) 有效
187
- //suffix 输入框尾部内容,只对 type="text" 有效
188
- //prepend 输入框前置内容,只对 type="text" 有效
189
- //append 输入框后置内容,只对 type="text" 有效
190
- 安装:npm i general-basic-form<br/>
191
- install: npm i general-basic-form
1
+ # GeneralBasicForm
2
+
3
+ 一个兼容 Vue2 和 Vue3 的表单组件 <br/>
4
+
5
+ 示例:
6
+
7
+ 因为兼容性问题,目前只能使用完整引入
8
+
9
+ ```
10
+ import ElementPlus from 'element-plus'
11
+ import 'element-plus/dist/index.css'
12
+ app.use(ElementPlus)
13
+ ```
14
+
15
+ ```
16
+ import GeneralBasicForm from 'general-basic-form'
17
+ ```
18
+
19
+ <GeneralBasicForm
20
+ :showSearch="showSearch"
21
+ :getList="getList"
22
+ :formItem="formItem"
23
+ :size="size"
24
+ ref="generalBasicForm"
25
+ labelWidth="90px"
26
+ >
27
+ ...一些传入插槽的内容
28
+ </GeneralBasicForm>
29
+
30
+ ![image-20210903165502942](https://raw.githubusercontent.com/Alan1034/PicturesServer/main/PicGo_imgs/202109031655830.png)
31
+
32
+ 在单纯作为表单的时候可以这样使用:
33
+
34
+ <GeneralBasicForm
35
+ formOnly
36
+ :formItem="formItem"
37
+ size="small"
38
+ ref="generalBasicForm"
39
+ :labelWidth="formLabelWidth"
40
+ :formData: {
41
+ // 外部传入的表单数据,用于回填
42
+ }
43
+ noUrlParameters
44
+ :afterReset="afterReset"
45
+ />
46
+
47
+ <style lang="scss" scoped>
48
+ :deep {
49
+ .el-form-item {
50
+ margin-bottom: 22px;
51
+ }
52
+ }
53
+ </style>
54
+
55
+ getList会传出默认的参数,首次请求时会有页数和分页大小,重置后会传出默认页数1
56
+
57
+ async getList(
58
+ params = {
59
+ page: Number(this.$route.query.page) || 1,
60
+ limit: Number(this.$route.query.limit) || 10,
61
+ }
62
+ ) {}
63
+
64
+ 表单数据校验需要拿到内部表单的ref
65
+
66
+ this.$refs["generalBasicForm"].$refs["queryFormRef"]
67
+ .validate(
68
+ async (valid) => {
69
+ if (valid) {
70
+ console.log(this.$refs["generalBasicForm"]["queryParams"]);
71
+ }
72
+ }
73
+ );
74
+
75
+
76
+ ![image-20211014191532067](https://raw.githubusercontent.com/Alan1034/PicturesServer/main/PicGo_imgs/202110141915657.png)
77
+
78
+ 数据示例:
79
+
80
+ showSearch: true, // 显示搜索条件
81
+ getList(); // 请求数据的函数
82
+ afterReset(); // 在重置按钮点击完后但还没重新请求时触发的的函数
83
+ formOnly:true // 只展示表单不展示按钮
84
+ noUrlParameters:true // 不接受和不改变url的参数
85
+ formItem: [
86
+ { label: "款式名称",
87
+ prop: "bsName",
88
+ type: "input",
89
+ placeholder: "请输入图片名称/分类名称/图片标签",
90
+ rules: [
91
+ {
92
+ message: "请输入信息"
93
+ },
94
+ {
95
+ pattern: /^\w+[\,\,\-\w' '#]+$/,
96
+ message: "请输入正确的Invoice单号"
97
+ }
98
+ ],
99
+ template: {
100
+ suffix: () => {
101
+ return <svg-icon icon-class="baifenbi" />;
102
+ },
103
+ },
104
+ maxlength: "3000"},
105
+ {
106
+ label: "二次工艺",
107
+ prop: "spName",
108
+ type: "select",
109
+ multiple:true, //多选
110
+ option: [
111
+ { value: "3", desc: "满印" },
112
+ { value: "1", desc: "区域印花" },
113
+ { value: "2", desc: "绣花" },
114
+ ],
115
+ },
116
+ {
117
+ label: "创建时间",
118
+ prop: "create_time",
119
+ type: "date-picker",
120
+ "value-format": "yyyyMMdd"
121
+ },
122
+ {
123
+ label: "二次工艺成本价格(人民币分)",
124
+ prop: "spCost",
125
+ type: "input-number",
126
+ "controls-position": "right",
127
+ min: 0,
128
+ rules: [
129
+ {
130
+ required: true,
131
+ message: "请输入二次工艺成本价格",
132
+ trigger: "blur",
133
+ },
134
+ ],
135
+ },
136
+ {
137
+ label: "分类",
138
+ prop: "分类",
139
+ type: "cascader",
140
+ options: [
141
+ {
142
+ value: "zhinan",
143
+ label: "指南",
144
+ children: [
145
+ {
146
+ value: "shejiyuanze",
147
+ label: "设计原则",
148
+ children: [
149
+ {
150
+ value: "yizhi",
151
+ label: "一致",
152
+ },
153
+ {
154
+ value: "fankui",
155
+ label: "反馈",
156
+ },
157
+ {
158
+ value: "xiaolv",
159
+ label: "效率",
160
+ },
161
+ {
162
+ value: "kekong",
163
+ label: "可控",
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ value: "daohang",
169
+ label: "导航",
170
+ children: [
171
+ {
172
+ value: "cexiangdaohang",
173
+ label: "侧向导航",
174
+ },
175
+ {
176
+ value: "dingbudaohang",
177
+ label: "顶部导航",
178
+ },
179
+ ],
180
+ },
181
+ ],
182
+ },
183
+ {
184
+ value: "ziyuan",
185
+ label: "资源",
186
+ children: [
187
+ {
188
+ value: "axure",
189
+ label: "Axure Components",
190
+ },
191
+ {
192
+ value: "sketch",
193
+ label: "Sketch Templates",
194
+ },
195
+ {
196
+ value: "jiaohu",
197
+ label: "组件交互文档",
198
+ },
199
+ ],
200
+ },
201
+ ],
202
+ },
203
+ ],
204
+ //分别支持input输入框,select单选框,date-picker日期选择器,cascader层级选择器 四种组件
205
+
206
+ //date-picker可以传入'start-placeholder'和'end-placeholder',其他组件支持placeholder传入
207
+
208
+ //rules为表单校验规则,每个组件都可以传入
209
+
210
+ //input支持template,支持以下几个属性:
211
+ //prefix 输入框头部内容,只对 type="text"(默认) 有效
212
+ //suffix 输入框尾部内容,只对 type="text" 有效
213
+ //prepend 输入框前置内容,只对 type="text" 有效
214
+ //append 输入框后置内容,只对 type="text" 有效
215
+ 安装:npm i general-basic-form<br/>
216
+ install: npm i general-basic-form
@@ -0,0 +1,17 @@
1
+ /*
2
+ * @Author: 陈德立*******419287484@qq.com
3
+ * @Date: 2023-11-07 17:55:59
4
+ * @LastEditTime: 2023-11-08 10:24:14
5
+ * @LastEditors: 陈德立*******419287484@qq.com
6
+ * @Github: https://github.com/Alan1034
7
+ * @Description:
8
+ * @FilePath: \GeneralBasicForm\public\index.d.ts
9
+ *
10
+ */
11
+ /// <reference types="vite/client" />
12
+ declare module "*.vue" {
13
+ import { DefineComponent } from "vue"
14
+ const component: DefineComponent<{}, {}, any>
15
+ export default component
16
+ }
17
+ declare module "general-basic-form";
package/dist/index.mjs ADDED
@@ -0,0 +1,266 @@
1
+ import { resolveComponent as u, withDirectives as x, openBlock as a, createBlock as s, mergeProps as c, withCtx as p, createElementBlock as g, Fragment as P, renderList as m, withKeys as B, createSlots as C, resolveDynamicComponent as F, createCommentVNode as i, renderSlot as I, createVNode as k, createTextVNode as V, vShow as Q } from "vue";
2
+ const D = (r, n) => {
3
+ const t = r.__vccOpts || r;
4
+ for (const [h, l] of n)
5
+ t[h] = l;
6
+ return t;
7
+ }, G = {
8
+ name: "GeneralBasicForm",
9
+ components: {
10
+ InputArchive: (r) => {
11
+ const { templateEle: n } = r;
12
+ return n();
13
+ }
14
+ },
15
+ props: {
16
+ showSearch: {
17
+ // 是否展示所有元素
18
+ type: Boolean,
19
+ default: !0
20
+ },
21
+ formOnly: {
22
+ // 是否只展示表单不展示按钮
23
+ type: Boolean,
24
+ default: !1
25
+ },
26
+ getList: {
27
+ // 查找数据调用的函数
28
+ type: Function,
29
+ default: () => {
30
+ }
31
+ },
32
+ afterReset: {
33
+ // 在重置按钮点击完后但还没重新请求时触发的的函数
34
+ type: Function,
35
+ default: () => {
36
+ }
37
+ },
38
+ formItem: {
39
+ // 定义表单的数据
40
+ type: Array,
41
+ default: []
42
+ },
43
+ size: {
44
+ // 控制按钮大小
45
+ type: String,
46
+ default: "medium"
47
+ },
48
+ labelWidth: {
49
+ // 表单文字宽度
50
+ type: String,
51
+ default: "90px"
52
+ },
53
+ noUrlParameters: {
54
+ // 不接受和不改变url的参数
55
+ type: Boolean,
56
+ default: () => !1
57
+ },
58
+ formData: {
59
+ // 外部传入的表单数据,用于回填
60
+ type: Object,
61
+ default: () => {
62
+ }
63
+ }
64
+ },
65
+ data() {
66
+ var r;
67
+ return {
68
+ queryParams: {
69
+ ...this.noUrlParameters ? {} : (r = this.$route) == null ? void 0 : r.query
70
+ },
71
+ // form表单数据
72
+ selectSetting: {
73
+ placeholder: "请选择",
74
+ clearable: !0,
75
+ style: "width: 200px"
76
+ },
77
+ inputSetting: {
78
+ placeholder: "请输入",
79
+ style: "width: 200px",
80
+ clearable: !0
81
+ },
82
+ datePackerSetting: {
83
+ style: "width: 227px",
84
+ "start-placeholder": "开始日期",
85
+ "end-placeholder": "结束日期",
86
+ type: "daterange"
87
+ }
88
+ };
89
+ },
90
+ // setup(props) {
91
+ //设置默认值
92
+ // console.log(props);
93
+ // // const { formItem } = toRefs(props);
94
+ // const { formItem } = props;
95
+ // console.log(formItem);
96
+ // const queryParams = {};
97
+ // formItem.forEach((item) => {
98
+ // queryParams[item.prop] = "";
99
+ // });
100
+ // return {
101
+ // queryParams,
102
+ // };
103
+ // },
104
+ watch: {
105
+ formData(r) {
106
+ this.queryParams = {
107
+ ...this.noUrlParameters ? {} : this.queryParams,
108
+ ...r
109
+ };
110
+ }
111
+ },
112
+ methods: {
113
+ /** 搜索按钮操作 */
114
+ handleQuery() {
115
+ var t;
116
+ const r = { page: 1, limit: 10 }, n = {
117
+ ...(t = this.$route) == null ? void 0 : t.query,
118
+ ...this.queryParams,
119
+ ...r
120
+ };
121
+ this.noUrlParameters || this.$router.push({
122
+ query: { ...n }
123
+ }), this.getList({
124
+ ...n
125
+ });
126
+ },
127
+ /** 重置按钮操作 */
128
+ async resetQuery() {
129
+ var n;
130
+ this.$refs.queryFormRef.resetFields();
131
+ const r = { page: 1 };
132
+ this.noUrlParameters || await this.$router.push({
133
+ query: { ...r }
134
+ }), this.queryParams = {
135
+ ...this.noUrlParameters ? {} : (n = this.$route) == null ? void 0 : n.query
136
+ }, this.afterReset(), this.handleQuery();
137
+ },
138
+ currentInputComponent() {
139
+ return "input-archive";
140
+ }
141
+ }
142
+ };
143
+ function L(r, n, t, h, l, d) {
144
+ const q = u("el-input"), z = u("el-option"), b = u("el-select"), S = u("el-cascader"), v = u("el-date-picker"), U = u("el-input-number"), y = u("el-form-item"), _ = u("el-button"), w = u("el-form");
145
+ return x((a(), s(w, c({
146
+ model: l.queryParams,
147
+ ref: "queryFormRef",
148
+ inline: "",
149
+ "label-position": "left",
150
+ "label-width": t.labelWidth
151
+ }, r.$attrs), {
152
+ default: p(() => [
153
+ (a(!0), g(P, null, m(t.formItem, (e) => (a(), s(y, {
154
+ label: e.label,
155
+ prop: e.prop,
156
+ key: e.prop,
157
+ rules: e.rules
158
+ }, {
159
+ default: p(() => [
160
+ e.type === "input" ? (a(), s(q, c({
161
+ key: 0,
162
+ onKeydown: B(t.getList, ["enter"]),
163
+ modelValue: l.queryParams[e.prop],
164
+ "onUpdate:modelValue": (o) => l.queryParams[e.prop] = o,
165
+ size: t.size
166
+ }, l.inputSetting, {
167
+ placeholder: e.placeholder || l.inputSetting.placeholder,
168
+ maxlength: e.maxlength
169
+ }), C({ _: 2 }, [
170
+ m(e.template, (o, f) => ({
171
+ name: f,
172
+ fn: p(() => [
173
+ o ? (a(), s(F(d.currentInputComponent()), {
174
+ key: f,
175
+ templateEle: o
176
+ }, null, 8, ["templateEle"])) : i("", !0)
177
+ ])
178
+ }))
179
+ ]), 1040, ["onKeydown", "modelValue", "onUpdate:modelValue", "size", "placeholder", "maxlength"])) : e.type === "select" ? (a(), s(b, c({
180
+ key: 1,
181
+ filterable: "",
182
+ modelValue: l.queryParams[e.prop],
183
+ "onUpdate:modelValue": (o) => l.queryParams[e.prop] = o,
184
+ size: t.size
185
+ }, l.selectSetting, {
186
+ multiple: e.multiple,
187
+ placeholder: e.placeholder || l.selectSetting.placeholder
188
+ }), {
189
+ default: p(() => [
190
+ (a(!0), g(P, null, m(e.option || [], (o) => (a(), s(z, {
191
+ key: o.value,
192
+ label: o.desc,
193
+ value: o.value
194
+ }, null, 8, ["label", "value"]))), 128))
195
+ ]),
196
+ _: 2
197
+ }, 1040, ["modelValue", "onUpdate:modelValue", "size", "multiple", "placeholder"])) : e.type === "cascader" ? (a(), s(S, c({
198
+ key: 2,
199
+ filterable: "",
200
+ modelValue: l.queryParams[e.prop],
201
+ "onUpdate:modelValue": (o) => l.queryParams[e.prop] = o,
202
+ size: t.size
203
+ }, l.selectSetting, {
204
+ options: e.options || [],
205
+ placeholder: e.placeholder || l.selectSetting.placeholder
206
+ }), null, 16, ["modelValue", "onUpdate:modelValue", "size", "options", "placeholder"])) : e.type === "date-picker" ? (a(), s(v, c({
207
+ key: 3,
208
+ modelValue: l.queryParams[e.prop],
209
+ "onUpdate:modelValue": (o) => l.queryParams[e.prop] = o,
210
+ size: t.size
211
+ }, l.datePackerSetting, {
212
+ "start-placeholder": e["start-placeholder"] || l.datePackerSetting["start-placeholder"],
213
+ "end-placeholder": e["end-placeholder"] || l.datePackerSetting["end-placeholder"],
214
+ "value-format": e["value-format"]
215
+ }), null, 16, ["modelValue", "onUpdate:modelValue", "size", "start-placeholder", "end-placeholder", "value-format"])) : i("", !0),
216
+ e.type === "input-number" ? (a(), s(U, c({
217
+ key: 4,
218
+ modelValue: l.queryParams[e.prop],
219
+ "onUpdate:modelValue": (o) => l.queryParams[e.prop] = o,
220
+ size: t.size
221
+ }, l.inputSetting, {
222
+ min: e.min,
223
+ max: e.max,
224
+ "controls-position": e["controls-position"],
225
+ "step-strictly": e["step-strictly"]
226
+ }), null, 16, ["modelValue", "onUpdate:modelValue", "size", "min", "max", "controls-position", "step-strictly"])) : i("", !0)
227
+ ]),
228
+ _: 2
229
+ }, 1032, ["label", "prop", "rules"]))), 128)),
230
+ I(r.$slots, "default", {}, void 0, !0),
231
+ t.formOnly ? i("", !0) : (a(), s(y, { key: 0 }, {
232
+ default: p(() => [
233
+ k(_, {
234
+ type: "primary",
235
+ icon: "el-icon-search",
236
+ size: t.size,
237
+ onClick: d.handleQuery
238
+ }, {
239
+ default: p(() => [
240
+ V("查询")
241
+ ]),
242
+ _: 1
243
+ }, 8, ["size", "onClick"]),
244
+ k(_, {
245
+ icon: "el-icon-refresh",
246
+ size: t.size,
247
+ onClick: d.resetQuery
248
+ }, {
249
+ default: p(() => [
250
+ V("重置")
251
+ ]),
252
+ _: 1
253
+ }, 8, ["size", "onClick"])
254
+ ]),
255
+ _: 1
256
+ }))
257
+ ]),
258
+ _: 3
259
+ }, 16, ["model", "label-width"])), [
260
+ [Q, t.showSearch]
261
+ ]);
262
+ }
263
+ const O = /* @__PURE__ */ D(G, [["render", L], ["__scopeId", "data-v-279f95d9"]]), E = O;
264
+ export {
265
+ E as VGeneralBasicForm
266
+ };
@@ -0,0 +1 @@
1
+ (function(s,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(s=typeof globalThis<"u"?globalThis:s||self,e(s.Index={},s.Vue))})(this,function(s,e){"use strict";const q="",u=(r,a)=>{const l=r.__vccOpts||r;for(const[p,o]of a)l[p]=o;return l},h={name:"GeneralBasicForm",components:{InputArchive:r=>{const{templateEle:a}=r;return a()}},props:{showSearch:{type:Boolean,default:!0},formOnly:{type:Boolean,default:!1},getList:{type:Function,default:()=>{}},afterReset:{type:Function,default:()=>{}},formItem:{type:Array,default:[]},size:{type:String,default:"medium"},labelWidth:{type:String,default:"90px"},noUrlParameters:{type:Boolean,default:()=>!1},formData:{type:Object,default:()=>{}}},data(){var r;return{queryParams:{...this.noUrlParameters?{}:(r=this.$route)==null?void 0:r.query},selectSetting:{placeholder:"请选择",clearable:!0,style:"width: 200px"},inputSetting:{placeholder:"请输入",style:"width: 200px",clearable:!0},datePackerSetting:{style:"width: 227px","start-placeholder":"开始日期","end-placeholder":"结束日期",type:"daterange"}}},watch:{formData(r){this.queryParams={...this.noUrlParameters?{}:this.queryParams,...r}}},methods:{handleQuery(){var l;const r={page:1,limit:10},a={...(l=this.$route)==null?void 0:l.query,...this.queryParams,...r};this.noUrlParameters||this.$router.push({query:{...a}}),this.getList({...a})},async resetQuery(){var a;this.$refs.queryFormRef.resetFields();const r={page:1};this.noUrlParameters||await this.$router.push({query:{...r}}),this.queryParams={...this.noUrlParameters?{}:(a=this.$route)==null?void 0:a.query},this.afterReset(),this.handleQuery()},currentInputComponent(){return"input-archive"}}};function y(r,a,l,p,o,c){const _=e.resolveComponent("el-input"),k=e.resolveComponent("el-option"),g=e.resolveComponent("el-select"),P=e.resolveComponent("el-cascader"),B=e.resolveComponent("el-date-picker"),V=e.resolveComponent("el-input-number"),i=e.resolveComponent("el-form-item"),d=e.resolveComponent("el-button"),C=e.resolveComponent("el-form");return e.withDirectives((e.openBlock(),e.createBlock(C,e.mergeProps({model:o.queryParams,ref:"queryFormRef",inline:"","label-position":"left","label-width":l.labelWidth},r.$attrs),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.formItem,t=>(e.openBlock(),e.createBlock(i,{label:t.label,prop:t.prop,key:t.prop,rules:t.rules},{default:e.withCtx(()=>[t.type==="input"?(e.openBlock(),e.createBlock(_,e.mergeProps({key:0,onKeydown:e.withKeys(l.getList,["enter"]),modelValue:o.queryParams[t.prop],"onUpdate:modelValue":n=>o.queryParams[t.prop]=n,size:l.size},o.inputSetting,{placeholder:t.placeholder||o.inputSetting.placeholder,maxlength:t.maxlength}),e.createSlots({_:2},[e.renderList(t.template,(n,m)=>({name:m,fn:e.withCtx(()=>[n?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.currentInputComponent()),{key:m,templateEle:n},null,8,["templateEle"])):e.createCommentVNode("",!0)])}))]),1040,["onKeydown","modelValue","onUpdate:modelValue","size","placeholder","maxlength"])):t.type==="select"?(e.openBlock(),e.createBlock(g,e.mergeProps({key:1,filterable:"",modelValue:o.queryParams[t.prop],"onUpdate:modelValue":n=>o.queryParams[t.prop]=n,size:l.size},o.selectSetting,{multiple:t.multiple,placeholder:t.placeholder||o.selectSetting.placeholder}),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.option||[],n=>(e.openBlock(),e.createBlock(k,{key:n.value,label:n.desc,value:n.value},null,8,["label","value"]))),128))]),_:2},1040,["modelValue","onUpdate:modelValue","size","multiple","placeholder"])):t.type==="cascader"?(e.openBlock(),e.createBlock(P,e.mergeProps({key:2,filterable:"",modelValue:o.queryParams[t.prop],"onUpdate:modelValue":n=>o.queryParams[t.prop]=n,size:l.size},o.selectSetting,{options:t.options||[],placeholder:t.placeholder||o.selectSetting.placeholder}),null,16,["modelValue","onUpdate:modelValue","size","options","placeholder"])):t.type==="date-picker"?(e.openBlock(),e.createBlock(B,e.mergeProps({key:3,modelValue:o.queryParams[t.prop],"onUpdate:modelValue":n=>o.queryParams[t.prop]=n,size:l.size},o.datePackerSetting,{"start-placeholder":t["start-placeholder"]||o.datePackerSetting["start-placeholder"],"end-placeholder":t["end-placeholder"]||o.datePackerSetting["end-placeholder"],"value-format":t["value-format"]}),null,16,["modelValue","onUpdate:modelValue","size","start-placeholder","end-placeholder","value-format"])):e.createCommentVNode("",!0),t.type==="input-number"?(e.openBlock(),e.createBlock(V,e.mergeProps({key:4,modelValue:o.queryParams[t.prop],"onUpdate:modelValue":n=>o.queryParams[t.prop]=n,size:l.size},o.inputSetting,{min:t.min,max:t.max,"controls-position":t["controls-position"],"step-strictly":t["step-strictly"]}),null,16,["modelValue","onUpdate:modelValue","size","min","max","controls-position","step-strictly"])):e.createCommentVNode("",!0)]),_:2},1032,["label","prop","rules"]))),128)),e.renderSlot(r.$slots,"default",{},void 0,!0),l.formOnly?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0},{default:e.withCtx(()=>[e.createVNode(d,{type:"primary",icon:"el-icon-search",size:l.size,onClick:c.handleQuery},{default:e.withCtx(()=>[e.createTextVNode("查询")]),_:1},8,["size","onClick"]),e.createVNode(d,{icon:"el-icon-refresh",size:l.size,onClick:c.resetQuery},{default:e.withCtx(()=>[e.createTextVNode("重置")]),_:1},8,["size","onClick"])]),_:1}))]),_:3},16,["model","label-width"])),[[e.vShow,l.showSearch]])}const f=u(h,[["render",y],["__scopeId","data-v-279f95d9"]]);s.VGeneralBasicForm=f,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})});
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .el-form-item[data-v-279f95d9]{margin-bottom:2px!important}
package/package.json CHANGED
@@ -1,32 +1,48 @@
1
- {
2
- "name": "general-basic-form",
3
- "version": "1.0.25",
4
- "description": "",
5
- "main": "./src/index.js",
6
- "scripts": {
7
- "serve": "webpack-dev-server --config config/webpack.dev.js",
8
- "build": "webpack --config config/webpack.prod.js",
9
- "test": "echo \"Error: no test specified\" && exit 1"
10
- },
11
- "keywords": [
12
- "general-basic-form",
13
- "form",
14
- "vue",
15
- "vue2",
16
- "vue3",
17
- "element-plus",
18
- "element-plus"
19
- ],
20
- "author": "chendeli419287484@qq.com",
21
- "license": "ISC",
22
- "repository": {
23
- "type": "git",
24
- "url": "https://github.com/Alan1034/GeneralBasicForm"
25
- },
26
- "devDependencies": {
27
- "babel-eslint": "^10.1.0",
28
- "eslint": "^7.32.0",
29
- "eslint-plugin-vue": "^7.14.0"
30
- },
31
- "dependencies": {}
32
- }
1
+ {
2
+ "name": "general-basic-form",
3
+ "version": "2.0.0",
4
+ "description": "",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "main": "./dist/index.umd.js",
9
+ "module": "./dist/index.mjs",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.umd.js"
14
+ }
15
+ },
16
+ "types": "./dist/index.d.ts",
17
+ "scripts": {
18
+ "build": "cross-env CURRENT_ENV=prod run-p type-check build-only",
19
+ "test:e2e": "playwright test",
20
+ "build-only": "vite build",
21
+ "type-check": "tsc --noEmit -p tsconfig.json --composite false"
22
+ },
23
+ "keywords": [
24
+ "general-basic-form",
25
+ "form",
26
+ "vue",
27
+ "vue2",
28
+ "vue3",
29
+ "element-plus"
30
+ ],
31
+ "author": "chendeli419287484@qq.com",
32
+ "license": "ISC",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/Alan1034/GeneralBasicForm"
36
+ },
37
+ "devDependencies": {
38
+ "@playwright/test": "^1.36.1",
39
+ "@types/node": "^20.8.10",
40
+ "@vitejs/plugin-legacy": "^4.1.1",
41
+ "@vitejs/plugin-vue": "^4.2.3",
42
+ "@vitejs/plugin-vue-jsx": "^3.0.1",
43
+ "cross-env": "^7.0.3",
44
+ "npm-run-all": "^4.1.5",
45
+ "typescript": "^5.2.2",
46
+ "vite-plugin-image-optimizer": "^1.1.6"
47
+ }
48
+ }
@@ -1,98 +0,0 @@
1
- const path = require("path");
2
- const webpack = require("webpack");
3
- const { VueLoaderPlugin } = require('vue-loader')
4
-
5
- module.exports = {
6
- entry: "./src/index.js",
7
- module: {
8
- rules: [
9
- {
10
- test: /\.js$/,
11
- exclude: file => (
12
- /node_modules/.test(file) &&
13
- !/\.vue\.js/.test(file)
14
- ),
15
- use: [
16
- // "thread-loader",// 多线程编译,可能会导致报错
17
- {
18
- loader: 'babel-loader',
19
- options: {
20
- presets: ['@babel/preset-env']
21
- }
22
- }
23
- ],
24
- },
25
-
26
- {
27
- test: /\.css$/,
28
- use: ['vue-style-loader', 'css-loader']
29
- },
30
- {
31
- test: /\.less$/,
32
- use: ['vue-style-loader', 'css-loader', 'less-loader']
33
- },
34
- {
35
- test: /\.scss$/,
36
- use: [
37
- 'vue-style-loader',
38
- 'css-loader',
39
- 'sass-loader'
40
- ]
41
- },
42
- {
43
- test: /\.(eot|svg|ttf|woff|woff2)$/,
44
- use: {
45
- loader: 'file-loader',
46
- options: {
47
- outputPath: 'fonts/',
48
- esModule: false
49
- }
50
- }
51
- },
52
- {
53
- test: /\.(png|jpg|gif)$/,
54
- use: {
55
- loader: 'file-loader',
56
- options: {
57
- outputPath: 'assets/',
58
- esModule: false
59
- }
60
- }
61
- },
62
- {
63
- test: /\.vue$/,
64
- loader: 'vue-loader',
65
- options: {
66
- use: [
67
- // "thread-loader",// 多线程编译,可能会导致报错
68
- {
69
- loader: 'babel-loader',
70
- options: {
71
- presets: ['@babel/preset-env']
72
- }
73
- }
74
- ],
75
- }
76
- },
77
- ]
78
- },
79
- resolve: {
80
- extensions: ['\*', '.js', '.jsx', '.vue'],// 能够使用户在引入模块时不带扩展
81
- alias: {
82
- "@": path.resolve(__dirname, '../src'),
83
- },
84
- },
85
- output: {
86
- path: path.resolve(__dirname, "../dist/"),
87
- publicPath: "/",
88
- filename: "bundle.js"
89
- },
90
- //why:https://github.com/vuejs/vue-next/tree/master/packages/vue#bundler-build-feature-flags
91
- plugins: [
92
- new webpack.HotModuleReplacementPlugin(),
93
- new VueLoaderPlugin(),
94
- new webpack.DefinePlugin({
95
- "__VUE_OPTIONS_API__": true,
96
- "__VUE_PROD_DEVTOOLS__": false,
97
- })]
98
- };
@@ -1,15 +0,0 @@
1
- const path = require("path");
2
- const { merge } = require('webpack-merge');
3
- const common = require('./webpack.common.js');
4
-
5
- module.exports = merge(common, {
6
- mode: 'development',
7
- devtool: 'inline-source-map',
8
- devServer: {
9
- contentBase: path.join(__dirname, "dist"),
10
- port: 3000,
11
- hot: true,
12
- open: true, //自动打开浏览器
13
- // host: '0.0.0.0',//开启项目本地服务
14
- },
15
- });
@@ -1,16 +0,0 @@
1
- const { merge } = require('webpack-merge');
2
- const common = require('./webpack.common.js');
3
- const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
4
- const { CleanWebpackPlugin } = require('clean-webpack-plugin');
5
-
6
- module.exports = merge(common, {
7
- mode: 'production',
8
- plugins: [
9
- new UglifyJsPlugin({
10
- uglifyOptions: {
11
- comments: "some", //去掉部分注释
12
- }
13
- }),
14
- new CleanWebpackPlugin(),// 构筑前清理dist文件夹
15
- ]
16
- });
@@ -1,252 +0,0 @@
1
- <!--
2
- * @Author: 陈德立*******419287484@qq.com
3
- * @Date: 2021-08-20 17:14:53
4
- * @LastEditTime: 2021-11-23 17:49:55
5
- * @LastEditors: 陈德立*******419287484@qq.com
6
- * @Github: https://github.com/Alan1034
7
- * @Description:
8
- * @FilePath: \GeneralBasicForm\src\GeneralBasicForm.vue
9
- *
10
- -->
11
- /** 通用基本表单。用在表单页面搜索栏 */
12
-
13
- <template>
14
- <el-form
15
- :model="queryParams"
16
- ref="queryFormRef"
17
- v-show="showSearch"
18
- inline
19
- label-position="left"
20
- :label-width="labelWidth"
21
- v-bind="$attrs"
22
- >
23
- <el-form-item
24
- v-for="item in formItem"
25
- :label="item.label"
26
- :prop="item.prop"
27
- :key="item.prop"
28
- :rules="item.rules"
29
- >
30
- <el-input
31
- v-if="item.type === 'input'"
32
- @keydown.enter="getList"
33
- v-model="queryParams[item.prop]"
34
- :size="size"
35
- v-bind="inputSetting"
36
- :placeholder="item.placeholder || inputSetting.placeholder"
37
- :maxlength="item.maxlength"
38
- >
39
- <template v-for="(templateEle, name) in item.template" #[name]>
40
- <component
41
- :key="name"
42
- v-if="templateEle"
43
- :is="currentInputComponent()"
44
- :templateEle="templateEle"
45
- />
46
- </template>
47
- </el-input>
48
- <el-select
49
- filterable
50
- v-else-if="item.type === 'select'"
51
- v-model="queryParams[item.prop]"
52
- :size="size"
53
- v-bind="selectSetting"
54
- :multiple="item.multiple"
55
- :placeholder="item.placeholder || selectSetting.placeholder"
56
- >
57
- <el-option
58
- v-for="dict in item.option || []"
59
- :key="dict.value"
60
- :label="dict.desc"
61
- :value="dict.value"
62
- />
63
- </el-select>
64
- <el-cascader
65
- filterable
66
- v-else-if="item.type === 'cascader'"
67
- v-model="queryParams[item.prop]"
68
- :size="size"
69
- v-bind="selectSetting"
70
- :options="item.options || []"
71
- :placeholder="item.placeholder || selectSetting.placeholder"
72
- ></el-cascader>
73
- <el-date-picker
74
- v-else-if="item.type === 'date-picker'"
75
- v-model="queryParams[item.prop]"
76
- :size="size"
77
- v-bind="datePackerSetting"
78
- :start-placeholder="
79
- item['start-placeholder'] || datePackerSetting['start-placeholder']
80
- "
81
- :end-placeholder="
82
- item['end-placeholder'] || datePackerSetting['end-placeholder']
83
- "
84
- :value-format="item['value-format']"
85
- ></el-date-picker>
86
- <el-input-number
87
- v-if="item.type === 'input-number'"
88
- v-model="queryParams[item.prop]"
89
- :size="size"
90
- v-bind="inputSetting"
91
- :min="item.min"
92
- :max="item.max"
93
- :controls-position="item['controls-position']"
94
- :step-strictly="item['step-strictly']"
95
- />
96
- </el-form-item>
97
- <slot></slot>
98
- <el-form-item v-if="!formOnly">
99
- <el-button
100
- type="primary"
101
- icon="el-icon-search"
102
- :size="size"
103
- @click="handleQuery"
104
- >查询</el-button
105
- >
106
- <el-button icon="el-icon-refresh" :size="size" @click="resetQuery"
107
- >重置</el-button
108
- >
109
- </el-form-item>
110
- </el-form>
111
- </template>
112
-
113
- <script>
114
- export default {
115
- name: "GeneralBasicForm",
116
- components: {
117
- InputArchive: (props) => {
118
- const { templateEle } = props;
119
- return templateEle();
120
- },
121
- },
122
- props: {
123
- showSearch: {
124
- // 是否展示所有元素
125
- type: Boolean,
126
- default: true,
127
- },
128
- formOnly: {
129
- // 是否只展示表单不展示按钮
130
- type: Boolean,
131
- default: false,
132
- },
133
- getList: {
134
- // 查找数据调用的函数
135
- type: Function,
136
- default: () => {},
137
- },
138
- formItem: {
139
- // 定义表单的数据
140
- type: Array,
141
- default: [],
142
- },
143
- size: {
144
- // 控制按钮大小
145
- type: String,
146
- default: "medium",
147
- },
148
- labelWidth: {
149
- // 表单文字宽度
150
- type: String,
151
- default: "90px",
152
- },
153
- noUrlParameters: {
154
- // 不接受和不改变url的参数
155
- type: Boolean,
156
- default: () => false,
157
- },
158
- formData: {
159
- // 外部传入的表单数据,用于回填
160
- type: Object,
161
- default: () => {},
162
- },
163
- },
164
- data() {
165
- return {
166
- queryParams: {
167
- ...(this.noUrlParameters ? {} : this.$route?.query),
168
- }, // form表单数据
169
- selectSetting: {
170
- placeholder: "请选择",
171
- clearable: true,
172
- style: "width: 200px",
173
- },
174
- inputSetting: {
175
- placeholder: "请输入",
176
- style: "width: 200px",
177
- clearable: true,
178
- },
179
- datePackerSetting: {
180
- style: "width: 227px",
181
- "start-placeholder": "开始日期",
182
- "end-placeholder": "结束日期",
183
- type: "daterange",
184
- },
185
- };
186
- },
187
- // setup(props) {
188
- //设置默认值
189
- // console.log(props);
190
- // // const { formItem } = toRefs(props);
191
- // const { formItem } = props;
192
- // console.log(formItem);
193
- // const queryParams = {};
194
- // formItem.forEach((item) => {
195
- // queryParams[item.prop] = "";
196
- // });
197
- // return {
198
- // queryParams,
199
- // };
200
- // },
201
- watch: {
202
- formData(val) {
203
- this.queryParams = {
204
- ...(this.noUrlParameters ? {} : this.queryParams),
205
- ...val,
206
- };
207
- },
208
- },
209
- methods: {
210
- /** 搜索按钮操作 */
211
- handleQuery() {
212
- const params = { page: 1, limit: 10 };
213
- const searchParams = {
214
- ...this.$route?.query,
215
- ...this.queryParams,
216
- ...params,
217
- };
218
- if (!this.noUrlParameters) {
219
- this.$router.push({
220
- query: { ...searchParams },
221
- });
222
- }
223
- this.getList({
224
- ...searchParams,
225
- });
226
- },
227
- /** 重置按钮操作 */
228
- async resetQuery() {
229
- this.$refs.queryFormRef.resetFields();
230
- const params = { page: 1 };
231
- if (!this.noUrlParameters) {
232
- await this.$router.push({
233
- query: { ...params },
234
- });
235
- }
236
- this.queryParams = {
237
- ...(this.noUrlParameters ? {} : this.$route?.query),
238
- };
239
- this.handleQuery();
240
- },
241
- currentInputComponent() {
242
- return "input-archive";
243
- },
244
- },
245
- };
246
- </script>
247
-
248
- <style scoped>
249
- .el-form-item {
250
- margin-bottom: 2px !important;
251
- }
252
- </style>
Binary file
package/src/index.js DELETED
@@ -1,12 +0,0 @@
1
- /*
2
- * @Author: 陈德立*******419287484@qq.com
3
- * @Date: 2021-08-20 17:05:30
4
- * @LastEditTime: 2021-08-20 17:15:27
5
- * @LastEditors: 陈德立*******419287484@qq.com
6
- * @Github: https://github.com/Alan1034
7
- * @Description:
8
- * @FilePath: \GeneralBasicForm\src\index.js
9
- *
10
- */
11
- import GeneralBasicForm from './GeneralBasicForm.vue';
12
- export default GeneralBasicForm