231 lines
6.7 KiB
JavaScript
231 lines
6.7 KiB
JavaScript
/**
|
||
* 用户认证管理 Mixin
|
||
*/
|
||
import { getToken } from '../utils/api';
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
phone: '',
|
||
password: '',
|
||
isLoggedIn: false,
|
||
loginButtonText: '登录',
|
||
userName: '',
|
||
remainingDays: null,
|
||
snCode: '',
|
||
deviceId: '-',
|
||
listenChannel: '-',
|
||
userMenuInfo: {
|
||
userName: '',
|
||
snCode: ''
|
||
}
|
||
};
|
||
},
|
||
methods: {
|
||
async loadSavedConfig() {
|
||
try {
|
||
// 从 store 加载保存的手机号
|
||
if (this.$store) {
|
||
const savedPhone = this.$store.state.config.phone || this.$store.state.auth.phone;
|
||
if (savedPhone) {
|
||
this.phone = savedPhone;
|
||
}
|
||
}
|
||
|
||
// 注意:现在数据都在 store 中,通过持久化插件自动恢复
|
||
// 如果需要从主进程同步数据,可以在这里调用,但通常不需要
|
||
// 因为登录成功后已经通过 syncUserInfo 同步到主进程了
|
||
} catch (error) {
|
||
console.error('加载配置失败:', error);
|
||
if (this.addLog) {
|
||
this.addLog('error', `加载配置失败: ${error.message}`);
|
||
}
|
||
}
|
||
},
|
||
|
||
// checkActivationStatus 方法已移除
|
||
// 现在登录状态由 Vuex Store 管理,通过持久化插件自动恢复
|
||
// 不再需要从主进程获取状态
|
||
|
||
// 用户登录(只调用主进程接口,业务逻辑由主进程处理)
|
||
async userLogin(password, rememberMe = true) {
|
||
// 基本验证
|
||
if (!this.phone) {
|
||
if (this.addLog) {
|
||
this.addLog('error', '请输入手机号');
|
||
}
|
||
return { success: false, error: '请输入手机号' };
|
||
}
|
||
|
||
if (!password) {
|
||
if (this.addLog) {
|
||
this.addLog('error', '请输入密码');
|
||
}
|
||
return { success: false, error: '请输入密码' };
|
||
}
|
||
|
||
if (!window.electronAPI) {
|
||
if (this.addLog) {
|
||
this.addLog('error', 'Electron API不可用');
|
||
}
|
||
return { success: false, error: 'Electron API不可用' };
|
||
}
|
||
|
||
try {
|
||
if (this.addLog) {
|
||
this.addLog('info', `正在使用手机号 ${this.phone} 登录...`);
|
||
}
|
||
|
||
const result = await window.electronAPI.invoke('auth:login', {
|
||
phone: this.phone,
|
||
password: password
|
||
});
|
||
|
||
if (result.success && result.data) {
|
||
// 登录成功,通过 store 更新状态(业务逻辑由主进程处理)
|
||
if (this.$store) {
|
||
await this.$store.dispatch('auth/login', {
|
||
phone: this.phone,
|
||
password: password,
|
||
deviceId: result.data.device_id || ''
|
||
});
|
||
|
||
if (rememberMe) {
|
||
this.$store.dispatch('config/setRememberMe', true);
|
||
this.$store.dispatch('config/setPhone', this.phone);
|
||
}
|
||
}
|
||
|
||
// MQTT 连接由主进程自动处理,这里只检查状态
|
||
if (this.checkMQTTStatus) {
|
||
setTimeout(() => {
|
||
this.checkMQTTStatus();
|
||
}, 1000);
|
||
}
|
||
|
||
// 开始获取任务状态
|
||
if (this.startTaskStatusUpdate) {
|
||
this.startTaskStatusUpdate();
|
||
}
|
||
|
||
return { success: true, data: result.data };
|
||
} else {
|
||
if (this.addLog) {
|
||
this.addLog('error', `登录失败: ${result.error || '未知错误'}`);
|
||
}
|
||
return { success: false, error: result.error || '未知错误' };
|
||
}
|
||
} catch (error) {
|
||
if (this.addLog) {
|
||
this.addLog('error', `登录过程中发生错误: ${error.message}`);
|
||
}
|
||
return { success: false, error: error.message };
|
||
}
|
||
},
|
||
|
||
async tryAutoLogin() {
|
||
try {
|
||
if (!this.$store) {
|
||
return false;
|
||
}
|
||
|
||
// 从 store 检查是否有保存的登录信息
|
||
const savedPhone = this.$store.state.config.phone || this.$store.state.auth.phone;
|
||
const userLoggedOut = this.$store.state.config.userLoggedOut || this.$store.state.auth.userLoggedOut;
|
||
|
||
// 如果用户手动退出,不自动登录
|
||
if (userLoggedOut) {
|
||
return false;
|
||
}
|
||
|
||
if (!savedPhone) {
|
||
return false;
|
||
}
|
||
|
||
|
||
// 检查 store 中是否有有效的登录信息(token 和用户信息)
|
||
const token = getToken();
|
||
const storeSnCode = this.$store ? this.$store.state.auth.snCode : '';
|
||
const storeUserName = this.$store ? this.$store.state.auth.userName : '';
|
||
|
||
// 如果有 token 和用户信息,说明已登录(数据已通过持久化插件恢复)
|
||
if (token && (storeSnCode || storeUserName)) {
|
||
// 更新登录状态
|
||
this.$store.commit('auth/SET_LOGGED_IN', true);
|
||
this.$store.commit('auth/SET_LOGIN_BUTTON_TEXT', '注销登录');
|
||
|
||
if (this.addLog) {
|
||
this.addLog('info', '自动登录成功');
|
||
}
|
||
|
||
// 连接MQTT
|
||
// MQTT 连接由主进程自动处理,这里只检查状态
|
||
if (this.checkMQTTStatus) {
|
||
setTimeout(() => {
|
||
this.checkMQTTStatus();
|
||
}, 1000);
|
||
}
|
||
|
||
return true; // 自动登录成功
|
||
}
|
||
|
||
return false; // 未登录
|
||
} catch (error) {
|
||
console.error('自动登录失败:', error);
|
||
if (this.addLog) {
|
||
this.addLog('error', `自动登录失败: ${error.message}`);
|
||
}
|
||
return false;
|
||
}
|
||
},
|
||
|
||
// 注销登录(只调用主进程接口,业务逻辑由主进程处理)
|
||
async logoutDevice() {
|
||
if (!window.electronAPI) {
|
||
if (this.addLog) {
|
||
this.addLog('error', 'Electron API不可用');
|
||
}
|
||
return;
|
||
}
|
||
|
||
try {
|
||
if (this.addLog) {
|
||
this.addLog('info', '正在注销登录...');
|
||
}
|
||
|
||
await window.electronAPI.invoke('auth:logout');
|
||
|
||
// 停止任务状态更新
|
||
if (this.stopTaskStatusUpdate) {
|
||
this.stopTaskStatusUpdate();
|
||
}
|
||
|
||
// 更新 store 状态
|
||
if (this.$store) {
|
||
this.$store.dispatch('auth/logout');
|
||
this.$store.dispatch('config/setUserLoggedOut', true);
|
||
}
|
||
|
||
if (this.addLog) {
|
||
this.addLog('success', '注销登录成功');
|
||
}
|
||
|
||
// 触发跳转到登录页面
|
||
if (this.$emit) {
|
||
this.$emit('logout-success');
|
||
}
|
||
} catch (error) {
|
||
if (this.addLog) {
|
||
this.addLog('error', `注销登录异常: ${error.message}`);
|
||
}
|
||
}
|
||
}
|
||
},
|
||
watch: {
|
||
snCode(newVal) {
|
||
this.userMenuInfo.snCode = newVal;
|
||
}
|
||
}
|
||
};
|
||
|