/**
|
|
* 表单数据本地存储工具类
|
|
* 用于防止用户意外退出导致表单数据丢失
|
|
*/
|
|
|
|
class FormStorage {
|
|
constructor() {
|
|
this.prefix = 'form_data_';
|
|
}
|
|
|
|
/**
|
|
* 保存表单数据到本地存储
|
|
* @param {string} formKey - 表单唯一标识
|
|
* @param {object} formData - 表单数据
|
|
*/
|
|
saveFormData(formKey, formData) {
|
|
try {
|
|
const key = this.prefix + formKey;
|
|
const dataToSave = {
|
|
data: formData,
|
|
timestamp: Date.now()
|
|
};
|
|
uni.setStorageSync(key, JSON.stringify(dataToSave));
|
|
console.log(`表单数据已保存: ${formKey}`);
|
|
} catch (error) {
|
|
console.error('保存表单数据失败:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 从本地存储恢复表单数据
|
|
* @param {string} formKey - 表单唯一标识
|
|
* @param {number} expireTime - 过期时间(毫秒),默认7天
|
|
* @returns {object|null} 表单数据或null
|
|
*/
|
|
getFormData(formKey, expireTime = 7 * 24 * 60 * 60 * 1000) {
|
|
try {
|
|
const key = this.prefix + formKey;
|
|
const savedData = uni.getStorageSync(key);
|
|
|
|
if (!savedData) {
|
|
return null;
|
|
}
|
|
|
|
const parsedData = JSON.parse(savedData);
|
|
const now = Date.now();
|
|
|
|
// 检查数据是否过期
|
|
if (now - parsedData.timestamp > expireTime) {
|
|
this.removeFormData(formKey);
|
|
console.log(`表单数据已过期并清除: ${formKey}`);
|
|
return null;
|
|
}
|
|
|
|
console.log(`表单数据已恢复: ${formKey}`);
|
|
return parsedData.data;
|
|
} catch (error) {
|
|
console.error('恢复表单数据失败:', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除指定表单的本地存储数据
|
|
* @param {string} formKey - 表单唯一标识
|
|
*/
|
|
removeFormData(formKey) {
|
|
try {
|
|
const key = this.prefix + formKey;
|
|
uni.removeStorageSync(key);
|
|
console.log(`表单数据已清除: ${formKey}`);
|
|
} catch (error) {
|
|
console.error('清除表单数据失败:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 清除所有表单数据
|
|
*/
|
|
clearAllFormData() {
|
|
try {
|
|
const storageInfo = uni.getStorageInfoSync();
|
|
const keysToRemove = storageInfo.keys.filter(key => key.startsWith(this.prefix));
|
|
|
|
keysToRemove.forEach(key => {
|
|
uni.removeStorageSync(key);
|
|
});
|
|
|
|
console.log(`已清除所有表单数据,共${keysToRemove.length}条`);
|
|
} catch (error) {
|
|
console.error('清除所有表单数据失败:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查是否存在指定表单的数据
|
|
* @param {string} formKey - 表单唯一标识
|
|
* @returns {boolean}
|
|
*/
|
|
hasFormData(formKey) {
|
|
try {
|
|
const key = this.prefix + formKey;
|
|
const savedData = uni.getStorageSync(key);
|
|
return !!savedData;
|
|
} catch (error) {
|
|
console.error('检查表单数据失败:', error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取所有已保存的表单列表
|
|
* @returns {Array} 表单key列表
|
|
*/
|
|
getAllFormKeys() {
|
|
try {
|
|
const storageInfo = uni.getStorageInfoSync();
|
|
return storageInfo.keys
|
|
.filter(key => key.startsWith(this.prefix))
|
|
.map(key => key.replace(this.prefix, ''));
|
|
} catch (error) {
|
|
console.error('获取表单列表失败:', error);
|
|
return [];
|
|
}
|
|
}
|
|
}
|
|
|
|
// 创建单例实例
|
|
const formStorage = new FormStorage();
|
|
|
|
// 导出实例和类
|
|
export default formStorage;
|
|
export { FormStorage };
|
|
|
|
/**
|
|
* 使用示例:
|
|
*
|
|
* // 在表单页面中使用
|
|
* import formStorage from '@/utils/formStorage.js';
|
|
*
|
|
* export default {
|
|
* data() {
|
|
* return {
|
|
* form: {
|
|
* name: '',
|
|
* phone: '',
|
|
* // ... 其他字段
|
|
* },
|
|
* formKey: 'commercial_form' // 每个表单页面使用不同的key
|
|
* }
|
|
* },
|
|
*
|
|
* onLoad() {
|
|
* // 页面加载时恢复数据
|
|
* this.restoreFormData();
|
|
* },
|
|
*
|
|
* onUnload() {
|
|
* // 页面卸载时保存数据
|
|
* this.saveFormData();
|
|
* },
|
|
*
|
|
* methods: {
|
|
* // 恢复表单数据
|
|
* restoreFormData() {
|
|
* const savedData = formStorage.getFormData(this.formKey);
|
|
* if (savedData) {
|
|
* this.form = { ...this.form, ...savedData };
|
|
* uni.showToast({
|
|
* title: '已恢复上次填写的数据',
|
|
* icon: 'none'
|
|
* });
|
|
* }
|
|
* },
|
|
*
|
|
* // 保存表单数据
|
|
* saveFormData() {
|
|
* formStorage.saveFormData(this.formKey, this.form);
|
|
* },
|
|
*
|
|
* // 表单提交成功后清除数据
|
|
* onSubmitSuccess() {
|
|
* formStorage.removeFormData(this.formKey);
|
|
* },
|
|
*
|
|
* // 监听表单变化自动保存(可选)
|
|
* onFormChange() {
|
|
* // 防抖保存,避免频繁操作
|
|
* clearTimeout(this.saveTimer);
|
|
* this.saveTimer = setTimeout(() => {
|
|
* this.saveFormData();
|
|
* }, 1000);
|
|
* }
|
|
* }
|
|
* }
|
|
*/
|