个人信息

main
lion 3 months ago
parent 1ff66b868e
commit f2d8e2ed27

@ -24,7 +24,7 @@
//
if (process.env.NODE_ENV === 'development') {
console.log('开发环境,使用模拟登录')
this.mockAccountLogin('songwz', 'Abcd1234')
this.mockAccountLogin('songwz', 'Admin@2025')
} else {
this.wxH5AuthLogin()
}

@ -1,41 +1,42 @@
// API配置
export const BASE_URL = 'https://xukoushuniu.115.langye.net'
// 判断环境(你可以用 process.env.NODE_ENV 或自定义变量)
const IS_PROD = process.env.NODE_ENV === 'production';
// API接口地址
export const API = {
WECHAT_JSSDK_CONFIG: `${BASE_URL}/api/customer/wechat/jssdk-config`,
LOGIN: `${BASE_URL}/api/customer/login-by-code`,
WX_LOGIN: `${BASE_URL}/api/customer/login-by-wechat-code`,
STATISTICS: `${BASE_URL}/api/customer/reservation/statistics`,
LOGIN_ACCOUNT: `${BASE_URL}/api/customer/login`,
GET_USER_INFO: `${BASE_URL}/api/customer/me`,
UPDATE_USER_INFO: `${BASE_URL}/api/customer/profile/update`,
UPLOAD_FILE:`${BASE_URL}/api/customer/upload-file`,
SHIP_CREATE: `${BASE_URL}/api/customer/ship/create`,
SHIP_INDEX: `${BASE_URL}/api/customer/ship/index`,
SHIP_DETAIL: `${BASE_URL}/api/customer/ship/get-one`,
SHIP_PROPERTY_ENUM: `${BASE_URL}/api/customer/ship/get-property-enum`,
SHIP_DELETE: `${BASE_URL}/api/customer/ship/delete`,
RESERVATION_STATUS_ENUM: `${BASE_URL}/api/customer/reservation/get-status-enum`,
RESERVATION_CREATE: `${BASE_URL}/api/customer/reservation/create`,
RESERVATION_LIST: `${BASE_URL}/api/customer/reservation/index`,
AVAILABLE_SHIP: `${BASE_URL}/api/customer/reservation/get-available-ship`,
// GET_PAYMENT_QRCODE: IS_PROD
// ? `${BASE_URL}/api/customer/reservation/get-payment-qrcode`
// : `${BASE_URL}/api/customer/reservation/get-fake-payment-qrcode`,
GET_PAYMENT_QRCODE: `${BASE_URL}/api/customer/reservation/fake-pay`,
FAKE_PAY: `${BASE_URL}/api/customer/reservation/fake-pay`,
NOTIFICATION_LIST: `${BASE_URL}/api/customer/notifications/index`,
CANCEL_RESERVATION: `${BASE_URL}/api/customer/reservation/cancel`,
GET_DIRECTION_ENUM: `${BASE_URL}/api/customer/reservation/get-direction-enum`,
SHIP_UPDATE: `${BASE_URL}/api/customer/ship/update`,
GET_INVOICE: `${BASE_URL}/api/customer/reservation/get-invoice`,
GET_DAILY_RESERVATION_DEADLINE: `${BASE_URL}/api/customer/setting/get-daily-reservation-deadline`,
GET_GEOFENCE_BY_DIRECTION: `${BASE_URL}/api/customer/geofence/get-by-direction`,
GET_WATER_LEVEL: `${BASE_URL}/api/customer/setting/get-water-level`,
GET_UNIT_PRICE: `${BASE_URL}/api/customer/setting/get-unit-price`,
GET_SHIP_INSPECTION_EXAMPLES: `${BASE_URL}/api/customer/setting/get-ship-inspection-examples`,
// API配置
export const BASE_URL = 'https://xukoushuniu.115.langye.net'
// 判断环境(你可以用 process.env.NODE_ENV 或自定义变量)
const IS_PROD = process.env.NODE_ENV === 'production';
// API接口地址
export const API = {
WECHAT_JSSDK_CONFIG: `${BASE_URL}/api/customer/wechat/jssdk-config`,
LOGIN: `${BASE_URL}/api/customer/login-by-code`,
WX_LOGIN: `${BASE_URL}/api/customer/login-by-wechat-code`,
STATISTICS: `${BASE_URL}/api/customer/reservation/statistics`,
LOGIN_ACCOUNT: `${BASE_URL}/api/customer/login`,
GET_USER_INFO: `${BASE_URL}/api/customer/me`,
UPDATE_USER_INFO: `${BASE_URL}/api/customer/profile/update`,
UPLOAD_FILE:`${BASE_URL}/api/customer/upload-file`,
SHIP_CREATE: `${BASE_URL}/api/customer/ship/create`,
SHIP_INDEX: `${BASE_URL}/api/customer/ship/index`,
SHIP_DETAIL: `${BASE_URL}/api/customer/ship/get-one`,
SHIP_PROPERTY_ENUM: `${BASE_URL}/api/customer/ship/get-property-enum`,
SHIP_DELETE: `${BASE_URL}/api/customer/ship/delete`,
RESERVATION_STATUS_ENUM: `${BASE_URL}/api/customer/reservation/get-status-enum`,
RESERVATION_CREATE: `${BASE_URL}/api/customer/reservation/create`,
RESERVATION_LIST: `${BASE_URL}/api/customer/reservation/index`,
AVAILABLE_SHIP: `${BASE_URL}/api/customer/reservation/get-available-ship`,
// GET_PAYMENT_QRCODE: IS_PROD
// ? `${BASE_URL}/api/customer/reservation/get-payment-qrcode`
// : `${BASE_URL}/api/customer/reservation/get-fake-payment-qrcode`,
GET_PAYMENT_QRCODE: `${BASE_URL}/api/customer/reservation/fake-pay`,
FAKE_PAY: `${BASE_URL}/api/customer/reservation/fake-pay`,
NOTIFICATION_LIST: `${BASE_URL}/api/customer/notifications/index`,
CANCEL_RESERVATION: `${BASE_URL}/api/customer/reservation/cancel`,
GET_DIRECTION_ENUM: `${BASE_URL}/api/customer/reservation/get-direction-enum`,
SHIP_UPDATE: `${BASE_URL}/api/customer/ship/update`,
GET_INVOICE: `${BASE_URL}/api/customer/reservation/get-invoice`,
GET_DAILY_RESERVATION_DEADLINE: `${BASE_URL}/api/customer/setting/get-daily-reservation-deadline`,
GET_GEOFENCE_BY_DIRECTION: `${BASE_URL}/api/customer/geofence/get-by-direction`,
GET_WATER_LEVEL: `${BASE_URL}/api/customer/setting/get-water-level`,
GET_UNIT_PRICE: `${BASE_URL}/api/customer/setting/get-unit-price`,
GET_SHIP_INSPECTION_EXAMPLES: `${BASE_URL}/api/customer/setting/get-ship-inspection-examples`,
PROFILE_SEND_PHONE_CODE: `${BASE_URL}/api/customer/profile/send-phone-code`,
}

@ -127,6 +127,13 @@
"navigationBarTitleText": "关于我们",
"navigationStyle": "custom"
}
},
{
"path": "pages/index/verify_backup_phone",
"style": {
"navigationBarTitleText": "验证备用手机号",
"navigationStyle": "custom"
}
}
],
"tabBar": {

@ -5,59 +5,39 @@
<view class="header-title">胥口枢纽闸站状态</view>
<view class="header-info">
<view class="info-item">
<text class="info-label">太湖</text>
<view class="info-value-group">
<!-- <text class="info-value"
>水位深度{{
statistics.taihu_to_xujiang
? statistics.taihu_to_xujiang.water_level
: "-"
}}m</text
> -->
<text class="info-value"
>吃水深度{{
statistics.taihu_to_xujiang
? statistics.taihu_to_xujiang.draft_depth
statistics.min_water_level_minus_06 !== undefined && statistics.min_water_level_minus_06 !== null
? statistics.min_water_level_minus_06
: "-"
}}m</text
>
</view>
</view>
<view class="info-item">
<text class="info-label">胥江</text>
<view class="info-value-group">
<!-- <text class="info-value"
>水位深度{{
statistics.xujiang_to_taihu
? statistics.xujiang_to_taihu.water_level
: "-"
}}m</text
> -->
<text class="info-value"
>吃水深{{
statistics.xujiang_to_taihu
? statistics.xujiang_to_taihu.draft_depth
>限高高度{{
statistics.height_limit_minus_max !== undefined && statistics.height_limit_minus_max !== null
? statistics.height_limit_minus_max
: "-"
}}m</text
>
</view>
</view>
</view>
</view>
<view class="batch-row-strict">
<!-- <view class="batch-row-strict">
<block v-for="(item, index) in statistics.batches || []" :key="item.id">
<block v-if="index < 2">
<view class="batch-col">
<view class="batch-tag-strict orange">
<view class="batch-tag-strict orange">
<text class="tag-orange">{{
item.direction === "in" ? "去胥江" : "去太湖"
}}</text>
<view class="batch-num-strict">{{ item.name }}</view>
</view>
</view>
<view v-if="index < 1" class="batch-divider-strict"></view>
</view>
</view>
<view v-if="index < 1" class="batch-divider-strict"></view>
</block>
</block>
</view>
</view> -->
</view>
<!-- 闸站流程 -->
@ -162,7 +142,7 @@
<text class="info-text">北向南2025040102准备过闸</text>
</view>
</view> -->
<!-- 编辑信息弹窗 -->
<view v-if="showEditPopup" class="edit-popup-mask" @click="closeEditPopup">
<view class="edit-popup" @click.stop>
@ -180,14 +160,14 @@
/>
</view>
<view class="edit-field">
<text class="edit-label">交款人类型</text>
<text class="edit-label">开票抬头类型</text>
<view class="payer-type-group">
<view
class="payer-type-item"
:class="{ active: Number(editForm.payer_type) === 1 }"
@click="editForm.payer_type = 1"
>
个人
船号
</view>
<view
class="payer-type-item"
@ -198,6 +178,14 @@
</view>
</view>
</view>
<view class="edit-field" v-if="Number(editForm.payer_type) === 2">
<text class="edit-label">单位名称</text>
<input
class="edit-input"
v-model="editForm.company_name"
placeholder="请输入单位名称"
/>
</view>
<view class="edit-field">
<text class="edit-label">手机号</text>
<input
@ -208,6 +196,26 @@
placeholder="请输入手机号"
/>
</view>
<view class="edit-field">
<text class="edit-label">验证码</text>
<view class="verify-code-row">
<input
class="edit-input verify-code-input"
v-model="editForm.phone_code"
type="number"
maxlength="6"
placeholder="请输入验证码"
/>
<button
class="send-code-btn"
:disabled="!canSendCode || countdown > 0"
@click="sendSmsCode"
>
{{ countdown > 0 ? countdown + '秒后重发' : '获取验证码' }}
</button>
</view>
<text class="hint-text">您稍后还可以验证一个备用手机号</text>
</view>
<view class="edit-field">
<text class="edit-label">证件号</text>
<input
@ -236,13 +244,20 @@ export default {
showEditPopup: false,
editForm: {
name: "",
payer_type: 1,
payer_type: 1, // 1-2-
company_name: "", //
phone: "",
phone_code: "", //
id_card: "",
},
canSendCode: true, //
countdown: 0, //
countdownTimer: null, //
statistics: {
taihu_to_xujiang: null, // { water_level, draft_depth }
xujiang_to_taihu: null, // { water_level, draft_depth }
min_water_level_minus_06: null, //
height_limit_minus_max: null, //
total_count: 0,
unpaid_count: 0,
paid_count: 0,
@ -271,6 +286,11 @@ export default {
onUnload() {
//
uni.$off("loginSuccess", this.onLoginSuccess);
//
if (this.countdownTimer) {
clearInterval(this.countdownTimer);
this.countdownTimer = null;
}
},
methods: {
// token
@ -361,6 +381,9 @@ export default {
console.log("data", data);
this.statistics.taihu_to_xujiang = data.taihu_to_xujiang || null;
this.statistics.xujiang_to_taihu = data.xujiang_to_taihu || null;
//
this.statistics.min_water_level_minus_06 = data.min_water_level_minus_06 !== undefined && data.min_water_level_minus_06 !== null ? data.min_water_level_minus_06 : null;
this.statistics.height_limit_minus_max = data.height_limit_minus_max !== undefined && data.height_limit_minus_max !== null ? data.height_limit_minus_max : null;
}
console.log(this.statistics);
}
@ -390,13 +413,15 @@ export default {
const existingWaterData = {
taihu_to_xujiang: this.statistics.taihu_to_xujiang,
xujiang_to_taihu: this.statistics.xujiang_to_taihu,
min_water_level_minus_06: this.statistics.min_water_level_minus_06,
height_limit_minus_max: this.statistics.height_limit_minus_max,
};
this.statistics = {
...res.data.data,
...existingWaterData,
};
}
}
}
},
async fetchUserInfo() {
const token = uni.getStorageSync("token");
@ -432,12 +457,14 @@ export default {
}
}
const raw = res.data.data || res.data;
const payerType = Number(raw.payer_type ?? raw.payerType ?? 1);
this.userInfo = { ...raw, payer_type: payerType };
const invoiceTitleType = Number(raw.payer_type ?? raw.invoiceTitleType ?? 1);
this.userInfo = { ...raw, payer_type: invoiceTitleType };
this.editForm = {
name: raw.name || "",
payer_type: payerType,
payer_type: invoiceTitleType,
company_name: raw.company_name || raw.companyName || "",
phone: raw.phone || "",
phone_code: "",
id_card: raw.id_card || "",
};
}
@ -449,7 +476,7 @@ export default {
const u = this.userInfo || {};
const ok = !!(
u.name &&
(u.payer_type ?? u.payerType) &&
(u.payer_type ?? u.invoiceTitleType) &&
u.phone &&
u.id_card
);
@ -460,6 +487,67 @@ export default {
},
closeEditPopup() {
this.showEditPopup = false;
//
if (this.countdownTimer) {
clearInterval(this.countdownTimer);
this.countdownTimer = null;
}
this.countdown = 0;
},
//
async sendSmsCode() {
//
const phoneReg = /^1\d{10}$/;
if (!phoneReg.test(this.editForm.phone)) {
uni.showToast({ title: "请输入正确的手机号", icon: "none" });
return;
}
if (!this.canSendCode || this.countdown > 0) {
return;
}
const token = uni.getStorageSync("token");
if (!token) {
uni.showToast({ title: "请先登录", icon: "none" });
return;
}
try {
uni.showLoading({ title: "发送中..." });
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.PROFILE_SEND_PHONE_CODE}?token=${token}`,
method: "POST",
data: {
phone: this.editForm.phone,
type: "phone",
},
success: resolve,
fail: reject,
});
});
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: "验证码已发送", icon: "success" });
//
this.canSendCode = false;
this.countdown = 60;
this.countdownTimer = setInterval(() => {
this.countdown--;
if (this.countdown <= 0) {
clearInterval(this.countdownTimer);
this.countdownTimer = null;
this.canSendCode = true;
}
}, 1000);
} else {
uni.showToast({
title: (res.data && res.data.errmsg) || "发送失败",
icon: "none",
});
}
} catch (e) {
uni.hideLoading();
uni.showToast({ title: "发送失败", icon: "none" });
}
},
validateForm() {
if (!this.editForm.name) {
@ -467,7 +555,12 @@ export default {
return false;
}
if (![1, 2].includes(Number(this.editForm.payer_type))) {
uni.showToast({ title: "请选择交款人类型", icon: "none" });
uni.showToast({ title: "请选择开票抬头类型", icon: "none" });
return false;
}
//
if (Number(this.editForm.payer_type) === 2 && !this.editForm.company_name) {
uni.showToast({ title: "请输入单位名称", icon: "none" });
return false;
}
const phoneReg = /^1\d{10}$/;
@ -475,6 +568,11 @@ export default {
uni.showToast({ title: "请输入正确的手机号", icon: "none" });
return false;
}
//
if (!this.editForm.phone_code || this.editForm.phone_code.length !== 6) {
uni.showToast({ title: "请输入6位验证码", icon: "none" });
return false;
}
const idReg = /^(?:\d{15}|\d{17}[\dXx])$/;
if (!idReg.test(this.editForm.id_card)) {
uni.showToast({ title: "请输入正确的证件号", icon: "none" });
@ -491,16 +589,22 @@ export default {
}
try {
uni.showLoading({ title: "提交中..." });
const requestData = {
name: this.editForm.name,
payer_type: Number(this.editForm.payer_type),
phone: this.editForm.phone,
phone_code: this.editForm.phone_code,
id_card: this.editForm.id_card,
};
//
if (Number(this.editForm.payer_type) === 2) {
requestData.company_name = this.editForm.company_name;
}
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.UPDATE_USER_INFO}?token=${token}`,
method: "POST",
data: {
name: this.editForm.name,
payer_type: Number(this.editForm.payer_type),
phone: this.editForm.phone,
id_card: this.editForm.id_card,
},
data: requestData,
success: resolve,
fail: reject,
});
@ -509,7 +613,35 @@ export default {
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: "更新成功", icon: "success" });
this.closeEditPopup();
//
await this.fetchUserInfo();
//
setTimeout(() => {
uni.showModal({
title: "提示",
content: "是否需要立即验证备用手机号码?",
confirmText: "需要",
cancelText: "稍后再说",
success: (modalRes) => {
if (modalRes.confirm) {
//
uni.navigateTo({
url: "/pages/index/verify_backup_phone",
success: () => {
console.log("跳转成功");
},
fail: (err) => {
console.error("跳转失败:", err);
uni.showToast({ title: "跳转失败,请重试", icon: "none" });
}
});
} else {
//
console.log("用户选择稍后再说");
}
}
});
}, 500);
} else {
uni.showToast({
title: (res.data && res.data.errmsg) || "更新失败",
@ -537,7 +669,7 @@ export default {
}
},
});
}
}
};
if (!this.userInfo) {
this.fetchUserInfo().then(afterCheck).catch(afterCheck);
@ -595,7 +727,7 @@ export default {
justify-content: center;
align-items: flex-start;
width: fit-content;
margin: 2vh auto 0 auto; /* 水平居中 */
margin: 4vh auto 0 auto; /* 水平居中,往下移动 */
gap: 154rpx; /* 控制每组间距 */
}
@ -624,12 +756,13 @@ export default {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4rpx;
gap: 12rpx;
margin-top: 8rpx;
}
.info-value-group .info-value {
margin-top: 0;
font-size: 28rpx;
font-size: 36rpx; /* 字号加大 */
font-weight: 500;
}
.batch-row-strict {
@ -915,6 +1048,39 @@ export default {
.edit-submit-btn::after {
border: none;
}
.verify-code-row {
display: flex;
align-items: center;
gap: 16rpx;
}
.verify-code-input {
flex: 1;
}
.send-code-btn {
min-width: 180rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 12rpx;
background: #3b7cff;
color: #fff;
font-size: 24rpx;
border: none;
padding: 0 24rpx;
white-space: nowrap;
}
.send-code-btn::after {
border: none;
}
.send-code-btn:disabled {
background: #ccc;
color: #999;
}
.hint-text {
display: block;
font-size: 24rpx;
color: #999;
margin-top: 12rpx;
}
.info-list {
background: #fff;
border-radius: 24rpx;

@ -0,0 +1,305 @@
<template>
<view class="verify-page">
<view class="fixed-nav" v-if="!isWeixinBrowser">
<NavBar title="验证备用手机号" />
</view>
<view class="content-area">
<view class="form-card">
<view class="form-title">备用手机号验证</view>
<view class="form-field">
<text class="form-label">备用手机号</text>
<input
class="form-input"
v-model="form.backup_phone"
type="number"
maxlength="11"
placeholder="请输入备用手机号"
/>
</view>
<view class="form-field">
<text class="form-label">验证码</text>
<view class="verify-code-row">
<input
class="form-input verify-code-input"
v-model="form.backup_phone_code"
type="number"
maxlength="6"
placeholder="请输入验证码"
/>
<button
class="send-code-btn"
:disabled="!canSendCode || countdown > 0"
@click="sendSmsCode"
>
{{ countdown > 0 ? countdown + '秒后重发' : '获取验证码' }}
</button>
</view>
</view>
</view>
<view class="submit-btn-wrapper">
<button class="submit-btn" @click="submitVerify"></button>
</view>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
name: 'VerifyBackupPhonePage',
components: { NavBar },
data() {
return {
isWeixinBrowser: false,
form: {
backup_phone: '',
backup_phone_code: ''
},
canSendCode: true,
countdown: 0,
countdownTimer: null
}
},
onLoad() {
// #ifdef H5
this.isWeixinBrowser = /MicroMessenger/i.test(navigator.userAgent)
// #endif
},
onUnload() {
//
if (this.countdownTimer) {
clearInterval(this.countdownTimer)
this.countdownTimer = null
}
},
methods: {
//
async sendSmsCode() {
//
const phoneReg = /^1\d{10}$/
if (!phoneReg.test(this.form.backup_phone)) {
uni.showToast({ title: '请输入正确的手机号', icon: 'none' })
return
}
if (!this.canSendCode || this.countdown > 0) {
return
}
const token = uni.getStorageSync('token')
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' })
return
}
try {
uni.showLoading({ title: '发送中...' })
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.PROFILE_SEND_PHONE_CODE}?token=${token}`,
method: 'POST',
data: {
phone: this.form.backup_phone,
type: 'backup_phone'
},
success: resolve,
fail: reject
})
})
uni.hideLoading()
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '验证码已发送', icon: 'success' })
//
this.canSendCode = false
this.countdown = 60
this.countdownTimer = setInterval(() => {
this.countdown--
if (this.countdown <= 0) {
clearInterval(this.countdownTimer)
this.countdownTimer = null
this.canSendCode = true
}
}, 1000)
} else {
uni.showToast({
title: (res.data && res.data.errmsg) || '发送失败',
icon: 'none'
})
}
} catch (e) {
uni.hideLoading()
uni.showToast({ title: '发送失败', icon: 'none' })
}
},
//
async submitVerify() {
//
const phoneReg = /^1\d{10}$/
if (!phoneReg.test(this.form.backup_phone)) {
uni.showToast({ title: '请输入正确的手机号', icon: 'none' })
return
}
if (!this.form.backup_phone_code || this.form.backup_phone_code.length !== 6) {
uni.showToast({ title: '请输入6位验证码', icon: 'none' })
return
}
const token = uni.getStorageSync('token')
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' })
return
}
try {
uni.showLoading({ title: '验证中...' })
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.UPDATE_USER_INFO}?token=${token}`,
method: 'POST',
data: {
backup_phone: this.form.backup_phone,
backup_phone_code: this.form.backup_phone_code
},
success: resolve,
fail: reject
})
})
uni.hideLoading()
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '验证成功', icon: 'success' })
setTimeout(() => {
uni.navigateBack()
}, 1500)
} else {
uni.showToast({
title: (res.data && res.data.errmsg) || '验证失败',
icon: 'none'
})
}
} catch (e) {
uni.hideLoading()
uni.showToast({ title: '验证失败', icon: 'none' })
}
}
}
}
</script>
<style scoped>
.verify-page {
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 32rpx;
}
.wechat-browser {
padding-top: 10rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.content-area {
padding-top: 90px;
padding-bottom: 20px;
}
.form-card {
background: #fff;
border-radius: 24rpx;
margin: 0 24rpx 32rpx 24rpx;
box-shadow: 0 4rpx 16rpx rgba(59,124,255,0.08);
padding: 32rpx 24rpx;
margin-top: 20px;
}
.form-title {
font-size: 32rpx;
font-weight: bold;
color: #222;
margin-bottom: 32rpx;
text-align: center;
}
.form-field {
margin-bottom: 32rpx;
}
.form-field:last-child {
margin-bottom: 0;
}
.form-label {
display: block;
font-size: 28rpx;
color: #666;
margin-bottom: 12rpx;
}
.form-input {
width: 100%;
height: 80rpx;
border-radius: 12rpx;
border: 1rpx solid #e5e6eb;
padding: 0 24rpx;
font-size: 28rpx;
box-sizing: border-box;
background: #fafafa;
}
.verify-code-row {
display: flex;
align-items: center;
gap: 16rpx;
}
.verify-code-input {
flex: 1;
}
.send-code-btn {
min-width: 180rpx;
height: 80rpx;
line-height: 80rpx;
border-radius: 12rpx;
background: #3b7cff;
color: #fff;
font-size: 24rpx;
border: none;
padding: 0 24rpx;
white-space: nowrap;
}
.send-code-btn::after {
border: none;
}
.send-code-btn:disabled {
background: #ccc;
color: #999;
}
.submit-btn-wrapper {
padding: 0 24rpx;
}
.submit-btn {
width: 100%;
height: 88rpx;
line-height: 88rpx;
border-radius: 44rpx;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%);
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
}
.submit-btn::after {
border: none;
}
</style>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save