general-basic-form 2.0.0 → 2.0.2

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,6 +1,6 @@
1
1
  # GeneralBasicForm
2
2
 
3
- 一个兼容 Vue2Vue3 的表单组件 <br/>
3
+ 一个兼容 Vue3React(未来实现) 的表单组件 <br/>
4
4
 
5
5
  示例:
6
6
 
@@ -45,10 +45,11 @@ import GeneralBasicForm from 'general-basic-form'
45
45
  />
46
46
 
47
47
  <style lang="scss" scoped>
48
- :deep {
49
- .el-form-item {
50
- margin-bottom: 22px;
51
- }
48
+ :deep(.el-form-item) {
49
+ margin-bottom: 16px;
50
+ }
51
+ :deep(.el-divider--horizontal) {
52
+ margin: 8px 0px;
52
53
  }
53
54
  </style>
54
55
 
@@ -63,14 +64,29 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
63
64
 
64
65
  表单数据校验需要拿到内部表单的ref
65
66
 
66
- this.$refs["generalBasicForm"].$refs["queryFormRef"]
67
- .validate(
68
- async (valid) => {
69
- if (valid) {
70
- console.log(this.$refs["generalBasicForm"]["queryParams"]);
67
+ async getSmscode() {
68
+ const VGeneralBasicFormRef = this.$refs['VGeneralBasicFormRef'] as any
69
+ const state = await new Promise<boolean>((resolve, reject) => {
70
+ VGeneralBasicFormRef.$refs['queryFormRef']?.validateField(
71
+ 'user_phone',
72
+ async (valid: FormValidateCallback | undefined) => {
73
+ if (valid) {
74
+ const { user_phone } = VGeneralBasicFormRef['queryParams']
75
+ const res: any = await SmscodeList({ user_phone })
76
+ if (res) {
77
+ console.log(res)
78
+ resolve(true)
79
+ } else {
80
+ resolve(false)
81
+ }
82
+ } else {
83
+ resolve(false)
84
+ }
71
85
  }
72
- }
73
- );
86
+ )
87
+ })
88
+ return state
89
+ },
74
90
 
75
91
 
76
92
  ![image-20211014191532067](https://raw.githubusercontent.com/Alan1034/PicturesServer/main/PicGo_imgs/202110141915657.png)
@@ -83,10 +99,25 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
83
99
  formOnly:true // 只展示表单不展示按钮
84
100
  noUrlParameters:true // 不接受和不改变url的参数
85
101
  formItem: [
102
+ {
103
+ label: '',
104
+ prop: 'bsName35',
105
+ type: 'divider',
106
+ dividerSetting: {
107
+ },
108
+ template: {
109
+ default: () => {
110
+ return "123123123";
111
+ },
112
+ },
113
+ },
86
114
  { label: "款式名称",
87
115
  prop: "bsName",
88
116
  type: "input",
89
- placeholder: "请输入图片名称/分类名称/图片标签",
117
+ inputSetting: {
118
+ placeholder: '请输入手机验证码',
119
+ style: 'width: 100%'
120
+ },
90
121
  rules: [
91
122
  {
92
123
  message: "请输入信息"
@@ -101,7 +132,7 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
101
132
  return <svg-icon icon-class="baifenbi" />;
102
133
  },
103
134
  },
104
- maxlength: "3000"},
135
+ },
105
136
  {
106
137
  label: "二次工艺",
107
138
  prop: "spName",
@@ -133,6 +164,40 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
133
164
  },
134
165
  ],
135
166
  },
167
+ {
168
+ label: '',
169
+ prop: 'bsName2',
170
+ type: 'input-graphic-verification',
171
+ inputSetting: {
172
+ placeholder: '请输入图形验证码',
173
+ style: 'width: 100%'
174
+ },
175
+ rules: [
176
+ {
177
+ message: '请输入图形验证码',
178
+ trigger: 'blur'
179
+ }
180
+ ],
181
+ graphicSrc, // 请求图像的URL
182
+ getGraphic, // 重新请求图像的函数
183
+ key:Math.random(), // 必传,图像更新后必须更新。如果URL会变化也可以用URL代替
184
+ },
185
+ {
186
+ label: '',
187
+ prop: 'bsName3',
188
+ type: 'input-mobile-verification',
189
+ inputSetting: {
190
+ placeholder: '请输入手机验证码',
191
+ style: 'width: 100%'
192
+ },
193
+ rules: [
194
+ {
195
+ message: '请输入手机验证码',
196
+ trigger: 'blur'
197
+ }
198
+ ]
199
+ getSmscode,// 获取验证码的回调函数,获取失败必须返回false,否则计时器不会重新计算
200
+ },
136
201
  {
137
202
  label: "分类",
138
203
  prop: "分类",
@@ -201,9 +266,6 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
201
266
  ],
202
267
  },
