Browse Source

Merge pull request 'zq-popup' (#18) from zq-popup into master

Reviewed-on: #18
pull/19/head
zhangqi 2 weeks ago
parent
commit
8ba9b8db1a
  1. 2
      src/components/GuipFormItem.vue
  2. 217
      src/components/PhoneCode.vue
  3. 139
      src/views/Franchise.vue

2
src/components/GuipFormItem.vue

@ -43,7 +43,7 @@ export default {
// }
},
mounted(){
console.log(this.required,'required----');
// console.log(this.required,'required----');
}
}
</script>

217
src/components/PhoneCode.vue

@ -1,75 +1,164 @@
<template>
<div class="flex">
<GuipInput
ref="phoneNumber"
width="277px"
height="38px"
placeholder="请输入手机号码"/>
<GuipButton type="reverseMild" @click="sendCode" :btnstyle="{width:'99px',height:'38px'}" :disabled="isCounting">{{ countdownText }}</GuipButton>
</div>
</template>
<div class="phone-code-input">
<!-- 手机号输入框 + 发送按钮 -->
<GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/storeNum.svg" alt="">
<span>手机号码</span>
</div>
<el-form-item slot="formDom" :prop="phoneProp" :rules="phoneRules" style="display: flex;justify-content: space-between;">
<el-input v-model="phone" @input="validateInput"
placeholder="请输入手机号" style="width: 277px;" clearable @blur="validatePhone">
</el-input>
<GuipButton type="reverseMild" :btnstyle="{width:'99px',height:'38px'}" :disabled="!canSendCode" @click="sendCode" class="send-btn">
{{ countdown > 0 ? `${countdown}s后重试` : '获取验证码' }}</GuipButton>
</el-form-item>
</GuipFormItem>
<!-- 验证码输入框 -->
<GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/codeNumber.svg" alt="">
<span>验证码</span>
</div>
<el-form-item slot="formDom" :prop="codeProp" :rules="codeRules">
<div class="code-input-wrapper">
<el-input v-model="code" placeholder="请输入验证码" clearable @blur="validateCode"></el-input>
</div>
</el-form-item>
</GuipFormItem>
</div>
</template>
<script>
import axios from 'axios';
<script>
import GuipFormItem from '@/components/GuipFormItem.vue';
import GuipButton from '@/components/GuipButton.vue';
import GuipInput from '@/components/GuipInput.vue';
export default {
data() {
return {
phoneValue: '',
countdown: 60, //
isCounting: false, //
};
export default {
name: "PhoneCodeInput",
components:{
GuipButton,
GuipFormItem,
},
props: {
// Form prop 'phone' 'code'
phoneProp: {
type: String,
default: "phone",
},
components: {
GuipButton,
GuipInput,
codeProp: {
type: String,
default: "code",
},
computed: {
countdownText() {
return this.isCounting ? `${this.countdown}秒后重试` : '获取验证码';
}
// v-model
value: {
type: Object,
default: () => ({
phone: "",
code: "",
}),
},
//
phoneRules: {
type: Array,
default: () => [
{ required: true, message: "请输入手机号", trigger: "blur" },
{ pattern: /^1[3-9]\d{9}$/, message: "手机号格式错误", trigger: "blur" },
],
},
codeRules: {
type: Array,
default: () => [
{ required: true, message: "请输入验证码", trigger: "blur" },
{ pattern: /^\d{6}$/, message: "验证码必须是6位数字", trigger: "blur" },
],
},
},
data() {
return {
phone: this.value.phone,
code: this.value.code,
countdown: 0, //
timer: null, //
};
},
computed: {
//
canSendCode() {
return /^1[3-9]\d{9}$/.test(this.phone) && this.countdown === 0;
},
},
watch: {
//
phone(newVal) {
this.$emit("input", { ...this.value, phone: newVal });
},
code(newVal) {
this.$emit("input", { ...this.value, code: newVal });
},
// v-model
value: {
deep: true,
handler(newVal) {
this.phone = newVal.phone;
this.code = newVal.code;
},
},
},
methods: {
//
validatePhone() {
console.log('ooooo');
// formRef
this.$refs.formRef?.validateField(this.phoneProp);
},
methods: {
async sendCode() {
if (!/^1\d{10}$/.test(this.$refs.phoneNumber.inputValue)) {
this.$message.warning('请输入有效的手机号码');
return;
}
this.phoneValue = this.$refs.phoneNumber.inputValue;
//
try {
const response = await axios.post('/agentnew/ajax_send_verify_code', { phoneNumber: this.$refs.phoneNumber.value }); // API
if (response.data.status) { //
this.$message.success('验证码已发送');
this.startCountdown();
} else {
throw new Error(response.data.info || '发送失败'); // 使
}
} catch (error) {
console.error('发送验证码失败:', error); //
this.$message.warning('发送验证码失败,请稍后再试');
}
},
startCountdown() {
this.isCounting = true;
const interval = setInterval(() => {
this.countdown--;
if (this.countdown <= 0) {
clearInterval(interval);
this.isCounting = false;
this.countdown = 60; //
validateInput() {
// formRef
// this.$refs.formRef?.validateField(this.phoneProp);
if (/^1[3-9]\d{9}$/.test(this.phone)) {
this.$refs.formRef?.validateField(this.phoneProp, (errorMsg) => {
if (!errorMsg) {
console.log('-----00000');
//
}else{
console.log('776767676');
}
}, 1000);
});
}
}
};
</script>
},
//
validateCode() {
this.$refs.formRef?.validateField(this.codeProp);
},
//
sendCode() {
if (!this.canSendCode) return;
// API
<style lang="scss" scoped>
.flex{
display: flex;
justify-content: space-between;
this.startCountdown()
this.$emit("send-code", this.phone);
},
startCountdown() {
this.countdown = 60;
this.timer = setInterval(() => {
this.countdown--;
if (this.countdown <= 0) {
clearInterval(this.timer);
}
}, 1000);
}
</style>
},
beforeDestroy() {
if (this.timer) clearInterval(this.timer);
},
};
</script>
<style scoped>
.code-input-wrapper {
display: flex;
gap: 10px;
flex: 1;
}
</style>

139
src/views/Franchise.vue

@ -28,7 +28,8 @@
<!-- <div class="ud__modal__header">
</div> -->
<el-form :model="form" :rules="rules" class="el-row demo-ruleForm" ref="formRef">
<el-form :model="form" :rules="rules"
class="el-row demo-ruleForm" ref="formRef">
<div class="right-form">
<GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon">
@ -51,25 +52,46 @@
</div>
<GuipInput slot="formDom" ref="GuipInput" v-model="form.name" prop="name" placeholder="您的真实姓名"/>
</GuipFormItem>
<!-- <PhoneCode v-model="form.phoneCode" :phone-prop="'phone'"
:code-prop="'code'" @send-code="handleSendCode" /> -->
<GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/storeNum.svg" alt="">
<span>手机号码</span>
</div>
<PhoneCode slot="formDom" ref="PhoneCode" v-model="form.phone" prop="phone"></PhoneCode>
<el-form-item slot="formDom" prop="phone"
style="width: 100%;">
<div style="width: 100%;" class="flex-between">
<el-input v-model="form.phone" @input="clearPhoneError"
placeholder="请输入手机号" style="width: 277px;" clearable
@blur="validatePhone">
</el-input>
<GuipButton type="reverseMild"
:btnstyle="{ width: '99px', height: '38px' }"
:disabled="!canSend || countdown > 0" @click="sendCode"
class="send-btn">
{{ countdown > 0 ? `${countdown}s后重试` : '获取验证码' }}</GuipButton>
</div>
</el-form-item>
</GuipFormItem>
<!-- 验证码输入框 -->
<GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/codeNumber.svg" alt="">
<span>验证码</span>
</div>
<GuipInput slot="formDom" ref="GuipInput" v-model="form.sms_code" prop="sms_code" placeholder="填写验证码"/>
<el-form-item slot="formDom" prop="sms_code">
<el-input v-model="form.sms_code" placeholder="请输入验证码" clearable
@blur="validateCode" @input="clearCodeError"></el-input>
</el-form-item>
</GuipFormItem>
</div>
</el-form>
<div class="ud__modal__footer">
<div class="step-box__footer">
<GuipButton :btnstyle="btnstyleObj" type="primary" @click="goAddFranchise">加盟并进入后台</GuipButton>
<GuipButton :btnstyle="btnstyleObj" type="primary" @click="goAddFranchise">
加盟并进入后台</GuipButton>
<p class="attention">
<el-checkbox v-model="checked"></el-checkbox>
<b>代理商需要阅读并同意<a href="">哈哈哈哈</a></b>
@ -92,7 +114,7 @@
</div>
</template>
<script>
import PhoneCode from '@/components/PhoneCode.vue';
// import PhoneCode from '@/components/PhoneCode.vue';
import GuipButton from '@/components/GuipButton.vue';
import GuipInput from '@/components/GuipInput.vue';
import GuipFormItem from '@/components/GuipFormItem.vue';
@ -100,8 +122,31 @@ import Footer from '@/components/Footer.vue';
export default {
data() {
//
const validatePhone = (rule, value, callback) => {
if (!value) {
return callback(new Error('请输入手机号'))
}
if (!/^1[3-9]\d{9}$/.test(value)) {
return callback(new Error('手机号格式不正确'))
}
callback()
}
//
const validateCode = (rule, value, callback) => {
if (!value) {
return callback(new Error('请输入验证码'))
}
//
if (!/^\d{4,6}$/.test(value)) {
return callback(new Error('验证码必须是4-6位数字'))
}
callback()
}
return {
checked:true,
checked: true,
btnstyleObj: {
width: '388px',
height: '46px'
@ -114,6 +159,8 @@ export default {
nick: '',
recommended_aid: '',
},
countdown: 0,
timer: null,
rules: {
tid: [
{ required: true, message: '请输入订单号', trigger: 'blur' }
@ -125,19 +172,20 @@ export default {
{ required: true, message: '请输入真实姓名', trigger: 'blur' }
],
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' }
{ validator: validatePhone, trigger: 'blur' }
],
sms_code: [
{ required: true, message: '请输入验证码', trigger: 'blur' }
{ validator: validateCode, trigger: 'blur' }
]
},
};
},
components: {
GuipButton,
GuipInput,
GuipFormItem,
PhoneCode,
// PhoneCode,
Footer
},
mounted(){
@ -145,7 +193,55 @@ export default {
this.form.recommended_aid = this.$route.aid;
}
},
computed: {
canSend() {
return /^1[3-9]\d{9}$/.test(this.form.phone)
}
},
methods: {
//
validatePhone() {
this.$refs.formRef.validateField('phone')
},
//
validateCode() {
this.$refs.formRef.validateField('code')
},
//
clearPhoneError() {
if (/^1[3-9]\d{9}$/.test(this.form.phone)) {
this.$refs.formRef.clearValidate('phone')
}
},
//
clearCodeError() {
if (/^\d{6}$/.test(this.form.code)) {
this.$refs.formRef.clearValidate('code')
}
},
//
sendCode() {
if (!this.canSend || this.countdown > 0) return
//
console.log('发送验证码到:', this.form.phone)
//
this.countdown = 60
this.timer = setInterval(() => {
this.countdown--
if (this.countdown <= 0) {
clearInterval(this.timer)
}
}, 1000)
// API
// this.$api.sendSmsCode({ phone: this.formData.phone })
},
goAddFranchise(){
console.log(this.form)
const that = this
@ -173,30 +269,39 @@ export default {
}
});
}
}
},
beforeDestroy() {
if (this.timer) clearInterval(this.timer);
},
}
</script>
<style lang="scss" scoped>
@import '../style/franchise.scss';
::v-deep .el-form-item {
margin-bottom: 0;
}
.right-form {
padding: 40px 40px 0;
}
.form-item1{
.form-item1 {
margin-bottom: 24px;
}
.attention{
.attention {
margin-top: 20px;
b{
b {
font-weight: normal;
a{
a {
text-decoration: none;
color: #006AFF;
}
}
}
.web-req-right-top{
.web-req-right-top {
flex: 1;
}
</style>
Loading…
Cancel
Save