拋棄床的溫暖,只為了它丨云庫一款跑在鴻蒙系統上的應用
https://harmonyos.51cto.com/#zz
前文再續,章節上篇。
在篇一,對整個項目要做什么,達到什么樣的效果等做了簡單的分析。本節將從服務端API約定、登錄(沒有注冊,登錄即注冊)流程、長連接、華為云對象存儲OBS基本概念介紹等對整個項目的技術層面做詳細的介紹。
本節內容摘要:
1、約定服務端API返回結構
2、登錄流程
3、華為云對象存儲OBS介紹
4、HAP輸入手機號獲取驗證碼
約定服務端API返回結構
封裝一個好的返回結構,使得我們在處理數據的時候能夠減少各種拆解。因此在初期搭建完服務端項目后,首要做的是封裝一套合理的返回數據結構,使API返回結構體大體相似。
1)使用Java Enum枚舉類,將公用的返回錯誤進行封裝,比如請求接口成功,請求接口失敗,登錄驗證成功等等。
- package com.ming.harmonyos.photokit.conf;
- /**
- * 枚舉類對象
- */
- public enum StatusCode {
- //公共
- SUCCESS(200, "成功"),
- FAILED(9999, "失敗"),
- UNKNOWN_ERROR(9998, "未知異常"),
- SYSTEM_ERROR(9997, "系統異常"),
- REQUEST_PARAMETER_ERROR(1001, "請求參數錯誤"),
- REQUEST_ACCESS_TOKEN_ERROR(1002, "請求參數token值錯誤"),
- //手機號校驗
- CHECK_CELL_PHONE_NUM_ERROR(2001, "手機號碼輸入錯誤"),
- LOGIN_VALID_CODE_ERROR(2002, "登錄驗證碼錯誤"),
- LOGOUT_ERROR(2003, "退出失敗"),
- LOGOUT_AUTH_ERROR(2004, "退出失敗,token不存在");
- /**
- * 狀態碼
- */
- private int code;
- /**
- * 狀態消息
- */
- private String message;
- StatusCode(int code, String message) {
- this.code = code;
- this.message = message;
- }
- public int getCode() {
- return code;
- }
- public String getMessage() {
- return message;
- }
- }
2)、封裝一套API返回的數據結構
我目前使用的有兩種,一種是以true|false做請求狀態,另一種是以數字的形式做請求狀態。兩種各有千秋,第一種相對第二種的話要做到具體的異常定位需要在返回消息中加入異常碼。本項目只是簡單的示例項目,因此我選擇第二種,這種方便控制。
- package com.ming.harmonyos.photokit.conf;
- import lombok.Data;
- import java.io.Serializable;
- /**
- * 返回結果類統一封裝
- */
- @Data
- public class ApiResultInfo<T> implements Serializable {
- /**
- * 狀態碼
- */
- private Integer code;
- /**
- * 消息
- */
- private String message;
- /**
- * 數據對象
- */
- private T data;
- public ApiResultInfo() {
- }
- public ApiResultInfo(Integer code, String message, T data) {
- this();
- setCode(code);
- setMessage(message);
- setData(data);
- }
- public static <T> ApiResultInfo<T> getFailedInstant(Integer code, String message, T data) {
- return new ApiResultInfo<>(code, message, data);
- }
- public static <T> ApiResultInfo<T> getInstant(T data) {
- return new ApiResultInfo<>(StatusCode.SUCCESS.getCode(),
- StatusCode.SUCCESS.getMessage(), data);
- }
- }
3)示例接口
這里只是一個登錄(同時也是注冊)接口,其他接口暫時未公開。
接口信息
- 接口地址:http://xxx/yunku/login.do
- 請求示例:http://xxx/yunku/login.do
- 支持協議:HTTP/HTTPS
- 請求方式:POST
- 返回格式:UTF8 JSON
請求參數
返回示例
- {
- "code": 200,
- "msg": "success",
- "data": {
- "authCode": "xxxxxx",
- "userInfo": {
- "iId": 1,
- "sPhone": "13800000000",
- "sNickName": "yx_13800000000",
- "sPath": "http://xxxx/yx_default.png",
- "dVolume": 20,
- "dUsedVolume": 5,
- "tEdit": "2021-01-20"
- }
- }
- }
返回參數
登錄流程
登錄即注冊,用戶第一次登錄,驗證通過后將用戶信息以key-value的形式存入到Redis緩存中。如果是再次登錄則存入新值,用戶緩存有效期7天。

