拋棄床的溫暖,只為了它丨云庫(kù)一款跑在鴻蒙系統(tǒng)上的應(yīng)用
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
前文再續(xù),章節(jié)上篇。
在篇一,對(duì)整個(gè)項(xiàng)目要做什么,達(dá)到什么樣的效果等做了簡(jiǎn)單的分析。本節(jié)將從服務(wù)端API約定、登錄(沒(méi)有注冊(cè),登錄即注冊(cè))流程、長(zhǎng)連接、華為云對(duì)象存儲(chǔ)OBS基本概念介紹等對(duì)整個(gè)項(xiàng)目的技術(shù)層面做詳細(xì)的介紹。
本節(jié)內(nèi)容摘要:
1、約定服務(wù)端API返回結(jié)構(gòu)
2、登錄流程
3、華為云對(duì)象存儲(chǔ)OBS介紹
4、HAP輸入手機(jī)號(hào)獲取驗(yàn)證碼
約定服務(wù)端API返回結(jié)構(gòu)
封裝一個(gè)好的返回結(jié)構(gòu),使得我們?cè)谔幚頂?shù)據(jù)的時(shí)候能夠減少各種拆解。因此在初期搭建完服務(wù)端項(xiàng)目后,首要做的是封裝一套合理的返回?cái)?shù)據(jù)結(jié)構(gòu),使API返回結(jié)構(gòu)體大體相似。
1)使用Java Enum枚舉類,將公用的返回錯(cuò)誤進(jìn)行封裝,比如請(qǐng)求接口成功,請(qǐng)求接口失敗,登錄驗(yàn)證成功等等。
- package com.ming.harmonyos.photokit.conf;
- /**
- * 枚舉類對(duì)象
- */
- public enum StatusCode {
- //公共
- SUCCESS(200, "成功"),
- FAILED(9999, "失敗"),
- UNKNOWN_ERROR(9998, "未知異常"),
- SYSTEM_ERROR(9997, "系統(tǒng)異常"),
- REQUEST_PARAMETER_ERROR(1001, "請(qǐng)求參數(shù)錯(cuò)誤"),
- REQUEST_ACCESS_TOKEN_ERROR(1002, "請(qǐng)求參數(shù)token值錯(cuò)誤"),
- //手機(jī)號(hào)校驗(yàn)
- CHECK_CELL_PHONE_NUM_ERROR(2001, "手機(jī)號(hào)碼輸入錯(cuò)誤"),
- LOGIN_VALID_CODE_ERROR(2002, "登錄驗(yàn)證碼錯(cuò)誤"),
- LOGOUT_ERROR(2003, "退出失敗"),
- LOGOUT_AUTH_ERROR(2004, "退出失敗,token不存在");
- /**
- * 狀態(tài)碼
- */
- private int code;
- /**
- * 狀態(tài)消息
- */
- 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返回的數(shù)據(jù)結(jié)構(gòu)
我目前使用的有兩種,一種是以true|false做請(qǐng)求狀態(tài),另一種是以數(shù)字的形式做請(qǐng)求狀態(tài)。兩種各有千秋,第一種相對(duì)第二種的話要做到具體的異常定位需要在返回消息中加入異常碼。本項(xiàng)目只是簡(jiǎn)單的示例項(xiàng)目,因此我選擇第二種,這種方便控制。
- package com.ming.harmonyos.photokit.conf;
- import lombok.Data;
- import java.io.Serializable;
- /**
- * 返回結(jié)果類統(tǒng)一封裝
- */
- @Data
- public class ApiResultInfo<T> implements Serializable {
- /**
- * 狀態(tài)碼
- */
- private Integer code;
- /**
- * 消息
- */
- private String message;
- /**
- * 數(shù)據(jù)對(duì)象
- */
- 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)示例接口
這里只是一個(gè)登錄(同時(shí)也是注冊(cè))接口,其他接口暫時(shí)未公開(kāi)。
接口信息
- 接口地址:http://xxx/yunku/login.do
- 請(qǐng)求示例:http://xxx/yunku/login.do
- 支持協(xié)議:HTTP/HTTPS
- 請(qǐng)求方式:POST
- 返回格式:UTF8 JSON
請(qǐng)求參數(shù)
返回示例
- {
- "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"
- }
- }
- }
返回參數(shù)
登錄流程
登錄即注冊(cè),用戶第一次登錄,驗(yàn)證通過(guò)后將用戶信息以key-value的形式存入到Redis緩存中。如果是再次登錄則存入新值,用戶緩存有效期7天。

華為云對(duì)象存儲(chǔ)OBS介紹
對(duì)象存儲(chǔ)服務(wù)(Object Storage Service,OBS)提供海量、安全、高可靠、低成本的數(shù)據(jù)存儲(chǔ)能力,可供用戶存儲(chǔ)任意類型和大小的數(shù)據(jù)。適合企業(yè)備份/歸檔、視頻點(diǎn)播、視頻監(jiān)控等多種數(shù)據(jù)存儲(chǔ)場(chǎng)景。我們這里只是用于存儲(chǔ)多媒體文件。
對(duì)于現(xiàn)階段,我們只需要了解OBS的桶、對(duì)象兩個(gè)概念。桶是存儲(chǔ)對(duì)象的容器,對(duì)象是數(shù)據(jù)存儲(chǔ)的基本單位。可以對(duì)應(yīng)我們系統(tǒng)的文件管理來(lái)看,桶相當(dāng)于磁盤(pán),比如D盤(pán),在D盤(pán)根目錄下只能存在一個(gè)同類型的文件,而對(duì)象就相當(dāng)于文件夾中的文件。
而云庫(kù)中,用于可以通過(guò)HAP創(chuàng)建多個(gè)云庫(kù)(桶),在云庫(kù)中上傳多媒體文件。
HAP輸入手機(jī)號(hào)獲取驗(yàn)證碼
這也是云庫(kù)HAP的主頁(yè)面,啟動(dòng)云庫(kù)HAP后,進(jìn)入應(yīng)用首先看到的界面。對(duì)于登錄頁(yè)面,大體都是一樣的,錄入框和交互按鈕是頁(yè)面主要呈現(xiàn)的組件,額外會(huì)添加一些Image和Text組件,這里我們僅使用下表中羅列的組件來(lái)構(gòu)建頁(yè)面。
- <?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="歡迎走近云庫(kù)"
- 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="請(qǐng)輸入手機(jī)號(hào)..."
- 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="獲取驗(yàn)證碼"
- 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 判斷是否輸入的是正確的手機(jī)號(hào), 排除輸入漢字、標(biāo)點(diǎn)符號(hào)、英文字母等不是數(shù)字情況
- 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 執(zhí)行獲取驗(yàn)證碼接口,返回?cái)?shù)據(jù)成功后跳轉(zhuǎn)到驗(yàn)證碼輸入頁(yè)面
- }
- });
由于后端程序還未部署到服務(wù)器上,這里接口調(diào)用暫時(shí)還未編寫(xiě)。后續(xù)整個(gè)項(xiàng)目公開(kāi)后,可以查看具體源碼,敬請(qǐng)期待!!!
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz