Преглед на файлове

规范了一些代码,增加了对常量与方法的注释

wangcy преди 3 месеца
родител
ревизия
c7e6107e2a
променени са 28 файла, в които са добавени 472 реда и са изтрити 391 реда
  1. 12 8
      commons/basic/Index.ets
  2. 40 40
      commons/basic/src/main/ets/ads/RewardAd.ets
  3. 21 6
      commons/basic/src/main/ets/ads/StartAd.ets
  4. 9 9
      commons/basic/src/main/ets/components/AgreePrivacy.ets
  5. 3 3
      commons/basic/src/main/ets/components/ChatList.ets
  6. 5 5
      commons/basic/src/main/ets/components/YTHeader.ets
  7. 3 3
      commons/basic/src/main/ets/components/YtDoubleConfirm.ets
  8. 1 1
      commons/basic/src/main/ets/components/YtTiltleBar.ets
  9. 83 55
      commons/basic/src/main/ets/models/UserInfo.ets
  10. 8 17
      commons/basic/src/main/ets/models/index.ets
  11. 5 6
      commons/basic/src/main/ets/utils/HuaWeiAuthPlugin.ets
  12. 13 4
      commons/basic/src/main/ets/utils/PermissionControl.ets
  13. 32 19
      commons/basic/src/main/ets/utils/YTAvoid.ets
  14. 30 20
      commons/basic/src/main/ets/utils/YTBreakPoint.ets
  15. 43 43
      commons/basic/src/main/ets/utils/YTRequest.ets
  16. 36 25
      commons/basic/src/main/ets/utils/YTRouter.ets
  17. 8 1
      commons/basic/src/main/ets/utils/YTToast.ets
  18. 4 4
      features/user/src/main/ets/components/LoginInput.ets
  19. 3 3
      features/user/src/main/ets/components/Terms.ets
  20. 4 4
      features/user/src/main/ets/pages/AboutUS.ets
  21. 12 12
      features/user/src/main/ets/pages/DelPhotoPage.ets
  22. 11 13
      features/user/src/main/ets/pages/LoginPage.ets
  23. 2 2
      features/user/src/main/ets/pages/Privacy.ets
  24. 15 16
      features/user/src/main/ets/pages/SettingPage.ets
  25. 3 3
      features/user/src/main/ets/pages/SuggestionPage.ets
  26. 50 53
      features/user/src/main/ets/views/Mine.ets
  27. 12 12
      products/entry/src/main/ets/entryability/EntryAbility.ets
  28. 4 4
      products/entry/src/main/ets/pages/Index.ets

+ 12 - 8
commons/basic/Index.ets

@@ -1,3 +1,5 @@
+export { AppStorageKeyCollect } from './src/main/ets/constants'
+
 export * from '@ibestservices/ibest-ui'
 
 export { reviseImgHeaderBuilder } from './src/main/ets/components/ReviseImgHeaderBuilder'
@@ -16,19 +18,19 @@ export { BannerAd } from "./src/main/ets/ads/BannerAd"
 
 export { ShowJHRewardAd } from "./src/main/ets/components/ShowJHRewardAd"
 
-export { jhStartAd } from "./src/main/ets/ads/StartAd"
+export { JhStartAd } from "./src/main/ets/ads/StartAd"
 
 export { AdStatus } from "./src/main/ets/constants"
 
-export { permissionControl } from "./src/main/ets/utils/PermissionControl"
+export { PermissionControl } from "./src/main/ets/utils/PermissionControl"
 
-export { yTRequest } from "./src/main/ets/utils/YTRequest"
+export { YTRequest } from "./src/main/ets/utils/YTRequest"
 
-export { huaweiAuthPlugin } from "./src/main/ets/utils/HuaWeiAuthPlugin"
+export { HuaweiAuthPlugin } from "./src/main/ets/utils/HuaWeiAuthPlugin"
 
-export { userInfo, UserInfo } from "./src/main/ets/models/UserInfo"
+export { UserInfo } from "./src/main/ets/models/UserInfo"
 
-export { yTToast } from "./src/main/ets/utils/YTToast"
+export { YTToast } from "./src/main/ets/utils/YTToast"
 
 export { YtButton } from "./src/main/ets/components/YtButton"
 
@@ -38,9 +40,9 @@ export { Upload } from "./src/main/ets/utils/UploadFile"
 
 // export * from "@ibestservices/ibest-ui"
 
-export { YtAvoid } from "./src/main/ets/utils/YTAvoid"
+export { YTAvoid } from "./src/main/ets/utils/YTAvoid"
 
-export { yTRouter } from "./src/main/ets/utils/YTRouter"
+export { YTRouter } from "./src/main/ets/utils/YTRouter"
 
 export * from "./src/main/ets/utils/YTBreakPoint"
 
@@ -62,3 +64,5 @@ export * from './src/main/ets/models'
 
 
 
+
+

+ 40 - 40
commons/basic/src/main/ets/ads/RewardAd.ets

@@ -3,7 +3,7 @@ import { common } from '@kit.AbilityKit';
 import { hilog } from '@kit.PerformanceAnalysisKit';
 import { BusinessError, commonEventManager, emitter } from '@kit.BasicServicesKit';
 import { AdStatus } from '../constants';
-import { YTLog, yTToast } from '../../../../Index';
+import { YTLog, YTToast } from '../../../../Index';
 import { IBestToast } from '@ibestservices/ibest-ui';
 
 const KEY_REWARD_DATA = "reward_ad_data";
@@ -27,43 +27,6 @@ export class RewardAd {
     this.requestAndShowAd(this.load)
   }
 
