租房小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
4.8 KiB

  1. /**
  2. * 表单数据本地存储工具类
  3. * 用于防止用户意外退出导致表单数据丢失
  4. */
  5. class FormStorage {
  6. constructor() {
  7. this.prefix = 'form_data_';
  8. }
  9. /**
  10. * 保存表单数据到本地存储
  11. * @param {string} formKey - 表单唯一标识
  12. * @param {object} formData - 表单数据
  13. */
  14. saveFormData(formKey, formData) {
  15. try {
  16. const key = this.prefix + formKey;
  17. const dataToSave = {
  18. data: formData,
  19. timestamp: Date.now()
  20. };
  21. uni.setStorageSync(key, JSON.stringify(dataToSave));
  22. console.log(`表单数据已保存: ${formKey}`);
  23. } catch (error) {
  24. console.error('保存表单数据失败:', error);
  25. }
  26. }
  27. /**
  28. * 从本地存储恢复表单数据
  29. * @param {string} formKey - 表单唯一标识
  30. * @param {number} expireTime - 过期时间(毫秒)默认7天
  31. * @returns {object|null} 表单数据或null
  32. */
  33. getFormData(formKey, expireTime = 7 * 24 * 60 * 60 * 1000) {
  34. try {
  35. const key = this.prefix + formKey;
  36. const savedData = uni.getStorageSync(key);
  37. if (!savedData) {
  38. return null;
  39. }
  40. const parsedData = JSON.parse(savedData);
  41. const now = Date.now();
  42. // 检查数据是否过期
  43. if (now - parsedData.timestamp > expireTime) {
  44. this.removeFormData(formKey);
  45. console.log(`表单数据已过期并清除: ${formKey}`);
  46. return null;
  47. }
  48. console.log(`表单数据已恢复: ${formKey}`);
  49. return parsedData.data;
  50. } catch (error) {
  51. console.error('恢复表单数据失败:', error);
  52. return null;
  53. }
  54. }
  55. /**
  56. * 删除指定表单的本地存储数据
  57. * @param {string} formKey - 表单唯一标识
  58. */
  59. removeFormData(formKey) {
  60. try {
  61. const key = this.prefix + formKey;
  62. uni.removeStorageSync(key);
  63. console.log(`表单数据已清除: ${formKey}`);
  64. } catch (error) {
  65. console.error('清除表单数据失败:', error);
  66. }
  67. }
  68. /**
  69. * 清除所有表单数据
  70. */
  71. clearAllFormData() {
  72. try {
  73. const storageInfo = uni.getStorageInfoSync();
  74. const keysToRemove = storageInfo.keys.filter(key => key.startsWith(this.prefix));
  75. keysToRemove.forEach(key => {
  76. uni.removeStorageSync(key);
  77. });
  78. console.log(`已清除所有表单数据,共${keysToRemove.length}`);
  79. } catch (error) {
  80. console.error('清除所有表单数据失败:', error);
  81. }
  82. }
  83. /**
  84. * 检查是否存在指定表单的数据
  85. * @param {string} formKey - 表单唯一标识
  86. * @returns {boolean}
  87. */
  88. hasFormData(formKey) {
  89. try {
  90. const key = this.prefix + formKey;
  91. const savedData = uni.getStorageSync(key);
  92. return !!savedData;
  93. } catch (error) {
  94. console.error('检查表单数据失败:', error);
  95. return false;
  96. }
  97. }
  98. /**
  99. * 获取所有已保存的表单列表
  100. * @returns {Array} 表单key列表
  101. */
  102. getAllFormKeys() {
  103. try {
  104. const storageInfo = uni.getStorageInfoSync();
  105. return storageInfo.keys
  106. .filter(key => key.startsWith(this.prefix))
  107. .map(key => key.replace(this.prefix, ''));
  108. } catch (error) {
  109. console.error('获取表单列表失败:', error);
  110. return [];
  111. }
  112. }
  113. }
  114. // 创建单例实例
  115. const formStorage = new FormStorage();
  116. // 导出实例和类
  117. export default formStorage;
  118. export { FormStorage };
  119. /**
  120. * 使用示例
  121. *
  122. * // 在表单页面中使用
  123. * import formStorage from '@/utils/formStorage.js';
  124. *
  125. * export default {
  126. * data() {
  127. * return {
  128. * form: {
  129. * name: '',
  130. * phone: '',
  131. * // ... 其他字段
  132. * },
  133. * formKey: 'commercial_form' // 每个表单页面使用不同的key
  134. * }
  135. * },
  136. *
  137. * onLoad() {
  138. * // 页面加载时恢复数据
  139. * this.restoreFormData();
  140. * },
  141. *
  142. * onUnload() {
  143. * // 页面卸载时保存数据
  144. * this.saveFormData();
  145. * },
  146. *
  147. * methods: {
  148. * // 恢复表单数据
  149. * restoreFormData() {
  150. * const savedData = formStorage.getFormData(this.formKey);
  151. * if (savedData) {
  152. * this.form = { ...this.form, ...savedData };
  153. * uni.showToast({
  154. * title: '已恢复上次填写的数据',
  155. * icon: 'none'
  156. * });
  157. * }
  158. * },
  159. *
  160. * // 保存表单数据
  161. * saveFormData() {
  162. * formStorage.saveFormData(this.formKey, this.form);
  163. * },
  164. *
  165. * // 表单提交成功后清除数据
  166. * onSubmitSuccess() {
  167. * formStorage.removeFormData(this.formKey);
  168. * },
  169. *
  170. * // 监听表单变化自动保存(可选)
  171. * onFormChange() {
  172. * // 防抖保存,避免频繁操作
  173. * clearTimeout(this.saveTimer);
  174. * this.saveTimer = setTimeout(() => {
  175. * this.saveFormData();
  176. * }, 1000);
  177. * }
  178. * }
  179. * }
  180. */