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. 193
      src/components/PhoneCode.vue
  3. 139
      src/views/Franchise.vue

2
src/components/GuipFormItem.vue

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

193
src/components/PhoneCode.vue

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

139
src/views/Franchise.vue

@ -28,7 +28,8 @@
<!-- <div class="ud__modal__header"> <!-- <div class="ud__modal__header">
</div> --> </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"> <div class="right-form">
<GuipFormItem column="column" addClass="w388"> <GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon"> <div slot="formLeft" class="form-top-icon">
@ -51,25 +52,46 @@
</div> </div>
<GuipInput slot="formDom" ref="GuipInput" v-model="form.name" prop="name" placeholder="您的真实姓名"/> <GuipInput slot="formDom" ref="GuipInput" v-model="form.name" prop="name" placeholder="您的真实姓名"/>
</GuipFormItem> </GuipFormItem>
<!-- <PhoneCode v-model="form.phoneCode" :phone-prop="'phone'"
:code-prop="'code'" @send-code="handleSendCode" /> -->
<GuipFormItem column="column" addClass="w388"> <GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon"> <div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/storeNum.svg" alt=""> <img src="../assets/franchise1/storeNum.svg" alt="">
<span>手机号码</span> <span>手机号码</span>
</div> </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>
<!-- 验证码输入框 -->
<GuipFormItem column="column" addClass="w388"> <GuipFormItem column="column" addClass="w388">
<div slot="formLeft" class="form-top-icon"> <div slot="formLeft" class="form-top-icon">
<img src="../assets/franchise1/codeNumber.svg" alt=""> <img src="../assets/franchise1/codeNumber.svg" alt="">
<span>验证码</span> <span>验证码</span>
</div> </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> </GuipFormItem>
</div> </div>
</el-form> </el-form>
<div class="ud__modal__footer"> <div class="ud__modal__footer">
<div class="step-box__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"> <p class="attention">
<el-checkbox v-model="checked"></el-checkbox> <el-checkbox v-model="checked"></el-checkbox>
<b>代理商需要阅读并同意<a href="">哈哈哈哈</a></b> <b>代理商需要阅读并同意<a href="">哈哈哈哈</a></b>
@ -92,7 +114,7 @@
</div> </div>
</template> </template>
<script> <script>
import PhoneCode from '@/components/PhoneCode.vue'; // import PhoneCode from '@/components/PhoneCode.vue';
import GuipButton from '@/components/GuipButton.vue'; import GuipButton from '@/components/GuipButton.vue';
import GuipInput from '@/components/GuipInput.vue'; import GuipInput from '@/components/GuipInput.vue';
import GuipFormItem from '@/components/GuipFormItem.vue'; import GuipFormItem from '@/components/GuipFormItem.vue';
@ -100,8 +122,31 @@ import Footer from '@/components/Footer.vue';
export default { export default {
data() { 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 { return {
checked:true, checked: true,
btnstyleObj: { btnstyleObj: {
width: '388px', width: '388px',
height: '46px' height: '46px'
@ -114,6 +159,8 @@ export default {
nick: '', nick: '',
recommended_aid: '', recommended_aid: '',
}, },
countdown: 0,
timer: null,
rules: { rules: {
tid: [ tid: [
{ required: true, message: '请输入订单号', trigger: 'blur' } { required: true, message: '请输入订单号', trigger: 'blur' }
@ -125,19 +172,20 @@ export default {
{ required: true, message: '请输入真实姓名', trigger: 'blur' } { required: true, message: '请输入真实姓名', trigger: 'blur' }
], ],
phone: [ phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' } { validator: validatePhone, trigger: 'blur' }
], ],
sms_code: [ sms_code: [
{ required: true, message: '请输入验证码', trigger: 'blur' } { validator: validateCode, trigger: 'blur' }
] ]
}, },
}; };
}, },
components: { components: {
GuipButton, GuipButton,
GuipInput, GuipInput,
GuipFormItem, GuipFormItem,
PhoneCode, // PhoneCode,
Footer Footer
}, },
mounted(){ mounted(){
@ -145,7 +193,55 @@ export default {
this.form.recommended_aid = this.$route.aid; this.form.recommended_aid = this.$route.aid;
} }
}, },
computed: {
canSend() {
return /^1[3-9]\d{9}$/.test(this.form.phone)
}
},
methods: { 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(){ goAddFranchise(){
console.log(this.form) console.log(this.form)
const that = this const that = this
@ -173,30 +269,39 @@ export default {
} }
}); });
} }
} },
beforeDestroy() {
if (this.timer) clearInterval(this.timer);
},
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../style/franchise.scss'; @import '../style/franchise.scss';
::v-deep .el-form-item {
margin-bottom: 0;
}
.right-form { .right-form {
padding: 40px 40px 0; padding: 40px 40px 0;
} }
.form-item1{
.form-item1 {
margin-bottom: 24px; margin-bottom: 24px;
} }
.attention{
.attention {
margin-top: 20px; margin-top: 20px;
b{
b {
font-weight: normal; font-weight: normal;
a{
a {
text-decoration: none; text-decoration: none;
color: #006AFF; color: #006AFF;
} }
} }
} }
.web-req-right-top{
.web-req-right-top {
flex: 1; flex: 1;
} }
</style> </style>
Loading…
Cancel
Save