203
268
  ],
204
- //分别支持input输入框,select单选框,date-picker日期选择器,cascader层级选择器 四种组件
205
-
206
- //date-picker可以传入'start-placeholder'和'end-placeholder',其他组件支持placeholder传入
207
269
 
208
270
  //rules为表单校验规则,每个组件都可以传入
209
271
 
@@ -212,5 +274,74 @@ getList会传出默认的参数,首次请求时会有页数和分页大小,重
212
274
  //suffix 输入框尾部内容,只对 type="text" 有效
213
275
  //prepend 输入框前置内容,只对 type="text" 有效
214
276
  //append 输入框后置内容,只对 type="text" 有效
277
+
278
+ //divider支持template:
279
+ //default
280
+ 支持组件:
281
+
282
+ /**
283
+
284
+ \* @description: 输入框
285
+
286
+ */
287
+
288
+ 'input' = 'input',
289
+
290
+ /**
291
+
292
+ \* @description: 输入框/图像验证码
293
+
294
+ */
295
+
296
+ 'input-graphic-verification' = 'input-graphic-verification',
297
+
298
+ /**
299
+
300
+ \* @description: 输入框/手机验证码
301
+
302
+ */
303
+
304
+ 'input-mobile-verification' = 'input-mobile-verification',
305
+
306
+ /**
307
+
308
+ \* @description: 分割线
309
+
310
+ */
311
+
312
+ 'divider' = 'divider',
313
+
314
+ /**
315
+
316
+ \* @description: 选择器
317
+
318
+ */
319
+
320
+ 'select' = 'select',
321
+
322
+ /**
323
+
324
+ \* @description: 级联选择器
325
+
326
+ */
327
+
328
+ 'cascader' = 'cascader',
329
+
330
+ /**
331
+
332
+ \* @description: 日期选择器
333
+
334
+ */
335
+
336
+ 'date-picker' = 'date-picker',
337
+
338
+ /**
339
+
340
+ \* @description: 数字输入框
341
+
342
+ */
343
+
344
+ 'input-number' = 'input-number',
345
+
215
346
  安装:npm i general-basic-form<br/>
