common.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /**
  2. * H5公共工具函数
  3. * 避免在多个文件中重复定义相同的函数
  4. */
  5. // 获取URL参数的工具函数
  6. function getUrlParams() {
  7. const params = {}
  8. const urlSearchParams = new URLSearchParams(window.location.search)
  9. for (const [key, value] of urlSearchParams) {
  10. params[key] = decodeURIComponent(value)
  11. }
  12. return params
  13. }
  14. // 获取设备信息 (优先从URL参数获取,备用从localStorage获取)
  15. function getDeviceInfo() {
  16. const urlParams = getUrlParams()
  17. // 优先从URL参数获取
  18. let deviceId = urlParams.devId || ''
  19. let model = urlParams.sbmc || ''
  20. // 如果URL参数中没有,尝试从localStorage获取
  21. if (!deviceId || !model) {
  22. const cachedDeviceInfo = localStorage.getItem('deviceInfo')
  23. if (cachedDeviceInfo) {
  24. try {
  25. const parsed = JSON.parse(cachedDeviceInfo)
  26. deviceId = deviceId || parsed.deviceId || ''
  27. model = model || parsed.model || ''
  28. console.log('🔄 从localStorage获取设备信息:', { deviceId, model })
  29. } catch (e) {
  30. console.warn('解析localStorage中的设备信息失败:', e)
  31. }
  32. }
  33. }
  34. // 如果获取到了设备信息,保存到localStorage作为备用
  35. if (deviceId && model) {
  36. const deviceInfo = { deviceId, model }
  37. localStorage.setItem('deviceInfo', JSON.stringify(deviceInfo))
  38. }
  39. return {
  40. deviceId: deviceId,
  41. model: model
  42. }
  43. }
  44. // 获取JSESSIONID (多源获取,确保可用性)
  45. function getJSessionId() {
  46. // 优先级:localStorage > URL参数 > Cookie
  47. let jsessionId = localStorage.getItem('JSESSIONID')
  48. if (!jsessionId) {
  49. const urlParams = getUrlParams()
  50. jsessionId = urlParams.JSESSIONID
  51. }
  52. if (!jsessionId) {
  53. // 尝试从document.cookie中获取
  54. const cookies = document.cookie.split(';')
  55. for (let cookie of cookies) {
  56. const [name, value] = cookie.trim().split('=')
  57. if (name === 'JSESSIONID') {
  58. jsessionId = value
  59. break
  60. }
  61. }
  62. }
  63. console.log('🔍 获取JSESSIONID:', {
  64. fromLocalStorage: localStorage.getItem('JSESSIONID'),
  65. fromURL: getUrlParams().JSESSIONID,
  66. final: jsessionId
  67. })
  68. return jsessionId || ''
  69. }
  70. // 保存JSESSIONID到localStorage
  71. function saveJSessionId(jsessionId) {
  72. if (jsessionId) {
  73. localStorage.setItem('JSESSIONID', jsessionId)
  74. console.log('✅ H5 JSESSIONID已保存:', jsessionId)
  75. }
  76. }
  77. // 模拟微信授权码获取 (H5环境下的处理)
  78. function getMockWechatCode() {
  79. // 在H5环境下,我们可以生成一个模拟的code
  80. // 实际项目中可能需要接入微信H5授权
  81. return 'h5_mock_code_' + Date.now()
  82. }
  83. // 用户信息管理
  84. const userManager = {
  85. // 保存用户信息
  86. saveUserInfo(userInfo) {
  87. console.log('💾 H5保存用户信息:', userInfo)
  88. localStorage.setItem('userInfo', JSON.stringify(userInfo))
  89. },
  90. // 获取保存的用户信息
  91. getSavedUserInfo() {
  92. const userInfo = localStorage.getItem('userInfo')
  93. return userInfo ? JSON.parse(userInfo) : null
  94. },
  95. // 检查登录状态
  96. checkLoginStatus() {
  97. const userInfo = localStorage.getItem('userInfo')
  98. const jsessionId = localStorage.getItem('JSESSIONID')
  99. console.log('🔍 H5检查登录状态:', {
  100. hasUserInfo: !!userInfo,
  101. hasJSessionId: !!jsessionId
  102. })
  103. return {
  104. isLoggedIn: !!(userInfo && jsessionId),
  105. userInfo: userInfo ? JSON.parse(userInfo) : null,
  106. jsessionId: jsessionId
  107. }
  108. },
  109. // 清除登录信息
  110. clearLoginInfo() {
  111. localStorage.removeItem('userInfo')
  112. localStorage.removeItem('JSESSIONID')
  113. localStorage.removeItem('deviceInfo')
  114. console.log('🧹 已清除登录信息')
  115. }
  116. }
  117. // 获取图片URL (用于图片回显)
  118. function getImageUrl(path) {
  119. if (!path) return ''
  120. // 如果已经是完整URL,直接返回
  121. if (path.startsWith('http://') || path.startsWith('https://') || path.startsWith('blob:')) {
  122. return path
  123. }
  124. // 获取baseUrl (从request中获取或使用默认值)
  125. const baseUrl = window.request?.defaults?.baseURL || window.location.origin
  126. // 构造图片下载URL
  127. return baseUrl + '/service?ssServ=dlByHttp&wdConfirmationCaptchaService=0&type=img&path=' + path
  128. }
  129. // 获取文件URL (用于文件下载)
  130. function getFileUrl(path) {
  131. if (!path) return ''
  132. // 如果已经是完整URL,直接返回
  133. if (path.startsWith('http://') || path.startsWith('https://')) {
  134. return path
  135. }
  136. // 获取baseUrl
  137. const baseUrl = window.request?.defaults?.baseURL || window.location.origin
  138. // 构造文件下载URL
  139. return baseUrl + '/service?ssServ=dlByHttp&wdConfirmationCaptchaService=0&type=file&path=' + path
  140. }
  141. // 格式化日期时间 (使用 dayjs)
  142. function formatDate(dateStr, format = 'YYYY-MM-DD HH:mm:ss') {
  143. if (!dateStr) {
  144. console.log('formatDate: 时间字符串为空')
  145. return ''
  146. }
  147. console.log('formatDate 输入:', dateStr, '格式要求:', format)
  148. // 检查 dayjs 是否可用
  149. if (typeof dayjs === 'undefined') {
  150. console.error('❌ dayjs 未加载,无法格式化时间')
  151. return dateStr
  152. }
  153. // 清理字符串:移除特殊空格字符(如 \u202F),替换为普通空格
  154. const cleanedDateStr = String(dateStr)
  155. .replace(/[\u202F\u00A0]/g, ' ') // 替换不间断空格
  156. .replace(/\s+/g, ' ') // 多个空格合并为一个
  157. .trim()
  158. console.log('清理后的字符串:', cleanedDateStr)
  159. // 尝试使用原生 Date 解析(兼容性最好)
  160. let date = null
  161. try {
  162. const jsDate = new Date(cleanedDateStr)
  163. if (!isNaN(jsDate.getTime())) {
  164. date = dayjs(jsDate)
  165. console.log('✅ 使用 Date 解析成功')
  166. }
  167. } catch (e) {
  168. console.warn('Date 解析失败:', e)
  169. }
  170. // 如果 Date 解析失败,尝试直接用 dayjs
  171. if (!date || !date.isValid()) {
  172. date = dayjs(cleanedDateStr)
  173. console.log('尝试使用 dayjs 直接解析')
  174. }
  175. console.log('dayjs 解析结果 isValid:', date ? date.isValid() : 'null')
  176. if (!date || !date.isValid()) {
  177. console.warn('⚠️ 无效的日期格式:', dateStr)
  178. return '' // 解析失败返回空字符串
  179. }
  180. // dayjs 的格式化 (支持常见格式)
  181. // dayjs 使用大写的格式标记: YYYY-MM-DD HH:mm:ss
  182. const result = date.format(format)
  183. console.log('格式化结果:', result)
  184. return result
  185. }
  186. // 导出到全局
  187. window.getUrlParams = getUrlParams
  188. window.getDeviceInfo = getDeviceInfo
  189. window.getJSessionId = getJSessionId
  190. window.saveJSessionId = saveJSessionId
  191. window.getMockWechatCode = getMockWechatCode
  192. window.userManager = userManager
  193. window.getImageUrl = getImageUrl
  194. window.getFileUrl = getFileUrl
  195. window.formatDate = formatDate
  196. // 同时挂载到SS.utils下(兼容组件调用)
  197. if (!window.SS.utils) {
  198. window.SS.utils = {}
  199. }
  200. window.SS.utils.getImageUrl = getImageUrl
  201. window.SS.utils.getFileUrl = getFileUrl
  202. window.SS.utils.formatDate = formatDate
  203. console.log('✅ H5公共工具已加载')