Browse Source

调整Api接口

bjb 4 months ago
parent
commit
e472236293

+ 3 - 2
entry/src/main/ets/api/req/ReqApi.ets

@@ -1,4 +1,5 @@
 import { Request } from '../../utils/HttpClient';
+import { Rsp } from '../rsp/Rsp';
 import { RspLogin } from '../rsp/RspLogin';
 import { ReqLogin } from './ReqLogin';
 
@@ -10,8 +11,8 @@ export class ReqApi {
    * @param pwd       密码
    * @returns
    */
-  static login(username: string, pwd: string): Promise<RspLogin> {
+  static login(username: string, pwd: string): Promise<Rsp<RspLogin>> {
     const req = new ReqLogin(username, pwd)
-    return Request.post("/login", req)
+    return Request.post("/admin-api/system/auth/login", req)
   }
 }

+ 4 - 2
entry/src/main/ets/api/rsp/Rsp.ets

@@ -1,6 +1,8 @@
-export class Rsp {
+export class Rsp<T> {
   // 响应码
-  code: number = 0
+  code: number = -1
   // 响应信息
   msg: string = ""
+  // 响应数据
+  data: T | undefined = undefined
 }

+ 10 - 6
entry/src/main/ets/api/rsp/RspLogin.ets

@@ -1,8 +1,12 @@
-import { Rsp } from './Rsp';
-
-export class RspLogin extends Rsp {
+export class RspLogin {
+  // 用户id
+  id: number = 0
   // 用户昵称
-  nickName: string = ""
-  // 用户Token
-  token: string = ""
+  nickname: string = ""
+  // 用户名
+  username: string = ""
+  // token
+  accessToken: string = ""
+  // refreshToken
+  refreshToken: string = ""
 }

+ 31 - 0
entry/src/main/ets/components/CardContainer.ets

@@ -0,0 +1,31 @@
+@Component
+export struct CardContainer {
+  @Prop radius: number = 16
+  @Prop shadowColor: string = '#000000'
+  @Prop shadowOpacity: number = 0.15
+  @Prop blurRadius: number = 20
+  @Prop cardColor: Color = Color.White
+  @Prop paddings: number = 16
+  @BuilderParam children: () => void = this.content
+
+  build() {
+    Column() {
+      // 内容插槽
+      this.content()
+    }
+    .padding(this.paddings)
+    .backgroundColor(this.cardColor)
+    .borderRadius(this.radius)
+    .shadow({
+      radius: this.blurRadius,
+      color: this.shadowColor,
+      offsetX: 0,
+      offsetY: 0
+    })
+  }
+
+  @Builder
+  content() {
+
+  }
+}

+ 2 - 2
entry/src/main/ets/pages/PageHome.ets

@@ -12,7 +12,7 @@ struct PageHome {
   build() {
     Tabs({ barPosition: BarPosition.End, index: this.vm.tabIndex }) {
       TabContent() {
-        TabHome({ vmHome: this.vm })
+        TabHome({ vm: this.vm })
       }
       .tabBar(this.TabBuilder(0, "首页", $r('app.media.home')))
       .clip(false)
@@ -30,7 +30,7 @@ struct PageHome {
       .clip(false)
 
       TabContent() {
-        TabSettings()
+        TabSettings({ vm: this.vm })
       }
       .tabBar(this.TabBuilder(3, "设置", $r("app.media.settings")))
       .clip(false)

+ 6 - 9
entry/src/main/ets/pages/PageHomeComponents/TabHome.ets

@@ -1,5 +1,4 @@
 import { VMHome } from '../../vm/VMHome';
-import { VMTabHome } from '../../vm/VMTabHome';
 import { abilityAccessCtrl } from '@kit.AbilityKit';
 import { BleManager } from 'bozzys_sdk/src/main/ets/ble/BleManager';
 
@@ -9,9 +8,7 @@ import { BleManager } from 'bozzys_sdk/src/main/ets/ble/BleManager';
 @Component
 export struct TabHome {
   // 父组件传递
-  @Link vmHome: VMHome
-  // 页面状态
-  @State vm: VMTabHome = new VMTabHome()
+  @Link vm: VMHome
 
   aboutToAppear(): void {
     this.vm.init()
@@ -76,8 +73,8 @@ export struct TabHome {
           // am.requestPermissionsFromUser(this.getUIContext().getHostContext(), ["ohos.permission.ACCESS_BLUETOOTH"]).then((data) => {
           //   console.log("权限请求", JSON.stringify(data))
           // })
-          const bm = new BleManager("CC:BA:97:21:71:CA")
-          bm.connect()
+          // const bm = new BleManager("CC:BA:97:21:71:CA")
+          // bm.connect()
         })
       }
       .width("100%")
@@ -89,7 +86,7 @@ export struct TabHome {
       })
     }
     .width("100%")
-    .backgroundColor("#FFA500")
+    .linearGradient({ angle: 90, colors: [['#FF8C00', 0.0], ['#FFA500', 1.0]] })
     .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
   }
 
@@ -161,7 +158,7 @@ export struct TabHome {
           Row().layoutWeight(1)
           Text("查看全部").fontSize(14).fontColor("#1E90FF").fontWeight(FontWeight.Medium)
         }.width("100%").height(46).onClick(() => {
-          this.vmHome.updateTabIndex(1)
+          this.vm.updateTabIndex(1)
         })
       }
 
@@ -233,7 +230,7 @@ export struct TabHome {
           Row().layoutWeight(1)
           Text("全部消息").fontSize(14).fontColor("#1E90FF").fontWeight(FontWeight.Medium)
         }.width("100%").height(46).onClick(() => {
-          this.vmHome.updateTabIndex(2)
+          this.vm.updateTabIndex(2)
         })
       }
 

+ 50 - 1
entry/src/main/ets/pages/PageHomeComponents/TabSettings.ets

@@ -1,6 +1,55 @@
+import { CardContainer } from '../../components/CardContainer'
+import { VMHome } from '../../vm/VMHome'
+
 @Component
 export struct TabSettings {
+  // 父组件传递
+  @Link vm: VMHome
+
   build() {
-    Text("我是设置")
+    Column() {
+      this.TopBar()
+      CardContainer({children:()=>{
+        Column().width(120).height(120)
+      }})
+    }
+    .width("100%")
+    .height("100%")
+    .clip(false)
+    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
+  }
+
+  /**
+   * 顶部状态栏
+   */
+  @Builder
+  TopBar() {
+    Column() {
+      Row() {
+        Stack() {
+          Image($r("app.media.user")).fillColor(Color.White)
+        }
+        .width(36)
+        .height(36)
+        .borderRadius("50%")
+        .backgroundColor("#FFD700")
+        .padding(8)
+
+        Column() {
+          Text("设置").fontSize(16).fontColor(Color.White).fontWeight(FontWeight.Medium)
+          Text("个人中心").fontSize(12).fontColor(Color.White).opacity(0.8)
+        }.layoutWeight(1).margin({ left: 10, right: 10 }).alignItems(HorizontalAlign.Start)
+      }
+      .width("100%")
+      .padding({
+        left: 16,
+        top: 15,
+        right: 16,
+        bottom: 15
+      })
+    }
+    .width("100%")
+    .linearGradient({ angle: 90, colors: [['#FF8C00', 0.0], ['#FFA500', 1.0]] })
+    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
   }
 }

+ 30 - 26
entry/src/main/ets/utils/HttpClient.ets

@@ -5,16 +5,18 @@ import { Rsp } from '../api/rsp/Rsp'
 // 传输参数token
 export const TOKEN_KEY: string = 'token'
 
-//请求网络的基底址
-export const BASE_URL: string = 'http://120.27.232.27:9190'
+// 请求网络的基址
+// 外网IP "http://120.27.232.27:48080"
+// 本地IP "http://192.168.0.10:48080"
+export const BASE_URL: string = 'http://120.27.232.27:48080'
 
 interface EmptyInterface {}
 
 
 //Next版本不支持在箭头函数上写纯泛型,
 // function requestHttp(url: url地址, method: 请求方法类型,默认为get, data?: 参数类型) : 返回类型是: Promise里面的T类型的数据
-async function requestHttp<T extends Rsp>(url: string = '', method: http.RequestMethod = http.RequestMethod.GET,
-  data?: object): Promise<T> {
+async function requestHttp<T>(url: string = '', method: http.RequestMethod = http.RequestMethod.GET,
+  data?: object): Promise<Rsp<T>> {
   // 创建一个网络请求
   const httpRequest = http.createHttp()
   // 拼接地址
@@ -31,53 +33,55 @@ async function requestHttp<T extends Rsp>(url: string = '', method: http.Request
       }).join('&') //['a=1','b=2','c=3']
     }
   }
-  //设置请求对象
+  // 设置请求对象
   let config: http.HttpRequestOptions = {
-    //method同名方法赋值,参数名和属性名相同时只需要写一个method等价于method:method
+    // method同名方法赋值,参数名和属性名相同时只需要写一个method等价于method:method
     method,
-    //超时时间
+    // 超时时间
     readTimeout: 10000,
-    //get的extraData参数在上面处理过了 在这儿不需要再传一遍
+    // get的extraData参数在上面处理过了 在这儿不需要再传一遍
     extraData: method === http.RequestMethod.GET ? '' : data || {} as EmptyInterface,
-    //响应参数的类型,指定为对象后有BUG,当结果有问题时,项目会直接瘫痪
+    // 响应参数的类型,指定为对象后有BUG,当结果有问题时,项目会直接瘫痪
     // expectDataType: http.HttpDataType.OBJECT,
-    //请求头
+    // 请求头
     header: {
       'Content-Type': 'application/json',
-      "Authorization": AppStorage.get(TOKEN_KEY) as string || ''
+      "Authorization": AppStorage.get(TOKEN_KEY) as string || '',
+      "tenant-id": "1" // 租户id
     }
   }
-  //发请求
+  // 发请求
   try {
     const res = await httpRequest.request(reqUrl, config)
     console.log(method, '--->', reqUrl, JSON.stringify(config.extraData))
     console.log(method, '<---', reqUrl, res.responseCode, res.result)
-    //res.responseCode响应状态码,这里的401还会认为是请求成功
+    // res.responseCode响应状态码,这里的401还会认为是请求成功
     if (res.responseCode === 401) {
       // 401 token超时
       // 删除持久化数据token
       AppStorage.set<string>(TOKEN_KEY, '')
-      promptAction.openToast({ message: 'token timeout' })
+      promptAction.openToast({ message: 'token timeout' }).catch()
       // 回登录
       // router.replaceUrl({ url: 'pages/Login/LoginPage' })
       // 返回错误 终止
       return Promise.reject(new Error('token timeout'))
     } else if (res.responseCode === 404) {
-      promptAction.openToast({ message: 'not find' })
+      promptAction.openToast({ message: 'not find' }).catch()
       return Promise.reject(new Error('not find'))
     } else {
       // 指定为字符串,然后再转成一个对象,类型是不明确的要使用泛型,返回第一层+泛型,泛型的定义是一个类和之前的有所差距
-      const result = JSON.parse(res.result as string) as T
-      // 再判断返回的状态码进行处理,不是200都是失败
-      if (result.code === 200) {
-        return result as T
+      const apiRsp = JSON.parse(res.result as string) as Rsp<T>
+      // 再判断返回的状态码进行处理,不是0,200都是失败
+      if ([0, 200].includes(apiRsp.code)) {
+        return apiRsp as Rsp<T>
       } else {
-        promptAction.openToast({ message: result.msg })
-        return Promise.reject(new Error(result.msg))
+        promptAction.openToast({ message: apiRsp.msg }).catch()
+        return Promise.reject(new Error(apiRsp.msg))
       }
     }
   } catch (error) {
-    promptAction.openToast({ message: error })
+    console.error(method, '--->', reqUrl, JSON.stringify(error))
+    promptAction.openToast({ message: error }).catch()
     return Promise.reject(error)
   } finally {
     // 销毁请求请求结束
@@ -95,7 +99,7 @@ export class Request {
    * @param data  携带数据
    * @returns
    */
-  static get<T extends Rsp>(url: string, data?: object): Promise<T> {
+  static get<T>(url: string, data?: object): Promise<Rsp<T>> {
     return requestHttp<T>(url, http.RequestMethod.GET, data)
   }
 
@@ -105,7 +109,7 @@ export class Request {
    * @param data  携带数据
    * @returns
    */
-  static post<T extends Rsp>(url: string, data?: object): Promise<T> {
+  static post<T>(url: string, data?: object): Promise<Rsp<T>> {
     return requestHttp<T>(url, http.RequestMethod.POST, data)
   }
 
@@ -115,7 +119,7 @@ export class Request {
    * @param data  携带数据
    * @returns
    */
-  static put<T extends Rsp>(url: string, data?: object): Promise<T> {
+  static put<T>(url: string, data?: object): Promise<Rsp<T>> {
     return requestHttp<T>(url, http.RequestMethod.PUT, data)
   }
 
@@ -125,7 +129,7 @@ export class Request {
    * @param data  携带数据
    * @returns
    */
-  static delete<T extends Rsp>(url: string, data?: object): Promise<T> {
+  static delete<T>(url: string, data?: object): Promise<Rsp<T>> {
     return requestHttp<T>(url, http.RequestMethod.DELETE, data)
   }
 }

+ 24 - 0
entry/src/main/ets/vm/VMHome.ets

@@ -1,6 +1,28 @@
+import { Storage } from "../utils/Storage"
+
 @Observed
 export class VMHome {
+  // 底部导航栏选择的位置
   tabIndex: number = 0
+  // 顶部用户名
+  username: string = ""
+  // 是否刷新中
+  isRefreshing: boolean = false
+
+  /**
+   * 初始化首页数据
+   */
+  init() {
+    // 更新用户名
+    this.username = Storage.getUsername()
+  }
+
+  onRefresh() {
+    this.isRefreshing = true
+    setTimeout(() => {
+      this.isRefreshing = false
+    }, 3000)
+  }
 
   /**
    * 更新当前选中状态
@@ -9,4 +31,6 @@ export class VMHome {
   updateTabIndex(index: number) {
     this.tabIndex = index
   }
+
+
 }

+ 2 - 2
entry/src/main/ets/vm/VMLogin.ets

@@ -33,8 +33,8 @@ export class VMLogin {
     Loading.showLoading({ text: '登录中...' })
     ReqApi.login(this.account.trim(), this.code).then((rsp) => {
       Storage.setLogin(true)
-      Storage.setToken(rsp.token)
-      Storage.setUsername(rsp.nickName)
+      Storage.setToken(rsp.data?.accessToken ?? "")
+      Storage.setUsername(rsp.data?.nickname ?? "")
       Loading.hideLoading()
       promptAction.openToast({ message: '登录成功' }).catch()
       skip()

+ 0 - 24
entry/src/main/ets/vm/VMTabHome.ets

@@ -1,24 +0,0 @@
-import { Storage } from '../utils/Storage'
-
-@Observed
-export class VMTabHome {
-  // 顶部用户名
-  username: string = ""
-  // 是否刷新中
-  isRefreshing: boolean = false
-
-  /**
-   * 初始化首页数据
-   */
-  init() {
-    // 更新用户名
-    this.username = Storage.getUsername()
-  }
-
-  onRefresh() {
-    this.isRefreshing = true
-    setTimeout(() => {
-      this.isRefreshing = false
-    }, 3000)
-  }
-}