216
- install: npm i general-basic-form
347
+ install: npm i general-basic-form
package/package.json CHANGED
@@ -1,48 +1,46 @@
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
+ {
2
+ "name": "general-basic-form",
3
+ "version": "2.0.2",
4
+ "description": "",
5
+ "main": "./src/index.ts",
6
+ "scripts": {
7
+ "build": "cross-env CURRENT_ENV=prod run-p type-check build-only",
8
+ "test:e2e": "playwright test",
9
+ "build-only": "vite build",
10
+ "type-check": "tsc --noEmit -p tsconfig.json --composite false",
11
+ "link": "tsx script/link.ts && yarn link",
12
+ "unlink": "tsx script/unlink.ts && yarn unlink"
13
+ },
14
+ "keywords": [
15
+ "general-basic-form",
16
+ "form",
17
+ "vue",
18
+ "vue2",
19
+ "vue3",
20
+ "element-plus"
21
+ ],
22
+ "author": "chendeli419287484@qq.com",
23
+ "license": "ISC",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/Alan1034/GeneralBasicForm.git"
27
+ },
28
+ "devDependencies": {
29
+ "@playwright/test": "^1.36.1",
30
+ "@types/node": "^20.8.10",
31
+ "@vitejs/plugin-legacy": "^4.1.1",
32
+ "@vitejs/plugin-vue": "^4.2.3",
33
+ "@vitejs/plugin-vue-jsx": "^3.0.1",
34
+ "cross-env": "^7.0.3",
35
+ "chalk": "^2.4.2",
36
+ "npm-run-all": "^4.1.5",
37
+ "tsx": "^4.0.0",
38
+ "typescript": "^5.2.2",
39
+ "vite-plugin-image-optimizer": "^1.1.6"
40
+ },
41
+ "peerDependencies": {
42
+ "element-plus": ">=2.4.2",
43
+ "vue": ">=3.3.4",
44
+ "vue-router": ">=4.2.4"
45
+ }
46
+ }
package/script/link.ts ADDED
@@ -0,0 +1,34 @@
1
+ /*
2
+ * @Author: 陈德立*******419287484@qq.com
3
+ * @Date: 2023-11-10 09:39:59
4
+ * @LastEditTime: 2023-11-10 10:26:53
5
+ * @LastEditors: 陈德立*******419287484@qq.com
6
+ * @Github: https://github.com/Alan1034
7
+ * @Description: link处理流程
8
+ * @FilePath: \GeneralBasicForm\script\link.ts
9
+ *
10
+ */
11
+ import path from "path";
12
+ import fs from 'fs'
13
+ import chalk from 'chalk'
14
+
15
+ const updateMain = () => {
16
+ try {
17
+ const packageTxt = fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8');
18
+ const packageJson = JSON.parse(packageTxt);
19
+ const mainDir = "./src/index.ts"
20
+ delete packageJson.files
21
+ delete packageJson.module
22
+ delete packageJson.exports
23
+ delete packageJson.types
24
+ packageJson.main = mainDir
25
+ const versionData = JSON.stringify(packageJson, null, 2);
26
+ fs.writeFileSync(path.join(__dirname, '../package.json'), versionData, 'utf8');
27
+ console.log(chalk.green.bold('修改入口配置成功!当前入口路径为为:' + mainDir));
28
+ } catch (error) {
29
+ console.log(chalk.red.bold('修改入口配置出错:', error.toString()));
30
+ }
31
+
32
+ }
33
+
34
+ updateMain()
@@ -0,0 +1,42 @@
1
+ /*
2
+ * @Author: 陈德立*******419287484@qq.com
3
+ * @Date: 2023-11-10 09:39:59
4
+ * @LastEditTime: 2023-11-10 10:29:27
5
+ * @LastEditors: 陈德立*******419287484@qq.com
6
+ * @Github: https://github.com/Alan1034
7
+ * @Description: unlink处理流程
8
+ * @FilePath: \GeneralBasicForm\script\unlink.ts
9
+ *
10
+ */
11
+ import path from "path";
12
+ import fs from 'fs'
13
+ import chalk from 'chalk'
14
+
15
+ const updateMain = () => {
16
+ try {
17
+ const packageTxt = fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8');
18
+ const packageJson = JSON.parse(packageTxt);
19
+ const umdDir = "./dist/index.umd.js"
20
+ const esDir = "./dist/index.mjs"
21
+ packageJson.main = umdDir
22
+ packageJson.module = esDir
23
+ packageJson.exports = {
24
+ ".": {
25
+ "import": esDir,
26
+ "require": umdDir
27
+ }
28
+ }
29
+ packageJson.typings = "./dist/index.d.ts"
30
+ packageJson.files = [
31
+ "/dist"
32
+ ]
33
+ const versionData = JSON.stringify(packageJson, null, 2);
34
+ fs.writeFileSync(path.join(__dirname, '../package.json'), versionData, 'utf8');
35
+ console.log(chalk.green.bold('修改入口配置成功!当前入口路径为为:' + umdDir));
36
+ } catch (error) {
37
+ console.log(chalk.red.bold('修改入口配置出错:', error.toString()));
38
+ }
39
+
40
+ }
41
+
42
+ updateMain()
@@ -0,0 +1,234 @@
1
+ <!--
2
+ * @Author: 陈德立*******419287484@qq.com
3
+ * @Date: 2021-08-20 17:14:53
4
+ * @LastEditTime: 2023-11-14 15:18:20
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
+ <Input v-if="item.type === 'input'" :item="item" />
31
+ <InputGraphicVerification
32
+ v-if="item.type === 'input-graphic-verification'"
33
+ :item="item"
34
+ :key="item.key"
35
+ />
36
+ <InputMobileVerification
37
+ v-if="item.type === 'input-mobile-verification'"
38
+ :item="item"
39
+ />
40
+ <Divider v-if="item.type === 'divider'" :item="item" />
41
+ <el-select
42
+ filterable
43
+ v-else-if="item.type === 'select'"
44
+ v-model="queryParams[item.prop]"
45
+ :size="size"
46
+ v-bind="item.selectSetting || selectSetting"
47
+ >
48
+ <el-option
49
+ v-for="dict in item.option || []"
50
+ :key="dict.value"
51
+ :label="dict.desc"
52
+ :value="dict.value"
53
+ />
54
+ </el-select>
55
+ <el-cascader
56
+ filterable
57
+ v-else-if="item.type === 'cascader'"
58
+ v-model="queryParams[item.prop]"
59
+ :size="size"
60
+ :options="item.options || []"
61
+ v-bind="item.selectSetting || selectSetting"
62
+ ></el-cascader>
63
+ <el-date-picker
64
+ v-else-if="item.type === 'date-picker'"
65
+ v-model="queryParams[item.prop]"
66
+ :size="size"
67
+ v-bind="item.datePackerSetting || datePackerSetting"
68
+ ></el-date-picker>
69
+ <InputNumber v-if="item.type === 'input-number'" :item="item" />
70
+ </el-form-item>
71
+ <slot></slot>
72
+ <el-form-item v-if="!formOnly">
73
+ <el-button
74
+ type="primary"
75
+ icon="el-icon-search"
76
+ :size="size"
77
+ @click="handleQuery"
78
+ >查询</el-button
79
+ >
80
+ <el-button icon="el-icon-refresh" :size="size" @click="resetQuery"
81
+ >重置</el-button
82
+ >
83
+ </el-form-item>
84
+ </el-form>
85
+ </template>
86
+
87
+ <script lang="ts">
88
+ import { provide, ref, PropType, defineComponent } from "vue";
89
+ import type { ItemType } from "./types/basicFrom";
90
+ import { useRoute } from "vue-router";
91
+ import Input from "./components/VBasic/input";
92
+ import InputNumber from "./components/VBasic/input-number";
93
+ import InputGraphicVerification from "./components/VBasic/input-graphic-verification";
94
+ import InputMobileVerification from "./components/VBasic/input-mobile-verification";
95
+ import Divider from "./components/VBasic/divider";
96
+
97
+ export default defineComponent({
98
+ name: "GeneralBasicForm",
99
+ components: {
100
+ Input,
101
+ InputNumber,
102
+ InputGraphicVerification,
103
+ InputMobileVerification,
104
+ Divider,
105
+ },
106
+ props: {
107
+ showSearch: {
108
+ // 是否展示所有元素
109
+ type: Boolean,
110
+ default: true,
111
+ },
112
+ formOnly: {
113
+ // 是否只展示表单不展示按钮
114
+ type: Boolean,
115
+ default: false,
116
+ },
117
+ getList: {
118
+ // 查找数据调用的函数
119
+ type: Function,
120
+ default: () => {},
121
+ },
122
+ afterReset: {
123
+ // 在重置按钮点击完后但还没重新请求时触发的的函数
124
+ type: Function,
125
+ default: () => {},
126
+ },
127
+ formItem: {
128
+ // 定义表单的数据
129
+ type: Array as unknown as PropType<ItemType[]>,
130
+ default: [],
131
+ },
132
+ size: {
133
+ // 控制按钮大小
134
+ type: String,
135
+ default: "medium",
136
+ },
137
+ labelWidth: {
138
+ // 表单文字宽度
139
+ type: String,
140
+ default: "90px",
141
+ },
142
+ noUrlParameters: {
143
+ // 不接受和不改变url的参数
144
+ type: Boolean,
145
+ default: () => false,
146
+ },
147
+ formData: {
148
+ // 外部传入的表单数据,用于回填
149
+ type: Object,
150
+ default: () => {},
151
+ },
152
+ },
153
+ data() {
154
+ return {
155
+ selectSetting: {
156
+ placeholder: "请选择",
157
+ clearable: true,
158
+ style: "width: 200px",
159
+ },
160
+ datePackerSetting: {
161
+ style: "width: 227px",
162
+ "start-placeholder": "开始日期",
163
+ "end-placeholder": "结束日期",
164
+ type: "daterange",
165
+ },
166
+ };
167
+ },
168
+ setup(props) {
169
+ const { size, noUrlParameters, getList } = props;
170
+ const route = useRoute();
171
+ const queryParams = ref({
172
+ ...(noUrlParameters ? {} : route?.query),
173
+ }); // form表单数据
174
+ provide(/* 注入名 */ "queryParams", /* 值 */ queryParams);
175
+ provide(/* 注入名 */ "size", /* 值 */ size);
176
+ provide(/* 注入名 */ "getList", /* 值 */ getList);
177
+ // const { formItem } = toRefs(props);
178
+ // const { formItem } = props;
179
+ // console.log(formItem);
180
+ // const queryParams = {};
181
+ // formItem.forEach((item) => {
182
+ // queryParams[item.prop] = "";
183
+ // });
184
+ return {
185
+ queryParams,
186
+ };
187
+ },
188
+ watch: {
189
+ formData(val) {
190
+ this.queryParams = {
191
+ ...(this.noUrlParameters ? {} : this.queryParams),
192
+ ...val,
193
+ };
194
+ },
195
+ },
196
+ methods: {
197
+ /** 搜索按钮操作 */
198
+ handleQuery() {
199
+ const params = { page: 1, limit: 10 };
200
+ const searchParams = {
201
+ ...this.$route?.query,
202
+ ...this.queryParams,
203
+ ...params,
204
+ };
205
+ if (!this.noUrlParameters) {
206
+ this.$router.push({
207
+ query: { ...searchParams },
208
+ });
209
+ }
210
+ this.getList({
211
+ ...searchParams,
212
+ });
213
+ },
214
+ /** 重置按钮操作 */
215
+ async resetQuery() {
216
+ this.$refs.queryFormRef.resetFields();
217
+ const params = { page: 1 };
218
+ if (!this.noUrlParameters) {
219
+ await this.$router.push({
220
+ query: { ...params },
221
+ });
222
+ }
223
+ this.queryParams = {
224
+ ...(this.noUrlParameters ? {} : this.$route?.query),
225
+ };
226
+ this.afterReset();
227
+ this.handleQuery();
228
+ },
229
+ },
230
+ });
231
+ </script>
232
+
233
+ <style scoped>
234
+ </style>
Binary file
@@ -0,0 +1,52 @@
1
+ <!--
2
+ * @Author: 陈德立*******419287484@qq.com
3
+ * @Date: 2023-11-09 10:01:20
4
+ * @LastEditTime: 2023-11-10 16:51:18
5
+ * @LastEditors: 陈德立*******419287484@qq.com
6
+ * @Github: https://github.com/Alan1034
7
+ * @Description: 分割线
8
+ * @FilePath: \deal-front-endd:\work\GeneralBasicForm\src\components\VBasic\divider\index.vue
9
+ *
10
+ -->
11
+
12
+ <template>
13
+ <el-divider v-bind="dividerSetting">
14
+ <template v-for="(templateEle, name) in item.template" #[name]>
15
+ <component
16
+ :key="name"
17
+ v-if="templateEle"
18
+ :is="currentInputComponent()"
19
+ :templateEle="templateEle"
20
+ />
21
+ </template>
22
+ </el-divider>
23
+ </template>
24
+
25
+ <script lang="ts">
26
+ import { defineComponent } from "vue";
27
+
28
+ export default defineComponent({
29
+ components: {
30
+ slotArchive: (props) => {
31
+ const { templateEle } = props;
32
+ return templateEle();
33
+ },
34
+ },
35
+ props: {
36
+ item: null, // null就是any
37
+ },
38
+ setup() {},
39
+ data() {
40
+ return {
41
+ dividerSetting: {
42
+ ...this.item.dividerSetting,
43
+ },
44
+ };
45
+ },
46
+ methods: {
47
+ currentInputComponent() {
48
+ return "slot-archive";
49
+ },
50
+ },
51
+ });
52
+ </script>