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 0000000..4fec3b7 Binary files /dev/null and b/pages/images/mm.png differ diff --git a/pages/images/zh.png b/pages/images/zh.png new file mode 100644 index 0000000..a8bb5c4 Binary files /dev/null and b/pages/images/zh.png differ 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 - 欢迎回来 - 请使用手机号快捷登录 + 欢迎登录 + 请输入您的手机号密码 - - + + + + 用户协议 + + + 隐私政策 + + + 忘记密码 + + + @@ -53,9 +111,9 @@ 我已阅读并同意 - 《用户协议》 - 和 - 《隐私政策》 + 《用户协议》 + 和 + 《隐私政策》 @@ -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) } // 获取手机号接口