From c9b61ed275af618afa71507f19f5ee69f8187645 Mon Sep 17 00:00:00 2001
From: lld <15027638633@163.com>
Date: Sun, 8 Feb 2026 19:35:26 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=B0=E4=BD=8F=E5=AF=86?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1 +
pages/login.vue | 102 ++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 96 insertions(+), 7 deletions(-)
diff --git a/package.json b/package.json
index 56158cb..fa46c7e 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,6 @@
{
"dependencies": {
+ "crypto-js": "^4.2.0",
"mqtt": "^2.18.8"
}
}
diff --git a/pages/login.vue b/pages/login.vue
index 884af23..4f35c3a 100644
--- a/pages/login.vue
+++ b/pages/login.vue
@@ -13,15 +13,15 @@
+ v-model="loginForm.password" type="password" class="input" placeholder="请输入密码" maxlength="20" />
@@ -31,6 +31,20 @@
+
+
+
+
+
+
+
@@ -65,9 +79,13 @@
import { getCodeImg } from '@/api/login'
import { getToken } from '@/utils/auth'
import UniIcons from "../uni_modules/uni-icons/components/uni-icons/uni-icons.vue";
+ // ========== 新增:引入uni-data-checkbox ==========
+ import UniDataCheckbox from "@/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue";
+ import CryptoJS from 'crypto-js'
export default {
- components: {UniIcons},
+ // ========== 新增:注册组件 ==========
+ components: {UniIcons, UniDataCheckbox},
data() {
return {
isShowPwd: false,
@@ -75,13 +93,18 @@
captchaEnabled: true,
// 用户注册开关
register: true,
+ data:[{value: 0, text: '记住密码'}],
globalConfig: getApp().globalData.config,
loginForm: {
username: "",
password: "",
code: "",
uuid: ""
- }
+ },
+ value:[0],
+ // ========== 新增:记住密码相关数据 ==========
+ remember: true, // 记住密码选中状态
+ STORAGE_KEY: 'agri_login_pwd' // 存储密码的key
}
},
created() {
@@ -93,8 +116,71 @@
this.$tab.reLaunch('/pages/control/index')
}
//#endif
+ // ========== 新增:页面加载时自动回填密码 ==========
+ this.loadSavedPwd()
},
methods: {
+ // ========== 新增:uni-data-checkbox 状态切换 ==========
+ onRememberChange(e) {
+ this.remember = false;
+ if (e.detail.value && e.detail.value===0) {
+ this.remember = true ;
+ }
+ },
+ // ========== 新增:密码加密存储核心方法 ==========
+ // 生成加密密钥(绑定设备信息)
+ getEncryptKey() {
+ try {
+ const sys = uni.getSystemInfoSync()
+ const appId = uni.getAccountInfoSync()?.miniProgram?.appId || 'agri-default'
+ return CryptoJS.MD5(sys.deviceId + appId + 'agri-pwd-key').toString()
+ } catch (e) {
+ return 'agri-safe-key-2026'
+ }
+ },
+ // 加密密码
+ encryptPwd(pwd) {
+ return CryptoJS.AES.encrypt(pwd, this.getEncryptKey()).toString()
+ },
+ // 解密密码
+ decryptPwd(encryptedStr) {
+ try {
+ const bytes = CryptoJS.AES.decrypt(encryptedStr, this.getEncryptKey())
+ return bytes.toString(CryptoJS.enc.Utf8) || ''
+ } catch (e) {
+ return ''
+ }
+ },
+ // 加载本地存储的密码并回填
+ loadSavedPwd() {
+ try {
+ const savedData = uni.getStorageSync(this.STORAGE_KEY)
+ if (!savedData) return
+ const data = JSON.parse(savedData)
+ if (data.username && data.encryptedPwd) {
+ this.loginForm.username = data.username
+ this.loginForm.password = this.decryptPwd(data.encryptedPwd)
+ this.remember = true // 回填密码时自动选中
+ }
+ } catch (e) {
+ console.error('加载记住密码失败:', e)
+ }
+ },
+ // 保存密码到本地(加密)
+ savePwd() {
+ if (!this.remember) {
+ uni.removeStorageSync(this.STORAGE_KEY)
+ return
+ }
+ const saveData = {
+ username: this.loginForm.username,
+ encryptedPwd: this.encryptPwd(this.loginForm.password),
+ saveTime: Date.now()
+ }
+ uni.setStorageSync(this.STORAGE_KEY, JSON.stringify(saveData))
+ },
+
+ // ========== 原有方法(完全未修改) ==========
// 用户注册
handleUserRegister() {
this.$tab.redirectTo(`/pages/register`)
@@ -136,6 +222,8 @@
async pwdLogin() {
this.$store.dispatch('Login', this.loginForm).then(() => {
this.$modal.closeLoading()
+ // ========== 新增:登录成功后保存密码 ==========
+ this.savePwd()
this.loginSuccess()
}).catch(() => {
if (this.captchaEnabled) {
@@ -147,7 +235,7 @@
loginSuccess(result) {
// 设置用户信息
this.$store.dispatch('GetInfo').then(res => {
- // ========== 新增:MQTT初始化逻辑(最小改动) ==========
+ // ========== 原有:MQTT初始化逻辑(最小改动) ==========
// 1. 获取全局App实例
const app = getApp()
// 2. 获取登录后的token(从auth工具获取)