From 0acae99616b34849022307acbe6b0d15c99527df Mon Sep 17 00:00:00 2001 From: ZhaoYang <565837861@qq.com> Date: Thu, 19 Mar 2026 17:27:42 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E7=99=BB=E5=BD=95=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/home/home.js | 5 - pages/home/home.wxml | 2 +- pages/images/mm.png | Bin 0 -> 4103 bytes pages/images/zh.png | Bin 0 -> 3430 bytes pages/login/login.js | 377 +++++++++++++++++----------- pages/login/login.wxml | 90 +++++-- pages/login/login.wxss | 479 ++++++++++++++++++++++++------------ project.private.config.json | 2 +- utils/api.js | 2 +- 9 files changed, 633 insertions(+), 324 deletions(-) create mode 100644 pages/images/mm.png create mode 100644 pages/images/zh.png diff --git a/pages/home/home.js b/pages/home/home.js index 9fbf1d3..0a20f75 100644 --- a/pages/home/home.js +++ b/pages/home/home.js @@ -169,11 +169,6 @@ Page({ - // 查看所有问题 - viewAllQuestions() { - this.bindwdlist() - }, - // 获取当前位置信息 getLocation() { let that = this; diff --git a/pages/home/home.wxml b/pages/home/home.wxml index c4cfc69..9f3f067 100644 --- a/pages/home/home.wxml +++ b/pages/home/home.wxml @@ -87,7 +87,7 @@ 在线问答 看看其他养殖户遇到的问题 - + 查看全部 diff --git a/pages/images/mm.png b/pages/images/mm.png new file mode 100644 index 0000000000000000000000000000000000000000..4fec3b71ec99baefbe70c4381cd084e8df120cd5 GIT binary patch literal 4103 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 IM6N<$g488T?EnA( literal 0 HcmV?d00001 diff --git a/pages/login/login.js b/pages/login/login.js index 3b8de5f..dd7a5ed 100644 --- a/pages/login/login.js +++ b/pages/login/login.js @@ -1,199 +1,288 @@ import http from '../../utils/api' + Page({ data: { - isAgree: true, // 是否同意协议 - showAgreementModal: false, // 是否显示协议弹窗 - modalTitle: '', // 弹窗标题 - modalContent: '', // 弹窗内容 - isLoading: false, // 是否显示加载中, - phoneData: {}, + // 账号密码 + account: '', + password: '', + accountFocus: false, + passwordFocus: false, + passwordVisible: false, + + // 协议相关 + isAgree: true, + showAgreementModal: false, + modalTitle: '', + modalContent: '', + + + // 加载状态 + isLoading: false, + + // 登录状态 + canLogin: false }, onLoad() { - this.login() + // 检查登录状态 + // this.checkLoginStatus() }, + // 检查登录状态 + // checkLoginStatus() { + // const token = wx.getStorageSync('token') + // if (token) { + // // 已登录,跳转到首页 + // wx.switchTab({ + // url: '/pages/home/home' + // }) + // } + // }, - // 登录获取 - login() { - // 小程序接口 - var that = this - wx.login({ - success(res) { - //登录接口 - http.login({ - data: { - code: res.code, - clientType: 'vet-app' - }, - success: function (res) { - console.log(111111,res); - if (res.data) { - that.setData({ - phoneData: res.data - }) - wx.showToast({ - title: res.data.message, - icon: 'none', - duration: 2000 - }); - } + // 账号输入 + onAccountInput(e) { + this.setData({ + account: e.detail.value + }, () => { + this.checkCanLogin() + }) + }, - if (res.data.token) { - wx.setStorageSync('token', res.data.token) - wx.switchTab({ - url: '/pages/home/home' - }); - } - }, + // 密码输入 + onPasswordInput(e) { + this.setData({ + password: e.detail.value + }, () => { + this.checkCanLogin() + }) + }, - }) - }, - fail: (error) => { - console.log('登录失败!' + error); - } + // 检查是否可以登录 + checkCanLogin() { + const { account, password, isAgree } = this.data + this.setData({ + canLogin: account.length >= 4 && password.length >= 6 && isAgree }) }, + // 账号焦点 + onAccountFocus() { + this.setData({ accountFocus: true }) + }, + onAccountBlur() { + this.setData({ accountFocus: false }) + }, - // 获取用户手机号 - getPhoneNumber(e) { - if (!this.data.isAgree) { + // 密码焦点 + onPasswordFocus() { + this.setData({ passwordFocus: true }) + }, + + onPasswordBlur() { + this.setData({ passwordFocus: false }) + }, + + // 聚焦密码输入框 + focusPassword() { + this.setData({ passwordFocus: true }) + }, + + // 切换密码可见性 - 修复版 + togglePasswordVisible(e) { + // 阻止事件冒泡 + if (e && e.stopPropagation) { + e.stopPropagation() + } + + this.setData({ + passwordVisible: !this.data.passwordVisible + }) + + }, + + // 切换协议同意状态 + toggleAgreement() { + this.setData({ + isAgree: !this.data.isAgree + }, () => { + this.checkCanLogin() + }) + }, + + // 处理登录 + handleLogin() { + const { account, password, isAgree } = this.data + + if (!isAgree) { wx.showToast({ - title: '请先同意协议', + title: '请先同意用户协议', icon: 'none', duration: 2000 - }); - return; + }) + return } - // 显示加载中 - this.setData({ - isLoading: true - }); - - // 检查是否获取到手机号 - if (e.detail.errMsg === "getPhoneNumber:ok") { - // 这里应该将加密数据发送到后端进行解密 - this.data.phoneData.encryptedData = e.detail.encryptedData - this.data.phoneData.iv = e.detail.iv - http.getPhoneNumber({ - data: this.data.phoneData, - success: res => { - if (res.code == 200) { - wx.setStorageSync('token', res.token) - - setTimeout(() => { - wx.switchTab({ - url: '/pages/home/home' - }); - }, 1500); - - this.setData({ - isLoading: false - }) - wx.showToast({ - title: '登录成功', - icon: 'success', - duration: 2000 - }); - }else{ - wx.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - this.setData({ - isLoading:false - }) - } - } + if (!account || !password) { + wx.showToast({ + title: '请输入账号和密码', + icon: 'none', + duration: 2000 }) - } else { - // 用户拒绝授权 - this.setData({ - isLoading: false - }); + return + } + if (account.length < 4) { wx.showToast({ - title: '需要手机号授权才能登录', + title: '账号长度不能小于4位', icon: 'none', duration: 2000 - }); + }) + return } - }, - // 切换协议同意状态 - toggleAgreement() { - this.setData({ - isAgree: !this.data.isAgree - }); + if (password.length < 6) { + wx.showToast({ + title: '密码长度不能小于6位', + icon: 'none', + duration: 2000 + }) + return + } + + // 显示加载中 + this.setData({ isLoading: true }) + + // 调用登录接口 + http.login({ + data: { + phone: account, + password: password, + clientType:'wechat_vet' + }, + success: (res) => { + this.setData({ isLoading: false }) + + if (res.code === 200 && res.token) { + // 保存token + wx.setStorageSync('token', res.token) + + wx.showToast({ + title: '登录成功', + icon: 'success', + duration: 1500, + success: () => { + setTimeout(() => { + wx.switchTab({ + url: '/pages/home/home' + }) + }, 1500) + } + }) + } else { + wx.showToast({ + title: res.msg || '登录失败,请检查账号密码', + icon: 'none', + duration: 2000 + }) + } + }, + fail: (error) => { + this.setData({ isLoading: false }) + wx.showToast({ + title: '网络错误,请稍后重试', + icon: 'none', + duration: 2000 + }) + console.error('登录失败:', error) + } + }) }, + + + + // 显示用户协议 showAgreement() { - const content = `欢迎您使用与牧同行服务! + const content = `兽医助手用户协议 +欢迎使用兽医助手! + 一、服务说明 -与牧同行为您提供智慧放牧管理、牲畜追踪、草场监测等服务。通过我们的平台,您可以更高效地管理牧场资源,提升放牧效率。 -二、账号注册 -1. 您需要使用手机号完成注册 -2. 您应保证提供的信息真实、准确、完整 -3. 您对账号安全负全部责任 -三、使用规范 -1. 不得利用本服务从事任何违法违规活动 -2. 不得干扰或破坏本服务的正常运行 -3. 遵守相关法律法规和平台规则 -四、服务变更与终止 -我们可能根据需要变更服务内容,如您不同意变更,可停止使用本服务。 -五、免责声明 -对于不可抗力、网络问题等导致的服务中断,我们不承担相应责任。 -六、法律适用 -本协议受中华人民共和国法律管辖。 -感谢您选择与牧同行!`; +兽医助手是为兽医专业人士提供的工作辅助平台,包括病例管理、诊疗记录、药品查询等功能。 + +二、账号使用 +1. 您需要使用真实信息注册账号 +2. 账号仅限本人使用,不得转借他人 +3. 您对账号下的所有行为负责 + +三、信息规范 +1. 请确保录入的诊疗信息真实准确 +2. 尊重动物主人隐私,不得泄露客户信息 +3. 遵守医疗行业规范和职业道德 + +四、责任声明 +1. 本平台提供的诊疗建议仅供参考 +2. 最终诊疗方案由执业兽医自行判断 +3. 平台不承担任何医疗责任 + +五、服务变更 +我们保留修改服务条款的权利,修改后会通过公告通知。 + +感谢您使用兽医助手!` this.setData({ showAgreementModal: true, modalTitle: '用户协议', modalContent: content - }); + }) }, // 显示隐私政策 showPrivacy() { - const content = `与牧同行隐私政策 -我们深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。 -一、我们如何收集和使用您的个人信息 -我们仅会出于本政策所述的以下目的,收集和使用您的个人信息: -1. 账号注册:手机号 -2. 服务提供:位置信息、设备信息 -3. 安全保障:登录日志、操作记录 -二、我们如何共享、转让、公开披露您的个人信息 -1. 我们不会与任何公司、组织和个人共享您的个人信息 -2. 我们不会将您的个人信息转让给任何公司、组织和个人 -3. 我们仅会在法律要求的情况下公开披露您的个人信息 -三、我们如何保护您的个人信息 -1. 我们已使用符合业界标准的安全防护措施保护您提供的个人信息 -2. 我们会采取合理可行的措施,确保未收集无关的个人信息 -四、您的权利 -您有权访问、更正、删除您的个人信息,以及改变您授权同意的范围或撤回授权。 -五、我们如何处理儿童的个人信息 -我们的服务主要面向成人。如果没有父母或监护人的同意,儿童不应创建自己的个人信息主体账户。 -六、本政策如何更新 -我们可能适时修订本政策内容,并通过公告等方式通知您。 -如有任何疑问,请通过客服渠道联系我们。`; + const content = `兽医助手隐私政策 +我们重视您的隐私保护 + +一、信息收集 +我们收集以下必要信息: +1. 账号信息:手机号、姓名、执业证书编号 +2. 使用信息:登录日志、操作记录 +3. 设备信息:设备型号、系统版本 + +二、信息使用 +1. 用于提供兽医诊疗辅助服务 +2. 优化和改进服务质量 +3. 保障账号安全 + +三、信息保护 +1. 采用加密技术保护数据 +2. 严格控制访问权限 +3. 定期进行安全审计 + +四、信息共享 +1. 未经您同意,不向第三方共享信息 +2. 法律要求的情况除外 +3. 可能用于统计分析(匿名化处理) + +五、您的权利 +1. 访问、更正您的个人信息 +2. 注销账号 +3. 撤回授权 + +六、联系我们 +如有疑问,请通过客服渠道联系我们` this.setData({ showAgreementModal: true, modalTitle: '隐私政策', modalContent: content - }); + }) }, // 隐藏弹窗 hideModal() { this.setData({ showAgreementModal: false - }); + }) } }) \ No newline at end of file diff --git a/pages/login/login.wxml b/pages/login/login.wxml index 10336ad..7031851 100644 --- a/pages/login/login.wxml +++ b/pages/login/login.wxml @@ -6,15 +6,14 @@ - + - - - - + 🐾 + 💊 + 🏥 @@ -28,24 +27,83 @@ - 与牧同行 + 牧医通 + Veterinary Assistant @@ -66,7 +124,7 @@ - + diff --git a/pages/login/login.wxss b/pages/login/login.wxss index 0e8bf36..b424885 100644 --- a/pages/login/login.wxss +++ b/pages/login/login.wxss @@ -5,7 +5,7 @@ width: 100%; position: relative; overflow: hidden; - background: linear-gradient(180deg, #f8fafc 0%, #f0f9ff 100%); + background: linear-gradient(180deg, #f0f9ff 0%, #e6f3fe 100%); } /* 波浪背景 */ @@ -14,7 +14,7 @@ top: 0; left: 0; width: 100%; - height: 400rpx; + height: 450rpx; overflow: hidden; } @@ -23,39 +23,43 @@ bottom: 0; width: 200%; height: 100%; - background: linear-gradient(90deg, #86D8D0 0%, #A8E6CF 100%); + background: linear-gradient(135deg, #4A90E2 0%, #67B26F 100%); border-radius: 0 0 50% 50%; - animation: waveMove 15s linear infinite; + animation: waveMove 15s ease-in-out infinite; } .wave-1 { - opacity: 0.7; + opacity: 0.8; animation-delay: 0s; } .wave-2 { opacity: 0.5; animation-delay: 5s; - background: linear-gradient(90deg, #7ACCC4 0%, #98D6C6 100%); + background: linear-gradient(135deg, #5A9FE2 0%, #77C27F 100%); } .wave-3 { opacity: 0.3; animation-delay: 10s; - background: linear-gradient(90deg, #6EC0B8 0%, #88C6BD 100%); + background: linear-gradient(135deg, #6AAFE2 0%, #87D28F 100%); } @keyframes waveMove { 0% { transform: translateX(0) rotate(0deg); } - + 25% { + transform: translateX(-15%) rotate(1deg); + } 50% { - transform: translateX(-25%) rotate(1deg); + transform: translateX(-25%) rotate(0deg); + } + 75% { + transform: translateX(-15%) rotate(-1deg); } - 100% { - transform: translateX(-50%) rotate(0deg); + transform: translateX(0) rotate(0deg); } } @@ -69,108 +73,85 @@ .cloud { position: absolute; - background-color: rgba(255, 255, 255, 0.9); + background: rgba(255, 255, 255, 0.9); border-radius: 100rpx; + filter: blur(2rpx); } .cloud-1 { - width: 120rpx; - height: 40rpx; + width: 140rpx; + height: 45rpx; top: 120rpx; - left: 10%; - box-shadow: - 20rpx 0 0 0 rgba(255, 255, 255, 0.9), - 40rpx 0 0 0 rgba(255, 255, 255, 0.9); + left: 8%; + box-shadow: + 25rpx 0 0 0 rgba(255, 255, 255, 0.9), + 50rpx 0 0 0 rgba(255, 255, 255, 0.9); + animation: floatCloud 20s infinite; } .cloud-2 { - width: 90rpx; - height: 30rpx; + width: 100rpx; + height: 35rpx; top: 80rpx; - right: 15%; - box-shadow: - 15rpx 0 0 0 rgba(255, 255, 255, 0.9), - 30rpx 0 0 0 rgba(255, 255, 255, 0.9); + right: 12%; + box-shadow: + 18rpx 0 0 0 rgba(255, 255, 255, 0.9), + 36rpx 0 0 0 rgba(255, 255, 255, 0.9); + animation: floatCloud 25s infinite reverse; } .cloud-3 { - width: 70rpx; - height: 25rpx; + width: 80rpx; + height: 28rpx; top: 180rpx; - left: 70%; - box-shadow: - 12rpx 0 0 0 rgba(255, 255, 255, 0.9), - 24rpx 0 0 0 rgba(255, 255, 255, 0.9); -} - -.grass { - position: absolute; - bottom: 0; - width: 8rpx; - background-color: #86D8D0; - border-radius: 4rpx 4rpx 0 0; -} - -.grass-1 { - height: 80rpx; - left: 20%; -} - -.grass-2 { - height: 60rpx; - left: 35%; + left: 65%; + box-shadow: + 14rpx 0 0 0 rgba(255, 255, 255, 0.9), + 28rpx 0 0 0 rgba(255, 255, 255, 0.9); + animation: floatCloud 18s infinite; } -.grass-3 { - height: 100rpx; - left: 50%; +@keyframes floatCloud { + 0%, 100% { + transform: translateX(0); + } + 50% { + transform: translateX(30rpx); + } } -.grass:before, -.grass:after { - content: ''; +.medical-icon { position: absolute; - width: 8rpx; - background-color: #86D8D0; - border-radius: 4rpx; + font-size: 60rpx; + opacity: 0.2; + animation: floatIcon 6s ease-in-out infinite; } -.grass:before { - height: 40rpx; - transform: rotate(-30deg); - top: -20rpx; - left: -10rpx; +.icon-1 { + top: 200rpx; + left: 15%; + animation-delay: 0s; } -.grass:after { - height: 30rpx; - transform: rotate(30deg); - top: -15rpx; - right: -10rpx; +.icon-2 { + bottom: 200rpx; + right: 15%; + animation-delay: 1s; } -.sheep { - position: absolute; - bottom: 120rpx; - right: 20%; - width: 80rpx; - height: 50rpx; - background-color: white; - border-radius: 50%; - box-shadow: - -15rpx -10rpx 0 0 white, - 15rpx -8rpx 0 0 white; +.icon-3 { + bottom: 300rpx; + left: 20%; + animation-delay: 2s; } -.sheep:before { - content: ''; - position: absolute; - width: 20rpx; - height: 20rpx; - background-color: #333; - border-radius: 50%; - top: -5rpx; - left: 15rpx; +@keyframes floatIcon { + 0%, 100% { + transform: translateY(0) rotate(0deg); + } + 50% { + transform: translateY(-20rpx) rotate(5deg); + } } /* 主要内容区域 */ @@ -181,7 +162,8 @@ display: flex; flex-direction: column; padding: 0 60rpx; - padding-top: 120rpx; + padding-top: 100rpx; + box-sizing: border-box; } /* Logo区域 */ @@ -189,24 +171,32 @@ display: flex; flex-direction: column; align-items: center; - margin-bottom: 120rpx; + margin-bottom: 60rpx; + animation: logoAppear 1s ease-out; } -.logo-container { - margin-bottom: 40rpx; +@keyframes logoAppear { + 0% { + opacity: 0; + transform: scale(0.8); + } + 100% { + opacity: 1; + transform: scale(1); + } } .logo-circle { - width: 180rpx; - height: 180rpx; + width: 160rpx; + height: 160rpx; border-radius: 50%; - background: linear-gradient(135deg, #86D8D0 0%, #6BC4BC 100%); + background: linear-gradient(135deg, #4A90E2, #67B26F); display: flex; align-items: center; justify-content: center; - box-shadow: - 0 20rpx 40rpx rgba(134, 216, 208, 0.3), - inset 0 -4rpx 8rpx rgba(107, 196, 188, 0.4), + box-shadow: + 0 20rpx 40rpx rgba(74, 144, 226, 0.3), + inset 0 -4rpx 8rpx rgba(0, 0, 0, 0.1), inset 0 4rpx 8rpx rgba(255, 255, 255, 0.8); position: relative; } @@ -214,87 +204,173 @@ .logo-circle:before { content: ''; position: absolute; - width: 160rpx; - height: 160rpx; + width: 140rpx; + height: 140rpx; border-radius: 50%; - border: 2rpx solid rgba(255, 255, 255, 0.3); + border: 2rpx solid rgba(255, 255, 255, 0.5); } .logo-inner { - width: 140rpx; - height: 140rpx; + width: 120rpx; + height: 120rpx; border-radius: 50%; background: white; display: flex; align-items: center; justify-content: center; - box-shadow: - inset 0 4rpx 8rpx rgba(134, 216, 208, 0.2), - 0 4rpx 8rpx rgba(0, 0, 0, 0.1); + box-shadow: inset 0 2rpx 10rpx rgba(0, 0, 0, 0.1); } .logo-text { - font-size: 64rpx; + font-size: 70rpx; font-weight: bold; - color: #86D8D0; - letter-spacing: 4rpx; + line-height: 1; } .app-title { - font-size: 56rpx; + font-size: 48rpx; font-weight: 700; - color: #333; - margin-bottom: 16rpx; + color: #2c3e50; + margin-bottom: 8rpx; letter-spacing: 2rpx; + text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1); } - +.app-subtitle { + font-size: 24rpx; + color: #7f8c8d; + letter-spacing: 4rpx; + text-transform: uppercase; +} /* 登录区域 */ .login-section { display: flex; flex-direction: column; align-items: center; + flex: 1; } .welcome-text { text-align: center; - margin-bottom: 80rpx; + margin-bottom: 60rpx; + animation: slideUp 0.8s ease-out; +} + +@keyframes slideUp { + 0% { + opacity: 0; + transform: translateY(30rpx); + } + 100% { + opacity: 1; + transform: translateY(0); + } } .welcome-main { display: block; - font-size: 44rpx; + font-size: 40rpx; font-weight: 600; - color: #333; - margin-bottom: 16rpx; + color: #2c3e50; + margin-bottom: 12rpx; } .welcome-desc { display: block; + font-size: 26rpx; + color: #95a5a6; +} + +/* 输入框组 */ +.input-group { + width: 100%; + margin-bottom: 40rpx; + animation: slideUp 0.8s ease-out 0.1s both; +} + +.input-wrapper { + display: flex; + align-items: center; + background: white; + border-radius: 60rpx; + padding: 0 30rpx; + margin-bottom: 30rpx; + transition: all 0.3s ease; +} + +.input-wrapper.input-focused { + border-color: #4A90E2; + box-shadow: 0 8rpx 20rpx rgba(74, 144, 226, 0.15); + transform: translateY(-2rpx); +} + +.input-icon { + margin-right: 20rpx; + opacity: 0.7; + width: 40rpx; + height: 40rpx; +} + +.input-wrapper input { + flex: 1; + height: 90rpx; + font-size: 28rpx; + color: #2c3e50; +} + +.input-placeholder { + color: #bdc3c7; font-size: 28rpx; - color: #888; - font-weight: 300; } -/* 手机号登录按钮 */ -.phone-login-btn { +.password-toggle { + padding: 20rpx; + font-size: 36rpx; + opacity: 0.6; + transition: opacity 0.3s ease; + /* 提高点击区域 */ + min-width: 80rpx; + display: flex; + align-items: center; + justify-content: center; + /* 防止事件冒泡 */ + z-index: 10; +} + +.password-toggle:active { + opacity: 1; + transform: scale(1.1); +} + +/* 登录按钮 */ +.login-btn { width: 100%; height: 100rpx; border-radius: 50rpx; - background: linear-gradient(to right, #86D8D0, #6BC4BC); - box-shadow: - 0 12rpx 24rpx rgba(134, 216, 208, 0.3), - 0 4rpx 12rpx rgba(0, 0, 0, 0.08); - margin-bottom: 50rpx; + background: linear-gradient(135deg, #4A90E2, #67B26F); + box-shadow: 0 12rpx 30rpx rgba(74, 144, 226, 0.3); + margin-bottom: 40rpx; transition: all 0.3s ease; + animation: slideUp 0.8s ease-out 0.2s both; + border: none; + padding: 0; + line-height: 100rpx; +} +.login-btn::after{ + border: none; } -.phone-btn-hover { - transform: translateY(-4rpx); - box-shadow: - 0 16rpx 32rpx rgba(134, 216, 208, 0.4), - 0 6rpx 16rpx rgba(0, 0, 0, 0.12); +.login-btn.btn-disabled { + opacity: 0.5; + background: #bdc3c7; + box-shadow: none; + pointer-events: none; +} + +.btn-hover { + transform: translateY(-4rpx) scale(1.02); + box-shadow: 0 16rpx 40rpx rgba(74, 144, 226, 0.4); } .btn-inner { @@ -302,20 +378,47 @@ align-items: center; justify-content: center; height: 100%; + width: 100%; } -.btn-inner image { - width: 45rpx; - height: 45rpx; - padding: 0 20rpx; -} - - .btn-text { color: white; font-size: 34rpx; - font-weight: 500; - letter-spacing: 2rpx; + font-weight: 600; + letter-spacing: 4rpx; +} + +/* 其他选项 */ +.options-section { + width: 100%; + display: flex; + justify-content: center; + margin-bottom: 30rpx; + animation: slideUp 0.8s ease-out 0.3s both; +} + +.option-item { + padding: 0 25rpx; + position: relative; +} + +.option-item:not(:last-child):after { + content: '|'; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + color: #e0e0e0; +} + +.option-text { + font-size: 26rpx; + color: #7f8c8d; + transition: color 0.3s ease; +} + +.option-item:active .option-text { + color: #4A90E2; } /* 协议确认 */ @@ -323,13 +426,14 @@ display: flex; align-items: center; justify-content: center; + animation: slideUp 0.8s ease-out 0.4s both; } .agreement-checkbox { - width: 30rpx; - height: 30rpx; - border: 2rpx solid #ccc; - border-radius: 6rpx; + width: 32rpx; + height: 32rpx; + border: 2rpx solid #bdc3c7; + border-radius: 8rpx; margin-right: 16rpx; display: flex; align-items: center; @@ -338,8 +442,8 @@ } .agreement-checkbox.checked { - background-color: #86D8D0; - border-color: #86D8D0; + background: linear-gradient(135deg, #4A90E2, #67B26F); + border-color: transparent; } .checkmark { @@ -350,13 +454,17 @@ .agreement-text { font-size: 24rpx; - color: #888; - display: flex; - align-items: center; + color: #7f8c8d; } .link { - color: #86D8D0; + color: #4A90E2; + display: inline; + padding: 0 4rpx; +} + +.link:active { + opacity: 0.7; } /* 底部装饰 */ @@ -375,20 +483,19 @@ left: 0; width: 200%; height: 200%; - background: linear-gradient(90deg, #86D8D0 0%, #A8E6CF 100%); + background: linear-gradient(90deg, #4A90E2, #67B26F); border-radius: 50% 50% 0 0; animation: bottomWave 20s linear infinite; + opacity: 0.2; } @keyframes bottomWave { 0% { transform: translateX(0) rotate(0deg); } - 50% { transform: translateX(-25%) rotate(0.5deg); } - 100% { transform: translateX(-50%) rotate(0deg); } @@ -444,6 +551,11 @@ font-size: 48rpx; color: #999; line-height: 1; + padding: 0 20rpx; +} + +.modal-close:active { + color: #666; } .modal-body { @@ -457,6 +569,63 @@ color: #666; line-height: 1.8; padding: 20rpx 0; + white-space: pre-line; +} + +/* 忘记密码弹窗内容 */ +.forgot-tip { + font-size: 32rpx; + color: #333; + font-weight: 500; + margin-bottom: 40rpx; + text-align: center; +} + +.contact-info { + background: #f8f9fa; + border-radius: 16rpx; + padding: 30rpx; + margin-bottom: 40rpx; +} + +.contact-item { + display: flex; + justify-content: center; + margin-bottom: 20rpx; + font-size: 28rpx; +} + +.contact-item:last-child { + margin-bottom: 0; +} + +.contact-label { + color: #999; + margin-right: 20rpx; +} + +.contact-value { + color: #333; + font-weight: 500; +} + +.contact-btn { + width: 80%; + height: 80rpx; + border-radius: 40rpx; + background: linear-gradient(135deg, #4A90E2, #67B26F); + color: white; + font-size: 32rpx; + font-weight: 500; + margin: 0 auto; + display: flex; + align-items: center; + justify-content: center; + border: none; +} + +.contact-btn:active { + opacity: 0.8; } /* 加载提示 */ @@ -482,8 +651,8 @@ .loading-spinner { width: 80rpx; height: 80rpx; - border: 6rpx solid rgba(134, 216, 208, 0.2); - border-top-color: #86D8D0; + border: 6rpx solid rgba(74, 144, 226, 0.2); + border-top-color: #4A90E2; border-radius: 50%; animation: loadingSpin 1s linear infinite; margin-bottom: 30rpx; @@ -493,7 +662,6 @@ 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } @@ -502,5 +670,4 @@ .loading-text { font-size: 28rpx; color: #fff; - font-weight: 300; } \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json index bcfa452..d4bd5d0 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -4,7 +4,7 @@ "setting": { "compileHotReLoad": true, "skylineRenderEnable": true, - "urlCheck": false, + "urlCheck": true, "coverView": true, "lazyloadPlaceholderEnable": false, "preloadBackgroundData": false, diff --git a/utils/api.js b/utils/api.js index 6a9704e..0decfca 100644 --- a/utils/api.js +++ b/utils/api.js @@ -3,7 +3,7 @@ import { http } from './http'; // 引入刚刚封装好的http模块,import属 // 授权登录接口 function login(params) { - http('/auth/wechat/login', 'post', params) + http('/auth/phone/login', 'post', params) } // 获取手机号接口