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
- 欢迎回来
- 请使用手机号快捷登录
+ 欢迎登录
+ 请输入您的手机号密码
-
-
@@ -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)
}
// 获取手机号接口