Kaynağa Gözat

feat(ui): 支持全局字体缩放与详情页应用缩放样式

Sisyphus Agent 1 hafta önce
ebeveyn
işleme
61f835d0df
2 değiştirilmiş dosya ile 81 ekleme ve 0 silme
  1. 5 0
      cfc-frontend/App.vue
  2. 76 0
      cfc-frontend/utils/fontScale.js

+ 5 - 0
cfc-frontend/App.vue

@@ -2,11 +2,14 @@
 import config from '@/config.js'
 import Vue from 'vue'
 import { checkUserFamily, verifyToken, bindReferralIfNotSelf, silentRelogin, ssoLogin } from './utils/api.js'
+import { syncFontScale } from './utils/fontScale.js'
 Vue.prototype.$config = config
 
 export default {
   onLaunch: function(options) {
     console.log('App Launch', options)
+    // 同步微信系统字体大小
+    syncFontScale()
     // 捕获分享/邀请参数(普通分享链接 ?inviteCode=xxx):未登录写入 storage 供注册登录后绑定推荐人,已登录直接绑定
     this.captureReferralParams(options)
     // 恢复登录态:必须放在 splash 分支之前。
@@ -34,6 +37,8 @@ export default {
   },
   onShow: function(options) {
     console.log('App Show', options)
+    // 每次前台都同步微信系统字体大小
+    syncFontScale()
     // 热启动(含从分享卡重新进入):同样捕获分享参数
     this.captureReferralParams(options)
     // 跨小程序单点登录:热启动携带 ssoTicket 进入同样处理

+ 76 - 0
cfc-frontend/utils/fontScale.js

@@ -0,0 +1,76 @@
+export function readSystemFontScale() {
+  try {
+    if (typeof uni !== 'undefined' && uni.getAppBaseInfo) {
+      const baseInfo = uni.getAppBaseInfo()
+      if (baseInfo && typeof baseInfo.fontSizeScaleFactor === 'number' && !isNaN(baseInfo.fontSizeScaleFactor)) {
+        return baseInfo.fontSizeScaleFactor
+      }
+      if (baseInfo && typeof baseInfo.fontSizeSetting === 'number' && !isNaN(baseInfo.fontSizeSetting)) {
+        const scale = baseInfo.fontSizeSetting / 16
+        if (scale > 0) {
+          return scale
+        }
+      }
+    }
+  } catch (e) {
+    // ignore
+  }
+  try {
+    if (typeof wx !== 'undefined' && wx.getAppBaseInfo) {
+      const baseInfo = wx.getAppBaseInfo()
+      if (baseInfo && typeof baseInfo.fontSizeScaleFactor === 'number' && !isNaN(baseInfo.fontSizeScaleFactor)) {
+        return baseInfo.fontSizeScaleFactor
+      }
+      if (baseInfo && typeof baseInfo.fontSizeSetting === 'number' && !isNaN(baseInfo.fontSizeSetting)) {
+        const scale = baseInfo.fontSizeSetting / 16
+        if (scale > 0) {
+          return scale
+        }
+      }
+    }
+  } catch (e) {
+    // ignore
+  }
+  return 1
+}
+
+export function getFontScale() {
+  try {
+    const stored = uni.getStorageSync('fontSizeScaleFactor')
+    if (typeof stored === 'number' && !isNaN(stored) && stored > 0) {
+      let scale = stored
+      if (scale < 0.9) scale = 0.9
+      if (scale > 1.7) scale = 1.7
+      const rounded = Math.round(scale * 100) / 100
+      return rounded
+    }
+  } catch (e) {
+    // ignore
+  }
+  const systemScale = readSystemFontScale()
+  let scale = systemScale
+  if (isNaN(scale) || scale <= 0) {
+    scale = 1
+  }
+  if (scale < 0.9) scale = 0.9
+  if (scale > 1.7) scale = 1.7
+  const rounded = Math.round(scale * 100) / 100
+  return rounded
+}
+
+export function syncFontScale() {
+  const systemScale = readSystemFontScale()
+  let scale = systemScale
+  if (isNaN(scale) || scale <= 0) {
+    scale = 1
+  }
+  if (scale < 0.9) scale = 0.9
+  if (scale > 1.7) scale = 1.7
+  const rounded = Math.round(scale * 100) / 100
+  try {
+    uni.setStorageSync('fontSizeScaleFactor', rounded)
+  } catch (e) {
+    // ignore
+  }
+  return rounded
+}