|
@@ -0,0 +1,268 @@
|
|
|
+
|
|
|
+
|
|
|
+# 任务:TaskUserForm
|
|
|
+使用示例
|
|
|
+您可以像下面这样使用 TaskUserForm 类:
|
|
|
+
|
|
|
+```ts
|
|
|
+import { TaskUserForm } from './task-user-form.ts'; // 假设TaskUserForm在同一目录下
|
|
|
+
|
|
|
+async function collectUserInfo(modalCtrl: any) {
|
|
|
+ const fieldList = [
|
|
|
+ { type: "String", key: "name", name: "姓名", required: true },
|
|
|
+ { type: "String", key: "mobile", name: "手机", required: true },
|
|
|
+ { type: "Radio", key: "gender", name: "性别", required: false, options: [
|
|
|
+ { label: "男", value: "male" },
|
|
|
+ { label: "女", value: "female" }
|
|
|
+ ]}
|
|
|
+ ];
|
|
|
+
|
|
|
+ const task = new TaskUserForm({
|
|
|
+ title: '用户信息采集',
|
|
|
+ modalCtrl: modalCtrl,
|
|
|
+ fieldList: fieldList,
|
|
|
+ initialData: {}, // 可以传入初始数据
|
|
|
+ });
|
|
|
+
|
|
|
+ try {
|
|
|
+ await task.execute();
|
|
|
+ console.log('采集结果:', task.output);
|
|
|
+ return task.output;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('表单采集出错:', error);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+说明
|
|
|
+构造函数: TaskUserForm 接受 modalCtrl 和 fieldList,并初始化输入输出校验规则。
|
|
|
+handle 方法: 在执行时调用 getUserForm 函数进行表单采集,并将结果保存到 data 中。
|
|
|
+类型映射: mapFieldType 方法将用户定义的字段类型映射为 FieldType 类型,以便进行校验。
|
|
|
+这样,您就可以使用 TaskUserForm 类来进行用户信息的表单采集任务,且具备完整的输入输出校验机制。
|
|
|
+
|
|
|
+
|
|
|
+# 组件:用户表单采集
|
|
|
+
|
|
|
+# 函数形式使用
|
|
|
+``` typescript
|
|
|
+import { getUserForm } from '../lib/tasks/task-user-form/get-user-form';
|
|
|
+
|
|
|
+async function collectUserInfo(modalCtrl: any) {
|
|
|
+ const fieldList = [
|
|
|
+ { type: "String", key: "name", name: "姓名", required: true },
|
|
|
+ { type: "String", key: "mobile", name: "手机", required: true },
|
|
|
+ { type: "Radio", key: "gender", name: "性别", required: false, options: [
|
|
|
+ { label: "男", value: "male" },
|
|
|
+ { label: "女", value: "female" }
|
|
|
+ ]}
|
|
|
+ ];
|
|
|
+
|
|
|
+ try {
|
|
|
+ const result = await getUserForm({ modalCtrl, fieldList });
|
|
|
+ console.log('Collected data:', result);
|
|
|
+ return result;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Form error:', error);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+# 细节用法说明
|
|
|
+以下是基于 `getUserForm` 函数的完整使用示例和所有支持的字段类型说明:
|
|
|
+
|
|
|
+### 1. 使用示例
|
|
|
+
|
|
|
+```typescript
|
|
|
+import { getUserForm } from '../lib/tasks/task-user-form/get-user-form';
|
|
|
+
|
|
|
+
|
|
|
+async function collectUserInfo(modalCtrl: any) {
|
|
|
+ // 定义表单字段配置
|
|
|
+ const fieldList = [
|
|
|
+ // 文本输入
|
|
|
+ {
|
|
|
+ type: "String",
|
|
|
+ key: "name",
|
|
|
+ name: "姓名",
|
|
|
+ required: true,
|
|
|
+ placeholder: "请输入真实姓名"
|
|
|
+ },
|
|
|
+
|
|
|
+ // 数字输入
|
|
|
+ {
|
|
|
+ type: "Number",
|
|
|
+ key: "age",
|
|
|
+ name: "年龄",
|
|
|
+ required: false,
|
|
|
+ min: 0,
|
|
|
+ max: 120
|
|
|
+ },
|
|
|
+
|
|
|
+ // 日期选择
|
|
|
+ {
|
|
|
+ type: "Date",
|
|
|
+ key: "birthday",
|
|
|
+ name: "出生日期",
|
|
|
+ required: true
|
|
|
+ },
|
|
|
+
|
|
|
+ // 单选按钮
|
|
|
+ {
|
|
|
+ type: "Radio",
|
|
|
+ key: "gender",
|
|
|
+ name: "性别",
|
|
|
+ required: true,
|
|
|
+ options: [
|
|
|
+ { label: "男", value: "male" },
|
|
|
+ { label: "女", value: "female" },
|
|
|
+ { label: "其他", value: "other" }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+
|
|
|
+ // 下拉选择
|
|
|
+ {
|
|
|
+ type: "Select",
|
|
|
+ key: "education",
|
|
|
+ name: "学历",
|
|
|
+ required: false,
|
|
|
+ options: [
|
|
|
+ { label: "高中", value: "high_school" },
|
|
|
+ { label: "大专", value: "college" },
|
|
|
+ { label: "本科", value: "bachelor" },
|
|
|
+ { label: "硕士", value: "master" },
|
|
|
+ { label: "博士", value: "phd" }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+
|
|
|
+ // 多选框
|
|
|
+ {
|
|
|
+ type: "Checkbox",
|
|
|
+ key: "hobbies",
|
|
|
+ name: "兴趣爱好",
|
|
|
+ required: false,
|
|
|
+ options: [
|
|
|
+ { label: "阅读", value: "reading" },
|
|
|
+ { label: "运动", value: "sports" },
|
|
|
+ { label: "音乐", value: "music" },
|
|
|
+ { label: "旅行", value: "travel" }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+
|
|
|
+ // 开关
|
|
|
+ {
|
|
|
+ type: "Boolean",
|
|
|
+ key: "subscribe",
|
|
|
+ name: "订阅通知",
|
|
|
+ required: false
|
|
|
+ },
|
|
|
+
|
|
|
+ // 多行文本
|
|
|
+ {
|
|
|
+ type: "Textarea",
|
|
|
+ key: "address",
|
|
|
+ name: "详细地址",
|
|
|
+ required: false,
|
|
|
+ placeholder: "请输入详细住址"
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 调用表单采集函数
|
|
|
+ const result = await getUserForm({
|
|
|
+ modalCtrl: modalCtrl, // 传入Ionic的ModalController实例
|
|
|
+ fieldList: fieldList
|
|
|
+ });
|
|
|
+
|
|
|
+ if (result) {
|
|
|
+ console.log('采集结果:', result);
|
|
|
+ // 结果示例:
|
|
|
+ // {
|
|
|
+ // name: "张三",
|
|
|
+ // age: 25,
|
|
|
+ // birthday: "1998-05-20",
|
|
|
+ // gender: "male",
|
|
|
+ // education: "bachelor",
|
|
|
+ // hobbies: ["reading", "sports"],
|
|
|
+ // subscribe: true,
|
|
|
+ // address: "北京市朝阳区..."
|
|
|
+ // }
|
|
|
+ return result;
|
|
|
+ } else {
|
|
|
+ console.log('用户取消了表单');
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('表单采集出错:', error);
|
|
|
+ throw error;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 所有支持的字段类型及写法
|
|
|
+
|
|
|
+| 类型 | 描述 | 必填属性 | 示例配置 |
|
|
|
+|------------|----------------------|----------------------|---------|
|
|
|
+| **String** | 文本输入 | `required`, `pattern`, `placeholder` | `{ type: "String", key: "name", name: "姓名", required: true, placeholder: "请输入姓名" }` |
|
|
|
+| **Number** | 数字输入 | `required`, `min`, `max` | `{ type: "Number", key: "age", name: "年龄", min: 0, max: 120 }` |
|
|
|
+| **Date** | 日期选择 | `required` | `{ type: "Date", key: "birthday", name: "出生日期", required: true }` |
|
|
|
+| **Radio** | 单选按钮组 | `required`, `options` | `{ type: "Radio", key: "gender", name: "性别", options: [{label:"男",value:"male"}] }` |
|
|
|
+| **Select** | 下拉选择 | `required`, `options` | `{ type: "Select", key: "city", name: "城市", options: [{label:"北京",value:"beijing"}] }` |
|
|
|
+| **Checkbox** | 多选框组 | `required`, `options` | `{ type: "Checkbox", key: "hobbies", name: "爱好", options: [{label:"游泳",value:"swimming"}] }` |
|
|
|
+| **Boolean** | 开关 | - | `{ type: "Boolean", key: "agree", name: "同意协议" }` |
|
|
|
+| **Textarea** | 多行文本 | `required`, `placeholder` | `{ type: "Textarea", key: "feedback", name: "意见反馈", placeholder: "请输入您的意见" }` |
|
|
|
+
|
|
|
+### 3. 特殊字段属性说明
|
|
|
+
|
|
|
+1. **options** (用于 Radio/Select/Checkbox):
|
|
|
+ ```typescript
|
|
|
+ options: [
|
|
|
+ { label: "显示文本", value: "实际值" },
|
|
|
+ { label: "男", value: "male" }
|
|
|
+ ]
|
|
|
+ ```
|
|
|
+
|
|
|
+2. **验证规则**:
|
|
|
+ - `required: true` - 必填字段
|
|
|
+ - `pattern: "正则表达式"` - 文本格式验证
|
|
|
+ - `min: 数值` - 最小值(用于Number类型)
|
|
|
+ - `max: 数值` - 最大值(用于Number类型)
|
|
|
+
|
|
|
+3. **日期字段**:
|
|
|
+ - 会自动格式化为 ISO 字符串格式 (如 "2023-05-20")
|
|
|
+ - 可通过 `max` 和 `min` 限制日期范围
|
|
|
+
|
|
|
+4. **多选字段(Checkbox)**:
|
|
|
+ - 返回值为数组,包含所有选中的值
|
|
|
+ - 如: `hobbies: ["reading", "music"]`
|
|
|
+
|
|
|
+### 4. 完整调用流程示例
|
|
|
+
|
|
|
+```typescript
|
|
|
+// 在Ionic页面组件中的调用示例
|
|
|
+import { Component } from '@angular/core';
|
|
|
+import { ModalController } from '@ionic/angular';
|
|
|
+
|
|
|
+@Component({
|
|
|
+ selector: 'app-user-info',
|
|
|
+ templateUrl: './user-info.page.html',
|
|
|
+})
|
|
|
+export class UserInfoPage {
|
|
|
+ constructor(private modalCtrl: ModalController) {}
|
|
|
+
|
|
|
+ async openForm() {
|
|
|
+ try {
|
|
|
+ const userData = await collectUserInfo(this.modalCtrl);
|
|
|
+ if (userData) {
|
|
|
+ // 处理采集到的数据
|
|
|
+ console.log('收到用户数据:', userData);
|
|
|
+ // 提交到服务器等操作...
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('表单错误:', error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+这个实现支持了常见的所有表单字段类型,并提供了完善的验证机制。您可以根据实际需求组合这些字段类型来构建复杂的表单。
|