華為云對象存儲OBS介紹
對象存儲服務(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的數據存儲能力,可供用戶存儲任意類型和大小的數據。適合企業備份/歸檔、視頻點播、視頻監控等多種數據存儲場景。我們這里只是用于存儲多媒體文件。
對于現階段,我們只需要了解OBS的桶、對象兩個概念。桶是存儲對象的容器,對象是數據存儲的基本單位。可以對應我們系統的文件管理來看,桶相當于磁盤,比如D盤,在D盤根目錄下只能存在一個同類型的文件,而對象就相當于文件夾中的文件。
而云庫中,用于可以通過HAP創建多個云庫(桶),在云庫中上傳多媒體文件。
HAP輸入手機號獲取驗證碼
這也是云庫HAP的主頁面,啟動云庫HAP后,進入應用首先看到的界面。對于登錄頁面,大體都是一樣的,錄入框和交互按鈕是頁面主要呈現的組件,額外會添加一些Image和Text組件,這里我們僅使用下表中羅列的組件來構建頁面。
- <?xml version="1.0" encoding="utf-8"?>
- <DependentLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:background_element="#FFFFFF">
- <Image
- ohos:id="$+id:logo"
- ohos:height="100vp"
- ohos:width="100vp"
- ohos:image_src="$media:logo"
- ohos:horizontal_center="true"/>
- <Text
- ohos:id="$+id:hello"
- ohos:height="match_content"
- ohos:width="match_content"
- ohos:text="歡迎走近云庫"
- ohos:top_margin="40vp"
- ohos:left_margin="20vp"
- ohos:right_margin="20vp"
- ohos:text_size="30fp"
- ohos:below="$+id:logo"/>
- <TextField
- ohos:id="$+id:phoneNum"
- ohos:height="match_content"
- ohos:width="match_parent"
- ohos:hint="請輸入手機號..."
- ohos:text_size="20fp"
- ohos:text_alignment="vertical_center"
- ohos:top_margin="10vp"
- ohos:left_margin="20vp"
- ohos:right_margin="20vp"
- ohos:top_padding="16vp"
- ohos:bottom_padding="16vp"
- ohos:basement="#E1E1D2"
- ohos:text_input_type="pattern_number"
- ohos:below="$+id:hello"/>
- <Button
- ohos:id="$+id:get_valid_code_btn"
- ohos:height="match_content"
- ohos:width="match_parent"
- ohos:text="獲取驗證碼"
- ohos:text_size="20fp"
- ohos:bottom_margin="20vp"
- ohos:left_margin="20vp"
- ohos:right_margin="20vp"
- ohos:top_padding="12vp"
- ohos:bottom_padding="12vp"
- ohos:align_parent_bottom="true"
- ohos:text_color="#F2F2F2"
- ohos:background_element="$graphic:background_disabled"/>
- </DependentLayout>
- Button button = (Button) findComponentById(ResourceTable.Id_get_valid_code_btn);
- TextField inputPhoneNum = (TextField) findComponentById(ResourceTable.Id_phoneNum);
- inputPhoneNum.setTextInputType(InputAttribute.PATTERN_NUMBER);
- inputPhoneNum.addTextObserver(new Text.TextObserver() {
- @Override
- public void onTextUpdated(String s, int i, int i1, int i2) {
- if (s.length() == 11) {
- //TODO 判斷是否輸入的是正確的手機號, 排除輸入漢字、標點符號、英文字母等不是數字情況
- ShapeElement shapeElement = new ShapeElement(getContext(), ResourceTable.Graphic_background_login);
- button.setBackground(shapeElement);
- button.setClickable(true);
- } else {
- ShapeElement shapeElement = new ShapeElement(getContext(), ResourceTable.Graphic_background_disabled);
- button.setBackground(shapeElement);
- button.setClickable(false);
- }
- }
- });
- button.setClickedListener(l -> {
- if (l.isClickable()) {
- //TODO 執行獲取驗證碼接口,返回數據成功后跳轉到驗證碼輸入頁面
- }
- });
由于后端程序還未部署到服務器上,這里接口調用暫時還未編寫。后續整個項目公開后,可以查看具體源碼,敬請期待!!!
https://harmonyos.51cto.com/#zz