-  private requestAndShowAd(adLoader: advertising.AdLoader): void {
-    const adRequestParam: advertising.AdRequestParams = {
-      // 广告类型:激励广告
-      adType: 7,
-      // 'testx9dtjwj8hp'为测试专用的广告位ID,应用正式发布时需要改为正式的广告位ID
-      adId: 'testx9dtjwj8hp',
-    };
-    const adOption: advertising.AdOptions = {
-      // 设置是否请求非个性化广告
-      nonPersonalizedAd: 0,
-      // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
-      allowMobileTraffic: 0,
-      // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
-      tagForChildProtection: -1,
-      // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
-      tagForUnderAgeOfPromise: -1,
-      // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
-      adContentClassification: 'A'
-    };
-    const adLoaderListener: advertising.AdLoadListener = {
-      onAdLoadFailure: (errorCode: number, errorMsg: string) => {
-        setTimeout(() => {
-          IBestToast.hide()
-          setTimeout(() => {
-            IBestToast.show({ message: '加载失败' })
-          }, 100)
-        }, 1000)
-      },
-      onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
-        hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in requesting ad`);
-        this.ads.push(...ads);
-        this.showAd()
-      },
-    };
-    adLoader.loadAd(adRequestParam, adOption, adLoaderListener);
-  }
-
   // 订阅方法,需要在每次展示广告前调用
   public registerPPSReceiver(): void {
     if (this.subscriber) {
@@ -103,7 +66,7 @@ export class RewardAd {
               hilog.info(0x0000, 'testTag', '%{public}s', `onAdOpen`);
               //关闭弹窗
               IBestToast.hide()
-              yTToast.hide()
+              YTToast.getInstance().hide()
               break;
             case AdStatus.AD_CLICKED:
               hilog.info(0x0000, 'testTag', '%{public}s', `onAdClick`);
@@ -116,7 +79,7 @@ export class RewardAd {
                 this.isReward = false
                 if (AppStorage.get<number>('RewardNum')! < 5) {
                   setTimeout(() => {
-                    // yTToast.getReward({ number: 500 })
+                    // YTToast.getInstance().getReward({ number: 500 })
                   }, 500)
                 }
               }
@@ -162,6 +125,43 @@ export class RewardAd {
     });
   }
 
+  private requestAndShowAd(adLoader: advertising.AdLoader): void {
+    const adRequestParam: advertising.AdRequestParams = {
+      // 广告类型:激励广告
+      adType: 7,
+      // 'testx9dtjwj8hp'为测试专用的广告位ID,应用正式发布时需要改为正式的广告位ID
+      adId: 'testx9dtjwj8hp',
+    };
+    const adOption: advertising.AdOptions = {
+      // 设置是否请求非个性化广告
+      nonPersonalizedAd: 0,
+      // 是否允许流量下载0:不允许,1:允许,不设置以广告主设置为准
+      allowMobileTraffic: 0,
+      // 是否希望根据 COPPA 的规定将您的内容视为面向儿童的内容: -1默认值,不确定 0不希望 1希望
+      tagForChildProtection: -1,
+      // 是否希望按适合未达到法定承诺年龄的欧洲经济区 (EEA) 用户的方式处理该广告请求: -1默认值,不确定 0不希望 1希望
+      tagForUnderAgeOfPromise: -1,
+      // 设置广告内容分级上限: W: 3+,所有受众 PI: 7+,家长指导 J:12+,青少年 A: 16+/18+,成人受众
+      adContentClassification: 'A'
+    };
+    const adLoaderListener: advertising.AdLoadListener = {
+      onAdLoadFailure: (errorCode: number, errorMsg: string) => {
+        setTimeout(() => {
+          IBestToast.hide()
+          setTimeout(() => {
+            IBestToast.show({ message: '加载失败' })
+          }, 100)
+        }, 1000)
+      },
+      onAdLoadSuccess: (ads: Array<advertising.Advertisement>) => {
+        hilog.info(0x0000, 'testTag', '%{public}s', `Succeeded in requesting ad`);
+        this.ads.push(...ads);
+        this.showAd()
+      },
+    };
+    adLoader.loadAd(adRequestParam, adOption, adLoaderListener);
+  }
+
   //展示广告
   private showAd() {
     // 请在此处自行增加步骤2中的,注册激励广告状态监听器

+ 21 - 6
commons/basic/src/main/ets/ads/StartAd.ets

@@ -4,14 +4,17 @@ import { router } from '@kit.ArkUI';
 import { hilog } from '@kit.PerformanceAnalysisKit';
 import { emitter } from '@kit.BasicServicesKit';
 import { YTLog } from '../../../../Index';
+import { AppStorageKeyCollect } from '../constants';
 
 export enum AdType {
   // 开屏广告的类型
   SPLASH_AD = 1
 }
 
-class JhStartAd {
-  private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
+export class JhStartAd {
+  // 鲸鸿开屏广告的单例
+  private static declare instance: JhStartAd
+  private declare context: common.UIAbilityContext
   private oaid: string = '';
   private isTimeOut: boolean = false;
   // 超时时间(单位毫秒),开发者可根据实际情况修改
@@ -19,8 +22,8 @@ class JhStartAd {
   // 超时index
   private timeOutIndex: number = -1;
   // 广告展示参数
-  declare ads: Array<advertising.Advertisement>
-  adDisplayOptions: advertising.AdDisplayOptions = {
+  private declare ads: Array<advertising.Advertisement>
+  private adDisplayOptions: advertising.AdDisplayOptions = {
     // 是否静音,默认不静音
     mute: false
   }
@@ -52,10 +55,23 @@ class JhStartAd {
     oaid: this.oaid
   }
 
+  //进一步优化单例 使外部无法创建实例
+  private constructor() {
+  }
+
+  //获取单例
+  static getInstance() {
+    if (!JhStartAd.instance) {
+      JhStartAd.instance = new JhStartAd()
+    }
+    return JhStartAd.instance
+  }
+
   init(UIContext: common.UIAbilityContext, oaid: string) {
     this.context = UIContext
     this.oaid = oaid
     this.requestAd(this.splashImageAdReqParams, this.adOptions)
+
   }
 
   private requestAd(adReqParams: advertising.AdRequestParams, adOptions: advertising.AdOptions): void {
@@ -80,7 +96,7 @@ class JhStartAd {
         YTLog.info('广告加载成功')
         if (canIUse("SystemCapability.Advertising.Ads")) {
           this.ads = ads
-          AppStorage.setOrCreate('isLoaded', true)
+          AppStorage.setOrCreate(AppStorageKeyCollect.AD_IS_LOADED, true)
         }
       }
     };
@@ -106,4 +122,3 @@ class JhStartAd {
   }
 }
 
-export const jhStartAd = new JhStartAd()

+ 9 - 9
commons/basic/src/main/ets/components/AgreePrivacy.ets

@@ -1,7 +1,7 @@
 import { IBestToast } from '../../../../Index';
-import { BasicType, reqString } from '../models';
-import { yTRequest } from '../utils/YTRequest';
-import { yTToast } from '../utils/YTToast';
+import { BasicType, ReqString } from '../models';
+import { YTRequest } from '../utils/YTRequest';
+import { YTToast } from '../utils/YTToast';
 import { YtButton } from './YtButton';
 
 @Builder
@@ -9,7 +9,7 @@ export function AgreePrivacy(item: BasicType<undefined>) {
   Column() {
     Text('温馨提示')
       .fontSize(14)
-      .fontColor('#FF000000')
+      .fontColor('Color.Black')
       .margin({ top: 14, bottom: 8 })
     Text('已阅读并同意《用户协议》和《隐私政策》')
       .fontSize(13)
@@ -22,8 +22,8 @@ export function AgreePrivacy(item: BasicType<undefined>) {
         btContent: '同意并登入',
         btHeight: 37,
         click: () => {
-          yTToast.hide()
-          const loginData: reqString = AppStorage.get<reqString>('captchaLogin')!
+          YTToast.getInstance().hide()
+          const loginData: ReqString = AppStorage.get<ReqString>('captchaLogin')!
 
           if (item.text == '验证码登录') {
             if (!loginData.phonenumber || !loginData.captcha) {
@@ -33,10 +33,10 @@ export function AgreePrivacy(item: BasicType<undefined>) {
               return
             }
 
-            yTRequest.phonenumberLogin(AppStorage.get<reqString>('captchaLogin')!)
+            YTRequest.phonenumberLogin(AppStorage.get<ReqString>('captchaLogin')!)
           }
           if (item.text == '华为登录') {
-            yTRequest.huaweiLogin()
+            YTRequest.huaweiLogin()
           }
 
 
@@ -48,7 +48,7 @@ export function AgreePrivacy(item: BasicType<undefined>) {
         bgc: Color.White,
         btFontColor: '#80000000',
         click: () => {
-          yTToast.hide()
+          YTToast.getInstance().hide()
         }
       })
     }

+ 3 - 3
commons/basic/src/main/ets/components/ChatList.ets

@@ -1,5 +1,5 @@
-import { BasicType, MessageType, Role } from '../models'
-import { BreakPointType, yTBreakPoint } from '../utils/YTBreakPoint'
+import { BasicType, BreakPointString, MessageType, Role } from '../models'
+import { BreakPointType, YTBreakPoint } from '../utils/YTBreakPoint'
 
 @Component
 export struct ChatList {
@@ -33,7 +33,7 @@ export struct ChatList {
       text: '公司团建'
     }
   ]
-  @StorageProp(yTBreakPoint.KEY) bp: string = 'sm'
+  @StorageProp(YTBreakPoint.KEY) bp: BreakPointString = 'sm'
   @State isLoading: boolean = false
 
   build() {

+ 5 - 5
commons/basic/src/main/ets/components/YTHeader.ets

@@ -1,18 +1,18 @@
-import { YtAvoid } from '../../../../Index'
-import { yTRouter } from '../utils/YTRouter'
+import { YTAvoid } from '../../../../Index'
+import { YTRouter } from '../utils/YTRouter'
 
 @Component
 export struct YTHeader {
   @BuilderParam leftComp?: () => void
   @BuilderParam RightComp?: () => void
   @BuilderParam CenterComp?: () => void
-  @StorageProp(YtAvoid.safeTopKey) safeTop: number = 0
+  @StorageProp(YTAvoid.SAFE_TOP_KEY) safeTop: number = 0
   backArrow: boolean = true
   title: string = ''
+  bgc: ResourceColor = Color.White
   click = () => {
-    yTRouter.routerBack()
+    YTRouter.routerBack()
   }
-  bgc: ResourceColor = Color.White
 
   build() {
     Stack() {

+ 3 - 3
commons/basic/src/main/ets/components/YtDoubleConfirm.ets

@@ -1,4 +1,4 @@
-import { YtButton, yTToast } from '../../../../Index';
+import { YtButton, YTToast } from '../../../../Index';
 import { BasicType } from '../models';
 
 @Builder
@@ -6,7 +6,7 @@ export function yTDoubleConfirm(item: BasicType<undefined>) {
   Column() {
     Text(item.text)
       .fontSize(14)
-      .fontColor('#FF000000')
+      .fontColor(Color.Black)
       .margin({ bottom: 18 })
     Text(item.message)
       .fontColor($r('sys.color.mask_secondary'))
@@ -33,7 +33,7 @@ export function yTDoubleConfirm(item: BasicType<undefined>) {
           btFontSize: 12,
           bgc: Color.White,
           click: () => {
-            yTToast.hide()
+            YTToast.getInstance().hide()
           }
         }
       )

+ 1 - 1
commons/basic/src/main/ets/components/YtTiltleBar.ets

@@ -1,5 +1,5 @@
 @Component
-export struct YtTitleBar {
+export struct YTTitleBar {
   @Prop headerTitleList: string[]
   listScroller: ListScroller = new ListScroller()
   @Prop @Watch('currentIndexChange') currentIndex: number

+ 83 - 55
commons/basic/src/main/ets/models/UserInfo.ets

@@ -1,8 +1,15 @@
 import { emitter } from '@kit.BasicServicesKit'
+import { AppStorageKeyCollect } from '../constants'
 
+/**
+ * @description 用户信息类,可结合AppStorage使用,实现响应式更换用户信息,使用时替换为后端传回的用户属性即可
+ */
 export class UserInfo {
-  KEY: string = 'UserInfo'
-  isLogin: boolean = false
+  static KEY: string = 'UserInfo'
+  private declare static instance: UserInfo
+  private isLogin: boolean = false
+  private token?: string
+  //此注释下的属性可按需更改
   private memberName?: string
   private memberPhone?: string
   private memberEmail?: string
@@ -10,116 +17,137 @@ export class UserInfo {
   private aiCount?: number
   private userId?: number
   private memberScore?: number
-  private token?: string
 
+  private constructor() {
+  }
+
+  /**
+   * 获取用户单例
+   * @returns UserInfo
+   */
+  static getInstance() {
+    if (!UserInfo.instance) {
+      UserInfo.instance = new UserInfo()
+    }
+    return UserInfo.instance
+  }
+
+  /**
+   * 设置用户信息并且设置登录状态
+   * @param _userInfo
+   */
   setUserInfoAndLogin(_userInfo: UserInfo) {
-    userInfo.isLogin = true
+    UserInfo.getInstance().isLogin = true
     if (_userInfo.token) {
-      userInfo.token = _userInfo.token
+      UserInfo.getInstance().token = _userInfo.token
     }
-    userInfo.memberEmail = _userInfo.memberEmail
-    userInfo.memberIcon = _userInfo.memberIcon
-    userInfo.memberName = _userInfo.memberName
-    userInfo.userId = _userInfo.userId
-    userInfo.memberScore = _userInfo.memberScore
-    userInfo.aiCount = _userInfo.aiCount
-    userInfo.memberPhone = _userInfo.memberPhone
+    UserInfo.getInstance().memberEmail = _userInfo.memberEmail
+    UserInfo.getInstance().memberIcon = _userInfo.memberIcon
+    UserInfo.getInstance().memberName = _userInfo.memberName
+    UserInfo.getInstance().userId = _userInfo.userId
+    UserInfo.getInstance().memberScore = _userInfo.memberScore
+    UserInfo.getInstance().aiCount = _userInfo.aiCount
+    UserInfo.getInstance().memberPhone = _userInfo.memberPhone
     emitter.emit('refreshList')
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
+  /**
+   * @description 登出并清空用户信息
+   */
   logout() {
-    userInfo.isLogin = false
-    userInfo.token = undefined
-    userInfo.memberEmail = undefined
-    userInfo.memberIcon = undefined
-    userInfo.memberName = undefined
-    userInfo.userId = undefined
-    userInfo.memberScore = undefined
-    userInfo.aiCount = undefined
-    userInfo.memberPhone = undefined
-    emitter.emit('cleanList')
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
-    AppStorage.setOrCreate('token', undefined)
-  }
-
+    UserInfo.getInstance().isLogin = false
+    UserInfo.getInstance().token = undefined
+    UserInfo.getInstance().memberEmail = undefined
+    UserInfo.getInstance().memberIcon = undefined
+    UserInfo.getInstance().memberName = undefined
+    UserInfo.getInstance().userId = undefined
+    UserInfo.getInstance().memberScore = undefined
+    UserInfo.getInstance().aiCount = undefined
+    UserInfo.getInstance().memberPhone = undefined
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
+    AppStorage.setOrCreate(AppStorageKeyCollect.TOKEN, undefined)
+  }
+
+  /**
+   * 检测用户是否登录
+   * @returns boolean
+   */
   checkLogin() {
-    return userInfo.isLogin
+    return UserInfo.getInstance().isLogin
   }
 
   getToken() {
-    return userInfo.token
+    return UserInfo.getInstance().token
   }
 
 
   setToken(token: string) {
-    userInfo.token = token
-    AppStorage.setOrCreate<string>('token', token)
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().token = token
+    AppStorage.setOrCreate<string>(AppStorageKeyCollect.TOKEN, token)
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getHeadImg() {
-    return userInfo.memberIcon
+    return UserInfo.getInstance().memberIcon
   }
 
   setHeadImg(headImg: string) {
-    userInfo.memberIcon = headImg
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().memberIcon = headImg
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getEmail() {
-    return userInfo.memberEmail
+    return UserInfo.getInstance().memberEmail
   }
 
   setEmail(email: string) {
-    userInfo.memberEmail = email
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().memberEmail = email
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getName() {
-    return userInfo.memberName
+    return UserInfo.getInstance().memberName
   }
 
   setName(name: string) {
-    userInfo.memberName = name
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().memberName = name
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getId() {
-    return userInfo.userId
+    return UserInfo.getInstance().userId
   }
 
   setId(id: number) {
-    userInfo.userId = id
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().userId = id
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getGoldNum() {
-    return userInfo.memberScore
+    return UserInfo.getInstance().memberScore
   }
 
   setGoldNum(goldNum: number) {
-    userInfo.memberScore = goldNum
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().memberScore = goldNum
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getAiNum() {
-    return userInfo.aiCount
+    return UserInfo.getInstance().aiCount
   }
 
   setAiNum(aiNum: number) {
-    userInfo.aiCount = aiNum
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().aiCount = aiNum
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 
   getPhoneNumber() {
-    return userInfo.memberPhone
+    return UserInfo.getInstance().memberPhone
   }
 
   setPhoneNumber(phoneNumber: string) {
-    userInfo.memberPhone = phoneNumber
-    AppStorage.setOrCreate(userInfo.KEY, userInfo)
+    UserInfo.getInstance().memberPhone = phoneNumber
+    AppStorage.setOrCreate(UserInfo.KEY, UserInfo.getInstance())
   }
 }
-
-export const userInfo = new UserInfo()

+ 8 - 17
commons/basic/src/main/ets/models/index.ets

@@ -12,9 +12,9 @@ export interface BasicType<T> {
   finally?: () => void
 }
 
-export type reqString = Record<string, string>
+export type ReqString = Record<string, string>
 
-export interface avoidType {
+export interface AvoidType {
   top?: number,
   bottom?: number
 }
@@ -32,20 +32,6 @@ export enum Role {
   CARD
 }
 
-// 计算器返回数据
-export interface getCount {
-  id?: number,
-  title?: string,
-  type?: number,
-  atCount?: number,
-  target?: string | null,
-  colorName?: string,
-  changeValue?: number,
-  sort?: number,
-  isTop?: string
-  colorValue?: ResourceColor
-
-}
 
 export interface DelPhotoParam {
   src: string,
@@ -57,4 +43,9 @@ export interface DelPhotoParam {
  * @param res 结果输出
  * @param err 错误输出
  */
-export type ResultCallBack<T> = (res?: T, err?: Error) => void
+export type ResultCallBack<T> = (res?: T, err?: Error) => void
+
+/**
+ * @description 断点字符串类型
+ */
+export type BreakPointString = 'xs' | 'sm' | 'md' | 'lg'

+ 5 - 6
commons/basic/src/main/ets/utils/HuaWeiAuthPlugin.ets

@@ -4,9 +4,9 @@ import { hilog } from '@kit.PerformanceAnalysisKit'
 import { BusinessError } from '@kit.BasicServicesKit'
 import { YTLog } from '../../../../Index'
 
-class HuaweiAuthPlugin {
+export class HuaweiAuthPlugin {
   // 代替了用户输入用户名密码
-  async requestAuth() {
+  static async requestAuth() {
     // 1. 创建一个Account Kit授权请求对象,可通过返回值设置请求参数。
     const huaweiIdProvider = new authentication.HuaweiIDProvider()
     const authCreateRequest = huaweiIdProvider.createAuthorizationWithHuaweiIDRequest() // 创建华为授权请求
@@ -22,7 +22,7 @@ class HuaweiAuthPlugin {
     return authorizationCode
   }
 
-  async getPhoneNumber() {
+  static async getPhoneNumber() {
     // 创建授权请求,并设置参数
     const authRequest = new authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest();
     // 获取手机号需要传如下scope,传参数之前需要先申请对应scope权限,才能返回对应数据
@@ -36,7 +36,7 @@ class HuaweiAuthPlugin {
 
     // 执行请求
     try {
-      const controller = new authentication.AuthenticationController(getContext(this));
+      const controller = new authentication.AuthenticationController(getContext());
       controller.executeRequest(authRequest).then((data) => {
         const authorizationWithHuaweiIDResponse = data as authentication.AuthorizationWithHuaweiIDResponse;
         const state = authorizationWithHuaweiIDResponse.state;
@@ -60,7 +60,7 @@ class HuaweiAuthPlugin {
 
   // getHuaweiIDState  api12 支持
 
-  async cancelAuth() {
+  static async cancelAuth() {
     try {
       // 1. 创建一个Account Kit授权请求对象,可通过返回值设置请求参数。
       const huaweiIdProvider = new authentication.HuaweiIDProvider()
@@ -76,4 +76,3 @@ class HuaweiAuthPlugin {
   }
 }
 
-export const huaweiAuthPlugin = new HuaweiAuthPlugin()

+ 13 - 4
commons/basic/src/main/ets/utils/PermissionControl.ets

@@ -1,14 +1,25 @@
 import { abilityAccessCtrl, bundleManager, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
 
-class PermissionControl {
+export class PermissionControl {
+  private declare static instance: PermissionControl
   private tokenID: number = 0
   //记录已申请权限,方便到时候调用checkPermission时传参
-  permissions: Permissions[] = []
+  private permissions: Permissions[] = []
   //上一次使用checkPermission校验的权限
   private lastPermission?: Permissions
   private context?: Context
   private atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
 
+  private constructor() {
+  }
+
+  static getInstance() {
+    if (!PermissionControl.instance) {
+      PermissionControl.instance = new PermissionControl()
+    }
+    return PermissionControl.instance
+  }
+
   //TODO 需要在windowStage中初始化
   async init(context: Context) {
     this.context = context
@@ -41,5 +52,3 @@ class PermissionControl {
     return true
   }
 }
-
-export const permissionControl = new PermissionControl()

+ 32 - 19
commons/basic/src/main/ets/utils/YTAvoid.ets

@@ -1,40 +1,53 @@
 import { window } from '@kit.ArkUI'
-import { avoidType } from '../models'
-
-export class YtAvoid {
-  static readonly safeTopKey: string = 'safeTop'
-  static readonly safeBottomKey: string = 'bottomTop'
-
- static setAvoid(avoid: avoidType) {
-  if (typeof avoid.top != 'undefined') {
-    AppStorage.setOrCreate<number>(YtAvoid.safeTopKey, px2vp(avoid.top))
-  }
-  if (typeof avoid.bottom != 'undefined') {
-    AppStorage.setOrCreate<number>(YtAvoid.safeBottomKey, px2vp(avoid.bottom))
+import { AvoidType } from '../models'
+import { YTLog } from '../../../../Index'
+
+export class YTAvoid {
+  /**
+   * @type number
+   * @description 顶部安全区高度
+   */
+  static readonly SAFE_TOP_KEY: string = 'safeTop'
+  /**
+   * @type number
+   * @description 底部安全区高度
+   */
+  static readonly SAFE_BOTTOM_KEY: string = 'bottomTop'
+
+  static setAvoid(avoid: AvoidType) {
+    if (typeof avoid.top != 'undefined') {
+      AppStorage.setOrCreate<number>(YTAvoid.SAFE_TOP_KEY, px2vp(avoid.top))
+    }
+    if (typeof avoid.bottom != 'undefined') {
+      AppStorage.setOrCreate<number>(YTAvoid.SAFE_BOTTOM_KEY, px2vp(avoid.bottom))
+    }
   }
-}
 
   static getTop() {
-    return AppStorage.get<number>(YtAvoid.safeTopKey)
+    return AppStorage.get<number>(YTAvoid.SAFE_TOP_KEY)
   }
 
   static getBottom() {
-
-    return AppStorage.get<number>(YtAvoid.safeBottomKey)
+    return AppStorage.get<number>(YTAvoid.SAFE_BOTTOM_KEY)
   }
 
   static setTop(safeTop: number) {
-    AppStorage.setOrCreate<number>(YtAvoid.safeTopKey, safeTop)
+    AppStorage.setOrCreate<number>(YTAvoid.SAFE_TOP_KEY, safeTop)
   }
 
 
   static setBottom(safeBottom: number) {
-    AppStorage.setOrCreate<number>(YtAvoid.safeBottomKey, safeBottom)
+    AppStorage.setOrCreate<number>(YTAvoid.SAFE_BOTTOM_KEY, safeBottom)
   }
 
   static setStatusBarContentColor(color: string, context: Context) {
     window.getLastWindow(context, (err, windowClass) => {
-      windowClass.setWindowSystemBarProperties({ statusBarContentColor: color })
+      if (!err) {
+        windowClass.setWindowSystemBarProperties({ statusBarContentColor: color })
+      } else {
+        YTLog.error(err)
+      }
+
     })
   }
 }

+ 30 - 20
commons/basic/src/main/ets/utils/YTBreakPoint.ets

@@ -1,35 +1,47 @@
-declare interface BreakPointTypeOption<T> {
+import { BreakPointString } from '../models'
+
+interface BreakPointTypeOption<T> {
   xs?: T
   sm?: T
   md?: T
   lg?: T
 }
 
+
 export class BreakPointType<T> {
-  options: BreakPointTypeOption<T>
+  private readonly options: BreakPointTypeOption<T>
 
   constructor(option: BreakPointTypeOption<T>) {
     this.options = option
   }
 
-  getValue(currentBreakPoint: string) {
-    if (currentBreakPoint === 'xs') {
-      return this.options.xs
-    } else if (currentBreakPoint === 'sm') {
-      return this.options.sm
-    } else if (currentBreakPoint === 'md') {
-      return this.options.md
-    } else if (currentBreakPoint === 'lg') {
-      return this.options.lg
-    } else {
-      return undefined
+  getValue(currentBreakPoint: BreakPointString) {
+    switch (currentBreakPoint) {
+      case 'xs':
+        return this.options.xs;
+      case 'sm':
+        return this.options.sm;
+      case 'md':
+        return this.options.md;
+      case 'lg':
+        return this.options.lg;
+      default:
+        return undefined;
     }
   }
 }
 
 
-class YTBreakPoint {
-  readonly KEY = 'bp'
+export class YTBreakPoint {
+  static readonly KEY = 'bp'
+  private static declare instance: YTBreakPoint
+
+  static getInstance() {
+    if (!YTBreakPoint.instance) {
+      YTBreakPoint.instance = new YTBreakPoint()
+    }
+    return YTBreakPoint.instance
+  }
 
   setBreakPoint(width: number) {
     const vpWidth = px2vp(width)
@@ -43,12 +55,10 @@ class YTBreakPoint {
     } else {
       bp = 'lg'
     }
-    AppStorage.setOrCreate<string>(this.KEY, bp)
+    AppStorage.setOrCreate<string>(YTBreakPoint.KEY, bp)
   }
 
   getBreakPoint() {
-    return AppStorage.get<string>(this.KEY)
+    return AppStorage.get<string>(YTBreakPoint.KEY)
   }
-}
-
-export const yTBreakPoint = new YTBreakPoint()
+}

+ 43 - 43
commons/basic/src/main/ets/utils/YTRequest.ets

@@ -8,11 +8,12 @@ import axios, {
   InternalAxiosRequestConfig
 } from '@ohos/axios';
 import { IBestToast, YTLog } from '../../../../Index';
-import { reqString } from '../models';
-import { UserInfo, userInfo } from '../models/UserInfo';
+import { AppStorageKeyCollect } from '../constants';
+import { ReqString } from '../models';
+import { UserInfo } from '../models/UserInfo';
 import { formatDate } from './FormatDate';
-import { huaweiAuthPlugin } from './HuaWeiAuthPlugin';
-import { yTRouter } from './YTRouter';
+import { HuaweiAuthPlugin } from './HuaWeiAuthPlugin';
+import { YTRouter } from './YTRouter';
 
 
 export const baseURL: string = 'https://hm-test.ytpm.net/prod-api'
@@ -26,8 +27,8 @@ export const instance = axios.create({
 instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
 
   // 对请求数据做点什么
-  if (AppStorage.get<string>('token')) {
-    config.headers.Authorization = AppStorage.get<string>('token')
+  if (AppStorage.get<string>(AppStorageKeyCollect.TOKEN)) {
+    config.headers.Authorization = AppStorage.get<string>(AppStorageKeyCollect.TOKEN)
   }
   return config;
 }, (error: AxiosError) => {
@@ -43,8 +44,8 @@ instance.interceptors.response.use((response: AxiosResponse) => {
   YTLog.info(response)
   // 对响应错误做点什么
   if (response.data.code == 401) {
-    userInfo.logout()
-    yTRouter.router2LoginPage()
+    UserInfo.getInstance().logout()
+    YTRouter.router2LoginPage()
     return Promise.reject('401');
   }
 
@@ -61,25 +62,25 @@ instance.interceptors.response.use((response: AxiosResponse) => {
 });
 
 
-class YtRequest {
-  private productName: string = 'chat'
+export class YTRequest {
+  private static productName: string = 'chat'
 
-  get<T>(url: string, params?: Record<string, string | number | boolean>,
+  static get<T>(url: string, params?: Record<string, string | number | boolean>,
     headers?: Record<string, string>): Promise<T> {
     return instance.get<null, T, null>(url, { params, headers })
   }
 
-  post<T, D>(url: string, data?: D, params?: Record<string, string | number | boolean>, headers?: AxiosHeaders) {
+  static post<T, D>(url: string, data?: D, params?: Record<string, string | number | boolean>, headers?: AxiosHeaders) {
     return instance.post<null, T, D>(url, data, { params, headers })
   }
 
-  upPost<T, D>(url: string, data: D, configs?: AxiosRequestConfig<D>) {
+  static upPost<T, D>(url: string, data: D, configs?: AxiosRequestConfig<D>) {
     return instance.post<string, T, D>(url, data, configs)
   }
 
   //获取验证码
-  getCaptcha(phonenumber: string, success: (res: string) => void, fail: (err: Error) => void) {
-    yTRequest.post<reqString, reqString>(`/api/${this.productName}/member/sendSmsCode`,
+  static getCaptcha(phonenumber: string, success: (res: string) => void, fail: (err: Error) => void) {
+    YTRequest.post<ReqString, ReqString>(`/api/${YTRequest.productName}/member/sendSmsCode`,
       { 'phonenumber': phonenumber })
       .then(res => {
         success(res['uuid'])
@@ -90,42 +91,42 @@ class YtRequest {
   }
 
   //手机号登录
-  phonenumberLogin(param: reqString) {
+  static phonenumberLogin(param: ReqString) {
     const uuid = AppStorage.get<string>('uuid')
     if (uuid !== undefined) {
-      yTRequest.post<reqString, reqString>(`/api/${this.productName}/member/phoneLogin`, {
+      YTRequest.post<ReqString, ReqString>(`/api/${YTRequest.productName}/member/phoneLogin`, {
         'phonenumber': param['phonenumber'],
         'smsCode': param['captcha'],
         'uuid': uuid
       })
         .then(res => {
-          userInfo.setToken(res['token'])
-          yTRequest.refreshUserInfo(() => {
+          UserInfo.getInstance().setToken(res[AppStorageKeyCollect.TOKEN])
+          YTRequest.refreshUserInfo(() => {
             IBestToast.show({ message: '登录成功' })
-            yTRouter.routerBack()
+            YTRouter.routerBack()
           })
         })
     }
   }
 
   //华为登录
-  huaweiLogin() {
+  static huaweiLogin() {
     try {
       IBestToast.showLoading()
-      huaweiAuthPlugin.requestAuth()
+      HuaweiAuthPlugin.requestAuth()
         .then(res => {
-          yTRequest.post<reqString, reqString>(`/api/${this.productName}/member/hmLogin`,
-            { 'code': res } as reqString)
+          YTRequest.post<ReqString, ReqString>(`/api/${YTRequest.productName}/member/hmLogin`,
+            { 'code': res } as ReqString)
             .then(data => {
               const token = data['token']
-              userInfo.setToken(token)
-              yTRequest.refreshUserInfo((userInfo) => {
+              UserInfo.getInstance().setToken(token)
+              YTRequest.refreshUserInfo((userInfo) => {
                 // YTLog.info(userInfo)
                 IBestToast.hide()
                 setTimeout(() => {
                   IBestToast.show({ message: '登录成功' })
                 }, 100)
-                yTRouter.routerBack()
+                YTRouter.routerBack()
               })
             })
             .catch((err: Error) => {
@@ -147,20 +148,20 @@ class YtRequest {
   }
 
   //刷新用户信息
-  refreshUserInfo(success?: (res: UserInfo) => void) {
-    yTRequest.post<UserInfo, null>(`/api/${this.productName}/member/info`)
+  static refreshUserInfo(success?: (res: UserInfo) => void) {
+    YTRequest.post<UserInfo, null>(`/api/${YTRequest.productName}/member/info`)
       .then(res => {
-        userInfo.setUserInfoAndLogin(res)
-        YTLog.info(userInfo)
+        UserInfo.getInstance().setUserInfoAndLogin(res)
+        YTLog.info(UserInfo.getInstance())
         success?.(res)
       })
   }
 
   //上传文件
-  uploadFile(context: Context, fullpath: string, success: (url: string) => void) {
+  static uploadFile(context: Context, fullpath: string, success: (url: string) => void) {
     const formData = new FormData()
     formData.append('file', fullpath)
-    yTRequest.upPost<reqString, FormData>('/common/upload', formData, {
+    YTRequest.upPost<ReqString, FormData>('/common/upload', formData, {
       headers: { 'Content-Type': 'multipart/form-data' },
       context,
       onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
@@ -175,11 +176,11 @@ class YtRequest {
   }
 
   // 修改用户头像
-  uploadHeadImg(context: Context, fullpath: string, success: () => void) {
+  static uploadHeadImg(context: Context, fullpath: string, success: () => void) {
     const formData = new FormData()
     formData.append('file', fullpath)
 
-    yTRequest.upPost<reqString, FormData>('/common/upload', formData, {
+    YTRequest.upPost<ReqString, FormData>('/common/upload', formData, {
       headers: { 'Content-Type': 'multipart/form-data' },
       context,
       onUploadProgress: (progressEvent: AxiosProgressEvent): void => {
@@ -189,7 +190,7 @@ class YtRequest {
     })
       .then(res => {
         const url = res['url']
-        yTRequest.post<null, reqString>(`/api/${this.productName}/member/modifyMemberIcon`, { 'memberIcon': url })
+        YTRequest.post<null, ReqString>(`/api/${YTRequest.productName}/member/modifyMemberIcon`, { 'memberIcon': url })
           .then(() => {
             success()
           })
@@ -204,25 +205,25 @@ class YtRequest {
   }
 
   // 修改用户昵称
-  changeNickname(name: string, success: () => void) {
-    yTRequest.post<null, reqString>(`/api/${this.productName}/member/modifyMemberName`, { 'memberName': name })
+  static changeNickname(name: string, success: () => void) {
+    YTRequest.post<null, ReqString>(`/api/${YTRequest.productName}/member/modifyMemberName`, { 'memberName': name })
       .then(() => {
-        yTRequest.refreshUserInfo(() => {
+        YTRequest.refreshUserInfo(() => {
           success()
         })
       })
   }
 
   //问题反馈
-  questionBack(des: string, createBy: string) {
-    yTRequest.post<null, reqString>(`/api/${this.productName}/question/saveQuestion`, {
+  static questionBack(des: string, createBy: string) {
+    YTRequest.post<null, ReqString>(`/api/${YTRequest.productName}/question/saveQuestion`, {
       'backQuestion': des,
       'createBy': createBy,
       'createTime': formatDate(new Date()),
     })
       .then(() => {
         IBestToast.show("反馈成功")
-        yTRouter.routerBack()
+        YTRouter.routerBack()
       })
       .catch((e: Error) => {
         YTLog.error(e)
@@ -230,5 +231,4 @@ class YtRequest {
   }
 }
 
-export const yTRequest = new YtRequest()
 

+ 36 - 25
commons/basic/src/main/ets/utils/YTRouter.ets

@@ -1,55 +1,66 @@
 import { DelPhotoParam } from '../models'
 
-class YTRouter extends NavPathStack {
-  router2SettingPage() {
-    yTRouter.pushPathByName('SettingPage', '')
+export class YTRouter extends NavPathStack {
+  private static declare instance: YTRouter
+
+  private constructor() {
+    super()
+  }
+
+  static getInstance() {
+    if (!YTRouter.instance) {
+      YTRouter.instance = new YTRouter()
+    }
+    return YTRouter.instance
   }
 
-  router2SuggestionPage() {
-    yTRouter.pushPathByName('SuggestionPage', '')
+  static router2SettingPage() {
+    YTRouter.getInstance().pushPathByName('SettingPage', '')
   }
 
-  router2AgreementPage(param: '关于我们' | '隐私政策' | '用户协议') {
-    yTRouter.pushPathByName('AgreementPage', param)
+  static router2SuggestionPage() {
+    YTRouter.getInstance().pushPathByName('SuggestionPage', '')
+  }
+
+  static router2AgreementPage(param: '关于我们' | '隐私政策' | '用户协议') {
+    YTRouter.getInstance().pushPathByName('AgreementPage', param)
   }
 
   /**
    * 跳转至用户协议
    */
-  router2userAgreement() {
-    yTRouter.pushPathByName('UserAgreementPage', '')
+  static router2userAgreement() {
+    YTRouter.getInstance().pushPathByName('UserAgreementPage', '')
   }
 
   /**
    * 跳转至隐私政策
    */
-  router2Privacy() {
-    yTRouter.pushPathByName('Privacy', '')
+  static router2Privacy() {
+    YTRouter.getInstance().pushPathByName('Privacy', '')
   }
 
-  router2AboutUS() {
-    yTRouter.pushPathByName('AboutUS', '')
+  static router2AboutUS() {
+    YTRouter.getInstance().pushPathByName('AboutUS', '')
   }
 
-  getAgreementPageParam() {
-    return yTRouter.getParamByName('AgreementPage').pop() as '关于我们' | '隐私政策' | '用户协议'
+  static getAgreementPageParam() {
+    return YTRouter.getInstance().getParamByName('AgreementPage').pop() as '关于我们' | '隐私政策' | '用户协议'
   }
 
-  router2LoginPage() {
-    yTRouter.pushPathByName('LoginPage', '')
+  static router2LoginPage() {
+    YTRouter.getInstance().pushPathByName('LoginPage', '')
   }
 
-  router2DelPhotoPage(param: DelPhotoParam) {
-    yTRouter.pushPathByName('DelPhotoPage', param)
+  static router2DelPhotoPage(param: DelPhotoParam) {
+    YTRouter.getInstance().pushPathByName('DelPhotoPage', param)
   }
 
-  getDelPhotoParam() {
-    return yTRouter.getParamByName('DelPhotoPage').pop() as DelPhotoParam
+  static getDelPhotoParam() {
+    return YTRouter.getInstance().getParamByName('DelPhotoPage').pop() as DelPhotoParam
   }
 
-  routerBack() {
-    yTRouter.pop()
+  static routerBack() {
+    YTRouter.getInstance().pop()
   }
 }
-
-export const yTRouter = new YTRouter()

+ 8 - 1
commons/basic/src/main/ets/utils/YTToast.ets

@@ -32,11 +32,19 @@ class Params<T> implements BasicType<T> {
 }
 
 export class YTToast {
+  private static declare instance: YTToast
   private declare ctx: UIContext;
   private declare contentNode: ComponentContent<Object> | null;
   private declare options: promptAction.BaseDialogOptions;
   private maskColor: string = '#80000000'
 
+  static getInstance() {
+    if (!YTToast.instance) {
+      YTToast.instance = new YTToast()
+    }
+    return YTToast.instance
+  }
+
   init(initOption: InitOption) {
     this.ctx = initOption.context;
     initOption.options.maskColor = this.maskColor
@@ -117,4 +125,3 @@ export class YTToast {
   }
 }
 
-export const yTToast = new YTToast()

+ 4 - 4
features/user/src/main/ets/components/LoginInput.ets

@@ -1,4 +1,4 @@
-import { IBestToast, yTRequest } from 'basic'
+import { IBestToast, YTRequest } from 'basic'
 import { CodeInputType } from '../models'
 
 @Component
@@ -9,8 +9,8 @@ export struct LoginInput {
   @Prop phoneNumber: string
   code: string = ''
   @State time: number = 61
-  private declare sa: number
   needCode: boolean = true
+  private declare sa: number
 
   aboutToDisappear(): void {
     clearInterval(this.sa)
@@ -55,7 +55,7 @@ export struct LoginInput {
                 }
               }, 1000)
               // TODO  此处放置验证码获取逻辑
-              yTRequest.getCaptcha(this.phoneNumber, (res) => {
+              YTRequest.getCaptcha(this.phoneNumber, (res) => {
                 if (!res) {
                   IBestToast.show({ message: '请勿重复发送验证码' })
                   return
@@ -66,7 +66,7 @@ export struct LoginInput {
                 IBestToast.show({ message: '验证码发送失败' })
                 this.time = 61
               })
-              // yTRequest.post<CodeType, AskCodeNum>('/api/friendcase/member/sendSmsCode',
+              // YTRequest.post<CodeType, AskCodeNum>('/api/friendcase/member/sendSmsCode',
               //   { phonenumber: this.phoneNumber })
               //   .then(res => {
               //     if (!res) {

+ 3 - 3
features/user/src/main/ets/components/Terms.ets

@@ -1,4 +1,4 @@
-import { yTRouter } from 'basic'
+import { YTRouter } from 'basic'
 
 @Extend(Span)
 function spanEx(click: () => void) {
@@ -25,13 +25,13 @@ export struct Terms {
           // Span('以及')
           Span('"用户协议"')
             .spanEx(() => {
-              yTRouter.router2userAgreement()
+              YTRouter.router2userAgreement()
 
             })
           Span('和')
           Span('"隐私政策"')
             .spanEx(() => {
-              yTRouter.router2Privacy()
+              YTRouter.router2Privacy()
             })
           Span('。')
         }

+ 4 - 4
features/user/src/main/ets/pages/AboutUS.ets

@@ -1,4 +1,4 @@
-import { YtAvoid, YTHeader, yTRouter } from 'basic';
+import { YTAvoid, YTHeader, YTRouter } from 'basic';
 import { bundleManager } from '@kit.AbilityKit';
 
 
@@ -14,7 +14,7 @@ function AboutUSBuilder() {
 export struct AboutUS {
   @State content: string = '';
   @State isAgree: boolean = false
-  @StorageProp(YtAvoid.safeBottomKey) safeBottom: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) safeBottom: number = 0
   ICPRecordNumber: string = '19019164号-5A'
   listData: string[] = ['用户协议', '隐私政策']
   @State versionName: string = ''
@@ -50,10 +50,10 @@ export struct AboutUS {
               .onClick(() => {
                 switch (index) {
                   case 0:
-                    yTRouter.router2userAgreement()
+                    YTRouter.router2userAgreement()
                     break;
                   case 1:
-                    yTRouter.router2Privacy()
+                    YTRouter.router2Privacy()
                     break;
                 }
 

+ 12 - 12
features/user/src/main/ets/pages/DelPhotoPage.ets

@@ -1,4 +1,4 @@
-import { CropController, CropView, IBestToast, YtAvoid, YTLog, yTRequest, yTRouter } from 'basic'
+import { CropController, CropView, IBestToast, YTAvoid, YTLog, YTRequest, YTRouter } from 'basic'
 import { fileIo } from '@kit.CoreFileKit'
 import { util } from '@kit.ArkTS'
 import { emitter } from '@kit.BasicServicesKit'
@@ -13,7 +13,7 @@ function delPhotoPageBuilder() {
 
 @Component
 struct DelPhotoPage {
-  @StorageProp(YtAvoid.safeBottomKey) private safeBottom: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) private safeBottom: number = 0
   @State private selectPhoto: string = ''
   @State private frameWidth: number = 220
   @State private frameHeight: number = 220
@@ -24,8 +24,8 @@ struct DelPhotoPage {
   private declare context: Context
 
   aboutToAppear(): void {
-    this.selectPhoto = yTRouter.getDelPhotoParam().src
-    this.type = yTRouter.getDelPhotoParam().type
+    this.selectPhoto = YTRouter.getDelPhotoParam().src
+    this.type = YTRouter.getDelPhotoParam().type
     const tempContext = this.getUIContext().getHostContext()
     if (tempContext === undefined) {
       //抛出异常
@@ -34,11 +34,11 @@ struct DelPhotoPage {
       this.context = tempContext
     }
 
-    YtAvoid.setStatusBarContentColor('#FFFFFF', this.context)
+    YTAvoid.setStatusBarContentColor('#FFFFFF', this.context)
   }
 
   aboutToDisappear(): void {
-    YtAvoid.setStatusBarContentColor('#000000', this.context)
+    YTAvoid.setStatusBarContentColor('#000000', this.context)
   }
 
   build() {
@@ -177,7 +177,7 @@ struct DelPhotoPage {
           .width(36)
           .aspectRatio(1)
           .onClick(() => {
-            yTRouter.routerBack()
+            YTRouter.routerBack()
           })
 
         Image($r('app.media.make_sure'))
@@ -197,22 +197,22 @@ struct DelPhotoPage {
 
                   if (this.type == 'header') {
                     IBestToast.showLoading({ message: '上传中...' })
-                    yTRequest.uploadHeadImg(this.getUIContext().getHostContext()!, fullpath, () => {
-                      yTRequest.refreshUserInfo(() => {
+                    YTRequest.uploadHeadImg(this.getUIContext().getHostContext()!, fullpath, () => {
+                      YTRequest.refreshUserInfo(() => {
                         IBestToast.hide()
                         setTimeout(() => {
                           IBestToast.show({ message: '头像修改成功', type: 'success' })
                         }, 100)
                       })
                     })
-                    yTRouter.routerBack()
+                    YTRouter.routerBack()
                   }
                   if (this.type == 'image') {
                     IBestToast.showLoading({ message: '上传中...' })
-                    yTRequest.uploadFile(this.getUIContext().getHostContext()!, fullpath, (url) => {
+                    YTRequest.uploadFile(this.getUIContext().getHostContext()!, fullpath, (url) => {
                       emitter.emit('upLoadEnd', { data: url })
                       IBestToast.hide()
-                      yTRouter.routerBack()
+                      YTRouter.routerBack()
                     })
                   }
 

+ 11 - 13
features/user/src/main/ets/pages/LoginPage.ets

@@ -1,11 +1,9 @@
-import { BasicType, YtAvoid, YtButton, yTRequest, yTRouter, yTToast } from 'basic'
+import { BasicType, YTAvoid, YtButton, YTRequest, YTRouter, YTToast } from 'basic'
 import { CodeInputType } from '../models'
 import { LoginInput } from '../components/LoginInput'
 import { Terms } from '../components/Terms'
 import { OtherLoginMethods } from '../components/OtherLoginMethods'
 
-// import { OtherLoginMethods } from '../views/OtherLoginMethods'
-
 
 @Builder
 function LoginBuilder() {
@@ -18,8 +16,8 @@ function LoginBuilder() {
 @Component
 struct LoginPage {
   @State isAgree: boolean = false
-  @StorageProp(YtAvoid.safeTopKey) safeTop: number = 0
-  @StorageProp(YtAvoid.safeBottomKey) safeBottom: number = 0
+  @StorageProp(YTAvoid.SAFE_TOP_KEY) safeTop: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) safeBottom: number = 0
   @State phoneNumber: string = ''
   @State Captcha: string = ''
   inputPhoneNumberType: CodeInputType = {
@@ -44,10 +42,10 @@ struct LoginPage {
       text: '华为登录',
       click: () => {
         if (!this.isAgree) {
-          yTToast.agreePrivacy({ text: '华为登录' })
+          YTToast.getInstance().agreePrivacy({ text: '华为登录' })
           return
         }
-        yTRequest.huaweiLogin()
+        YTRequest.huaweiLogin()
       }
     }
   ]
@@ -63,7 +61,7 @@ struct LoginPage {
         .aspectRatio(1)
         .margin({ bottom: 66 })
         .onClick(() => {
-          yTRouter.routerBack()
+          YTRouter.routerBack()
         })
       Text('使用电话号码访问')
         .fontSize($r('[basic].float.page_text_font_size_10'))
@@ -85,10 +83,10 @@ struct LoginPage {
                 'phonenumber': this.phoneNumber,
                 'captcha': this.Captcha
               })
-            yTToast.agreePrivacy({ text: '验证码登录' })
+            YTToast.getInstance().agreePrivacy({ text: '验证码登录' })
             return
           }
-          yTRequest.phonenumberLogin({
+          YTRequest.phonenumberLogin({
             'phonenumber': this.phoneNumber,
             'captcha': this.Captcha
           })
@@ -109,11 +107,11 @@ struct LoginPage {
       //     uuid: code?.uuid
       //   }
       //
-      //   yTRequest.post<TokenType, AskCodeNum>('/api/friendcase/member/phoneLogin', askCodeNum)
+      //   YTRequest.post<TokenType, AskCodeNum>('/api/friendcase/member/phoneLogin', askCodeNum)
       //     .then(res => {
       //       AppStorage.setOrCreate(AppstorageKey.TOKEN, res.token)
-      //       yTRequest.refreshUserInfo()
-      //       yTRouter.routerBack()
+      //       YTRequest.refreshUserInfo()
+      //       YTRouter.routerBack()
       //       AppStorage.setOrCreate<string>(AppstorageKey.PHONE_NUMBER, this.phoneNumber)
       //       IBestToast.show('登录成功')
       //     })

+ 2 - 2
features/user/src/main/ets/pages/Privacy.ets

@@ -1,4 +1,4 @@
-import { YtAvoid, YTHeader } from 'basic';
+import { YTAvoid, YTHeader } from 'basic';
 import { webview } from '@kit.ArkWeb';
 
 
@@ -13,8 +13,8 @@ function PrivacyBuilder() {
 @Component
 export struct Privacy {
   @State content: string = '';
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) safeBottom: number = 0
   private webviewController: WebviewController = new webview.WebviewController()
-  @StorageProp(YtAvoid.safeBottomKey) safeBottom: number = 0
 
   build() {
 

+ 15 - 16
features/user/src/main/ets/pages/SettingPage.ets

@@ -5,14 +5,13 @@ import {
   takePicture,
   Upload,
   UserInfo,
-  userInfo,
-  YtAvoid,
+  YTAvoid,
   YtButton,
   YTHeader,
   YTLog,
-  yTRequest,
-  yTRouter,
-  yTToast
+  YTRequest,
+  YTRouter,
+  YTToast
 } from 'basic'
 
 @Builder
@@ -25,9 +24,9 @@ function settingBuilder() {
 
 @Component
 struct SettingPage {
-  @StorageProp(YtAvoid.safeTopKey) safeTop: number = 0
-  @StorageProp(YtAvoid.safeBottomKey) safeBottom: number = 0
-  @StorageProp(userInfo.KEY) userInfo: UserInfo = new UserInfo()
+  @StorageProp(YTAvoid.SAFE_TOP_KEY) safeTop: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) safeBottom: number = 0
+  @StorageProp(UserInfo.KEY) userInfo: UserInfo = UserInfo.getInstance()
   @State showReviseName: boolean = false
   @State showHeaderImgRevise: boolean = false
   @State value: string = ''
@@ -53,7 +52,7 @@ struct SettingPage {
         try {
           const fullpath = await takePicture()
           this.showHeaderImgRevise = false
-          yTRouter.router2DelPhotoPage({ src: fullpath, type: 'header' })
+          YTRouter.router2DelPhotoPage({ src: fullpath, type: 'header' })
         } catch (e) {
           YTLog.warn(e)
         }
@@ -64,7 +63,7 @@ struct SettingPage {
       click: () => {
         Upload.selectImage(this.getUIContext().getHostContext()!, (fullPath) => {
           this.showHeaderImgRevise = false
-          yTRouter.router2DelPhotoPage({ src: fullPath, type: 'image' })
+          YTRouter.router2DelPhotoPage({ src: fullPath, type: 'image' })
         })
       }
     },
@@ -100,7 +99,7 @@ struct SettingPage {
         YtButton({
           btContent: '退出登录', click: () => {
             this.userInfo.logout()
-            yTRouter.routerBack()
+            YTRouter.routerBack()
             IBestToast.show({ message: '退出登录成功' })
           }
         })
@@ -110,11 +109,11 @@ struct SettingPage {
           btFontColor: Color.Red,
           bgc: Color.White,
           click: () => {
-            yTToast.doubleConfirm({
+            YTToast.getInstance().doubleConfirm({
               text: '警告⚠', message: '确定要注销吗?\n注销后数据可能丢失无法恢复!', click: () => {
-                userInfo.logout()
-                yTToast.hide()
-                yTRouter.pop()
+                UserInfo.getInstance().logout()
+                YTToast.getInstance().hide()
+                YTRouter.routerBack()
               }
             })
           }
@@ -229,7 +228,7 @@ struct SettingPage {
               })
               return
             }
-            yTRequest.changeNickname(this.value, () => {
+            YTRequest.changeNickname(this.value, () => {
               IBestToast.show({ message: '名称修改成功' })
             })
             //TODO 发送请求后关闭弹窗

+ 3 - 3
features/user/src/main/ets/pages/SuggestionPage.ets

@@ -1,4 +1,4 @@
-import { IBestToast, YtAvoid, YtButton, YTHeader, yTRequest } from 'basic'
+import { IBestToast, YTAvoid, YtButton, YTHeader, YTRequest } from 'basic'
 
 @Builder
 function suggestionBuilder() {
@@ -10,7 +10,7 @@ function suggestionBuilder() {
 
 @Component
 struct SuggestionPage {
-  @StorageProp(YtAvoid.safeBottomKey) safeBottom: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) safeBottom: number = 0
   @State description: string = ''
   @State contact: string = ''
 
@@ -122,7 +122,7 @@ struct SuggestionPage {
               })
               return
             }
-            yTRequest.questionBack(this.description, this.contact)
+            YTRequest.questionBack(this.description, this.contact)
             // //TODO 发请求提交反馈
             // YTLog.info(this.description + this.contact + '反馈提交了')
           }

+ 50 - 53
features/user/src/main/ets/views/Mine.ets

@@ -1,23 +1,21 @@
-import { BasicType, copyText, IBestToast, ShowBannerAd, UserInfo, userInfo, YtAvoid, YTLog, yTRouter } from 'basic'
+import { BasicType, copyText, IBestToast, UserInfo, YTAvoid, YTLog, YTRouter } from 'basic'
 import { common, Want } from '@kit.AbilityKit'
 import { BusinessError } from '@kit.BasicServicesKit'
 import { BUNDLE_NAME } from 'BuildProfile'
 
 @Component
 export struct Mine {
-  @StorageProp(YtAvoid.safeTopKey) safeTop: number = 0
-  @StorageProp(userInfo.KEY) userInfo: UserInfo = new UserInfo()
+  @StorageProp(YTAvoid.SAFE_TOP_KEY) safeTop: number = 0
+  @StorageProp(UserInfo.KEY) userInfo: UserInfo = UserInfo.getInstance()
   setArr: Array<BasicType<undefined>> = [
     {
       text: '意见反馈',
       click: () => {
-
         if (this.userInfo.checkLogin()) {
-          yTRouter.router2SuggestionPage()
+          YTRouter.router2SuggestionPage()
         } else {
-          yTRouter.router2LoginPage()
+          YTRouter.router2LoginPage()
         }
-
       },
       src: $r('app.media.right_arrow')
     },
@@ -27,7 +25,7 @@ export struct Mine {
         const want: Want = {
           uri: "store://appgallery.huawei.com/app/detail?id=" + BUNDLE_NAME
         };
-        const context = getContext(this) as common.UIAbilityContext;
+        const context = this.getUIContext().getHostContext() as common.UIAbilityContext;
         context.startAbility(want).then(() => {
           //拉起成功
           YTLog.info('跳转成功')
@@ -42,7 +40,7 @@ export struct Mine {
     {
       text: '关于我们',
       click: () => {
-        yTRouter.router2AboutUS()
+        YTRouter.router2AboutUS()
       },
       src: $r('app.media.right_arrow')
     }
@@ -56,24 +54,17 @@ export struct Mine {
     Column() {
       Row() {
         Row() {
-          if (this.userInfo.getHeadImg()) {
-            Image(this.userInfo.getHeadImg())
-              .aspectRatio(1)
-              .height(40)
-              .borderRadius(20)
-              .margin({ right: 9 })
-          } else {
-            Image($r('app.media.app_icon'))
-              .height(40)
-              .aspectRatio(1)
-              .margin({ right: 9 })
-          }
+          Image(this.userInfo.getHeadImg() ?? $r('app.media.app_icon'))
+            .aspectRatio(1)
+            .height(40)
+            .borderRadius(20)
+            .margin({ right: 9 })
 
           Column({ space: 7 }) {
             Text(this.userInfo.getName() ?? this.userInfo.getPhoneNumber() ?? this.userInfo.getId()?.toString() ??
               '未登录')
               .fontSize($r('[basic].float.page_text_font_size_16'))
-              .fontColor('#FF000000')
+              .fontColor('Color.Black')
             Text() {
               Span('ID:' + (this.userInfo.getId()?.toString().padStart(8, '0') ?? '00000000'))
               ImageSpan($r('app.media.copy'))
@@ -93,51 +84,57 @@ export struct Mine {
         .onClick(() => {
 
           if (this.userInfo.checkLogin()) {
-            yTRouter.router2SettingPage()
+            YTRouter.router2SettingPage()
             return
           }
-          yTRouter.router2LoginPage()
+          YTRouter.router2LoginPage()
         })
       }
       .width('100%')
       .margin({ bottom: 30 })
 
-      ShowBannerAd()
-
-      List() {
-        ForEach(this.setArr, (item: BasicType<undefined>, index) => {
-          ListItem() {
-            Row() {
-              Text(item.text)
-                .fontColor('#80000000')
-                .fontSize(12)
-              if (!index) {
-                Row() {
-                  Text(this.userInfo.getAiNum()?.toString() ?? '')
-                    .fontWeight(600)
-                    .fontSize($r('[basic].float.page_text_font_size_14'))
+      // ShowBannerAd()
+      Column() {
+        List() {
+          ForEach(this.setArr, (item: BasicType<undefined>, index) => {
+            ListItem() {
+              Row() {
+                Text(item.text)
+                  .fontColor('#80000000')
+                  .fontSize(12)
+                if (!index) {
+                  Row() {
+                    Text(this.userInfo.getAiNum()?.toString() ?? '')
+                      .fontWeight(600)
+                      .fontSize($r('[basic].float.page_text_font_size_14'))
+                    Image($r('app.media.right_arrow'))
+                      .width(24)
+                      .aspectRatio(1)
+                  }
+                } else {
                   Image($r('app.media.right_arrow'))
                     .width(24)
                     .aspectRatio(1)
                 }
-              } else {
-                Image($r('app.media.right_arrow'))
-                  .width(24)
-                  .aspectRatio(1)
               }
+              .width('100%')
+              .height(36)
+              .justifyContent(FlexAlign.SpaceBetween)
+              .onClick(() => {
+                item.click?.()
+              })
             }
-            .width('100%')
-            .height(36)
-            .justifyContent(FlexAlign.SpaceBetween)
-            .onClick(() => {
-              item.click?.()
-            })
-          }
-        })
+          })
+        }
+        .padding({ left: 12, right: 4 })
+        .divider({ strokeWidth: 1, color: '#0A000000', endMargin: 8 })
+        .margin({ top: 30 })
+        .width('100%')
+        .height('100%')
       }
-      .padding({ left: 12, right: 4 })
-      .divider({ strokeWidth: 1, color: '#0A000000', endMargin: 8 })
-      .margin({ top: 30 })
+      .layoutWeight(1)
+      .width('100%')
+
     }
     .padding({ top: this.safeTop + 22, left: 16, right: 16 })
     .height('100%')

+ 12 - 12
products/entry/src/main/ets/entryability/EntryAbility.ets

@@ -1,7 +1,7 @@
 import { AbilityConstant, bundleManager, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
 import { hilog } from '@kit.PerformanceAnalysisKit';
 import { window } from '@kit.ArkUI';
-import { jhStartAd, permissionControl, YtAvoid, yTBreakPoint, YTLog, yTRequest } from 'basic';
+import { AppStorageKeyCollect, JhStartAd, PermissionControl, YTAvoid, YTBreakPoint, YTLog, YTRequest } from 'basic';
 import { identifier } from '@kit.AdsKit';
 import { BusinessError } from '@kit.BasicServicesKit';
 import { preferences } from '@kit.ArkData';
@@ -34,9 +34,9 @@ export default class EntryAbility extends UIAbility {
         logSize: 800
       })
 
-      PersistentStorage.persistProp<string>('token', '')
-      if (AppStorage.get<string>('token')) {
-        yTRequest.refreshUserInfo()
+      PersistentStorage.persistProp<string>(AppStorageKeyCollect.TOKEN, '')
+      if (AppStorage.get<string>(AppStorageKeyCollect.TOKEN)) {
+        YTRequest.refreshUserInfo()
       }
       // IBestInit(windowStage, this.context)
       bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)
@@ -46,9 +46,9 @@ export default class EntryAbility extends UIAbility {
         .catch((err: Error) => {
           YTLog.error(err)
         })
-      permissionControl.init(this.context)
+      PermissionControl.getInstance().init(this.context)
         .then(() => {
-          permissionControl.askPermission(["ohos.permission.APP_TRACKING_CONSENT"], (res) => {
+          PermissionControl.getInstance().askPermission(["ohos.permission.APP_TRACKING_CONSENT"], (res) => {
             if (res.authResults[0] === 0) {
               YTLog.info('succeeded in requesting permission');
               identifier.getOAID((err: BusinessError, data: string) => {
@@ -56,7 +56,7 @@ export default class EntryAbility extends UIAbility {
                   YTLog.error(`get oaid failed, error: ${err.code} ${err.message}`);
                 } else {
                   const oaid: string = data;
-                  jhStartAd.init(this.context, oaid)
+                  JhStartAd.getInstance().init(this.context, oaid)
                   AppStorage.setOrCreate('OAID', oaid)
                   YTLog.info(`succeeded in getting oaid by callback , oaid: ${oaid}`);
                 }
@@ -74,25 +74,25 @@ export default class EntryAbility extends UIAbility {
       windowClass.setWindowLayoutFullScreen(true)
       const top = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height
       const bottom = windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect.height
-      YtAvoid.setAvoid({
+      YTAvoid.setAvoid({
         top, bottom
       })
       windowClass.on('avoidAreaChange', avoidOption => {
         if (avoidOption.type == window.AvoidAreaType.TYPE_SYSTEM) {
-          YtAvoid.setAvoid({
+          YTAvoid.setAvoid({
             top: avoidOption.area.topRect.height
           })
         }
         if (avoidOption.type == window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR) {
-          YtAvoid.setAvoid({
+          YTAvoid.setAvoid({
             bottom: avoidOption.area.bottomRect.height
           })
         }
       })
       const windowWidth = windowClass.getWindowProperties().windowRect.width
-      yTBreakPoint.setBreakPoint(windowWidth)
+      YTBreakPoint.getInstance().setBreakPoint(windowWidth)
       windowClass.on('windowSizeChange', size => {
-        yTBreakPoint.setBreakPoint(size.width)
+        YTBreakPoint.getInstance().setBreakPoint(size.width)
       })
       //创建首选项 category
       let preference: preferences.Preferences | null = null

+ 4 - 4
products/entry/src/main/ets/pages/Index.ets

@@ -1,4 +1,4 @@
-import { BasicType, YtAvoid, yTRouter, yTToast } from 'basic';
+import { BasicType, YTAvoid, YTRouter, YTToast } from 'basic';
 import { Mine } from 'user/src/main/ets/views/Mine';
 import { MainView, SecondView, ThirdView } from 'feature';
 
@@ -6,7 +6,7 @@ import { MainView, SecondView, ThirdView } from 'feature';
 @Component
 struct Index {
   @State currentIndex: number = 0
-  @StorageProp(YtAvoid.safeBottomKey) bottom: number = 0
+  @StorageProp(YTAvoid.SAFE_BOTTOM_KEY) bottom: number = 0
   //tabs展示内容
   contentList: BasicType<undefined>[] = [
     {
@@ -33,14 +33,14 @@ struct Index {
   tabsController: TabsController = new TabsController()
 
   aboutToAppear(): void {
-    yTToast.init({
+    YTToast.getInstance().init({
       context: this.getUIContext(),
       options: { alignment: DialogAlignment.Center, maskColor: '#80000000' }
     })
   }
 
   build() {
-    Navigation(yTRouter) {
+    Navigation(YTRouter.getInstance()) {
       Column() {
         Tabs({ controller: this.tabsController }) {
           ForEach(this.contentList, (_: BasicType<undefined>, index) => {