从 xghmall(云闪付版湘工游)迁移民票模块,改造为微信公众号 H5: - 技术栈沿用 uni-app + Vue2 + uView(含定制版日历组件) - 登录/支付独立成层(common/auth.js、common/pay.js): 一期假登录(测试手机号)+ 模拟支付,后端微信接口就绪后只换这两处 - 登录页重写:短信验证码 + 公众号网页授权(code 换用户信息)预留 - 门票列表页为入口页(进页必须登录),加订单悬浮按钮 - 支付成功页接通:查看订单/继续逛逛 + 订单状态轮询 - 详情页定位导航改用 uni.openLocation + 高德网页兜底 - 出行人页:身份证 18 位格式校验,删除死的删除按钮,修正证件类型回显笔误 - 清理云闪付 SDK、支付宝授权、死页面引用等残留 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
135 lines
3.6 KiB
Vue
135 lines
3.6 KiB
Vue
<template>
|
|
<view class="u-form"><slot /></view>
|
|
</template>
|
|
|
|
<script>
|
|
/**
|
|
* form 表单
|
|
* @description 此组件一般用于表单场景,可以配置Input输入框,Select弹出框,进行表单验证等。
|
|
* @tutorial http://uviewui.com/components/form.html
|
|
* @property {Object} model 表单数据对象
|
|
* @property {Boolean} border-bottom 是否显示表单域的下划线边框
|
|
* @property {String} label-position 表单域提示文字的位置,left-左侧,top-上方
|
|
* @property {String Number} label-width 提示文字的宽度,单位rpx(默认90)
|
|
* @property {Object} label-style lable的样式,对象形式
|
|
* @property {String} label-align lable的对齐方式
|
|
* @property {Object} rules 通过ref设置,见官网说明
|
|
* @property {Array} error-type 错误的提示方式,数组形式,见上方说明(默认['message'])
|
|
* @example <u-form :model="form" ref="uForm"></u-form>
|
|
*/
|
|
|
|
export default {
|
|
name: 'u-form',
|
|
props: {
|
|
// 当前form的需要验证字段的集合
|
|
model: {
|
|
type: Object,
|
|
default() {
|
|
return {};
|
|
}
|
|
},
|
|
// 验证规则
|
|
// rules: {
|
|
// type: [Object, Function, Array],
|
|
// default() {
|
|
// return {};
|
|
// }
|
|
// },
|
|
// 有错误时的提示方式,message-提示信息,border-如果input设置了边框,变成呈红色,
|
|
// border-bottom-下边框呈现红色,none-无提示
|
|
errorType: {
|
|
type: Array,
|
|
default() {
|
|
return ['message', 'toast']
|
|
}
|
|
},
|
|
// 是否显示表单域的下划线边框
|
|
borderBottom: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
// label的位置,left-左边,top-上边
|
|
labelPosition: {
|
|
type: String,
|
|
default: 'left'
|
|
},
|
|
// label的宽度,单位rpx
|
|
labelWidth: {
|
|
type: [String, Number],
|
|
default: 90
|
|
},
|
|
// lable字体的对齐方式
|
|
labelAlign: {
|
|
type: String,
|
|
default: 'left'
|
|
},
|
|
// lable的样式,对象形式
|
|
labelStyle: {
|
|
type: Object,
|
|
default() {
|
|
return {}
|
|
}
|
|
},
|
|
},
|
|
provide() {
|
|
return {
|
|
uForm: this
|
|
};
|
|
},
|
|
data() {
|
|
return {
|
|
rules: {}
|
|
};
|
|
},
|
|
created() {
|
|
// 存储当前form下的所有u-form-item的实例
|
|
// 不能定义在data中,否则微信小程序会造成循环引用而报错
|
|
this.fields = [];
|
|
},
|
|
methods: {
|
|
setRules(rules) {
|
|
this.rules = rules;
|
|
},
|
|
// 清空所有u-form-item组件的内容,本质上是调用了u-form-item组件中的resetField()方法
|
|
resetFields() {
|
|
this.fields.map(field => {
|
|
field.resetField();
|
|
});
|
|
},
|
|
// 校验全部数据
|
|
validate(callback) {
|
|
return new Promise(resolve => {
|
|
// 对所有的u-form-item进行校验
|
|
let valid = true; // 默认通过
|
|
let count = 0; // 用于标记是否检查完毕
|
|
let errorArr = []; // 存放错误信息
|
|
this.fields.map(field => {
|
|
// 调用每一个u-form-item实例的validation的校验方法
|
|
field.validation('', error => {
|
|
// 如果任意一个u-form-item校验不通过,就意味着整个表单不通过
|
|
if (error) {
|
|
valid = false;
|
|
errorArr.push(error);
|
|
}
|
|
// 当历遍了所有的u-form-item时,调用promise的then方法
|
|
if (++count === this.fields.length) {
|
|
resolve(valid); // 进入promise的then方法
|
|
// 判断是否设置了toast的提示方式,只提示最前面的表单域的第一个错误信息
|
|
if(this.errorType.indexOf('none') === -1 && this.errorType.indexOf('toast') >= 0 && errorArr.length) {
|
|
this.$u.toast(errorArr[0]);
|
|
}
|
|
// 调用回调方法
|
|
if (typeof callback == 'function') callback(valid);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import "../../libs/css/style.components.scss";
|
|
</style>
|