精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲

人工智能 新聞
此項(xiàng)目是用最新版DevEco Studio 3.1 Release并創(chuàng)建端云一體開發(fā),由于目前此版本不支持直接調(diào)用云數(shù)據(jù)庫,不過可以通過云函數(shù)調(diào)用云數(shù)據(jù)庫,也就是在服務(wù)卡片業(yè)務(wù)邏輯里通過調(diào)用云函數(shù)來完成游戲數(shù)據(jù)保存到云數(shù)據(jù)庫。

1.前言

翻牌游戲萬能卡片,隨機(jī)生成16張共包含8張完全不同的圖像,游戲的目標(biāo)是在有限30秒時(shí)間內(nèi),將16張卡片中包含相同的圖像的卡片兩兩配對(duì)。匹配的規(guī)則是連續(xù)點(diǎn)擊兩張卡片,若卡背面的圖像相同,則匹配成功,若不同則配對(duì)失敗。游戲主要考察玩家的記憶力,因?yàn)橛螒蜻€規(guī)定翻開的卡片數(shù)量至多有兩張,否則一開始被點(diǎn)擊而翻開的卡片將再次蓋上(若該張卡片沒有匹配成功)。此項(xiàng)目是用最新版DevEco Studio 3.1 Release并創(chuàng)建端云一體開發(fā),由于目前此版本不支持直接調(diào)用云數(shù)據(jù)庫,不過可以通過云函數(shù)調(diào)用云數(shù)據(jù)庫,也就是在服務(wù)卡片業(yè)務(wù)邏輯里通過調(diào)用云函數(shù)來完成游戲數(shù)據(jù)保存到云數(shù)據(jù)庫,開發(fā)工具支持本地函數(shù)調(diào)用測(cè)試,大大方便了開發(fā),此貼重點(diǎn)講解云函數(shù)和云數(shù)據(jù)庫開發(fā),從而進(jìn)一步學(xué)習(xí)Serverless知識(shí),翻牌游戲萬能卡片效果圖如下:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_元服務(wù)鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_元服務(wù)

2.知識(shí)點(diǎn)

為豐富HarmonyOS對(duì)云端開發(fā)的支持、實(shí)現(xiàn)HarmonyOS生態(tài)端云聯(lián)動(dòng),DevEco Studio推出了云開發(fā)功能,開發(fā)者在創(chuàng)建工程時(shí)選擇云開發(fā)模板,即可在DevEco Studio內(nèi)同時(shí)完成HarmonyOS應(yīng)用/服務(wù)的端側(cè)與云側(cè)開發(fā),體驗(yàn)端云一體化協(xié)同開發(fā)。

相比于傳統(tǒng)開發(fā)模式,云開發(fā)模式具備成本低、效率高、門檻低等優(yōu)勢(shì),具體區(qū)別見下表。

2.1. 開發(fā)流程

HarmonyOS應(yīng)用端云一體化開發(fā)流程如下圖所示。

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_02鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_02

2.2. 創(chuàng)建端云一體化開發(fā)工程

2.2.1  新建原子化服務(wù)工程

2.2.2  工程初始化配置

2.2.3  端云一體化開發(fā)工程介紹

2.3. 開發(fā)云工程

2.3.1  開發(fā)云函數(shù)

2.3.2  開發(fā)云數(shù)據(jù)庫

2.4. 部署云工程

2.4.1  部署云工程

2.5. 小結(jié)

了解這些端云一體化開發(fā)知識(shí)點(diǎn)后,下面圍繞翻牌游戲萬能卡片,在云數(shù)據(jù)庫里設(shè)計(jì)卡片表結(jié)構(gòu)和游戲記錄表結(jié)構(gòu),然后再編寫相關(guān)云函數(shù),在元服務(wù)業(yè)務(wù)邏輯調(diào)用云函數(shù)。

3.云數(shù)據(jù)庫開發(fā)講解

3.1. objecttype創(chuàng)建

3.1.1 展開CloudProgram -> clouddb -> objecttype 右擊objecttype目錄,創(chuàng)建 -> Cloud DB Object Type 輸入Object Type Name為t_form,點(diǎn)擊確認(rèn),代碼內(nèi)容如下:

{
  "fields": [
    {
      "isNeedEncrypt": false,
      "fieldName": "formId",
      "notNull": true,
      "belongPrimaryKey": true,
      "fieldType": "String"
    },
    {
      "isNeedEncrypt": false,
      "fieldName": "formName",
      "notNull": true,
      "defaultValue": "",
      "belongPrimaryKey": false,
      "fieldType": "String"
    },
    {
      "isNeedEncrypt": false,
      "fieldName": "dimension",
      "notNull": true,
      "defaultValue": "0",
      "belongPrimaryKey": false,
      "fieldType": "Integer"
    }
  ],
  "indexes": [
    {
      "indexName": "formId",
      "indexList": [{ "fieldName": "formId", "sortType": "ASC" }]
    }
  ],
  "objectTypeName": "t_form",
  "permissions": [...]
}

3.1.2 展開CloudProgram -> clouddb -> objecttype 右擊objecttype目錄,創(chuàng)建 -> Cloud DB Object Type 輸入Object Type Name為t_record,點(diǎn)擊確認(rèn),代碼內(nèi)容如下:

{
  "fields": [
    {
      "isNeedEncrypt": false,
      "fieldName": "formId",
      "notNull": true,
      "belongPrimaryKey": true,
      "fieldType": "String"
    },
    {
      "isNeedEncrypt": false,
      "fieldName": "matrixNum",
      "notNull": true,
      "defaultValue": "",
      "belongPrimaryKey": false,
      "fieldType": "String"
    },
    {
      "isNeedEncrypt": false,
      "fieldName": "bestScore",
      "notNull": true,
      "defaultValue": "0",
      "belongPrimaryKey": false,
      "fieldType": "Double"
    }
  ],
  "indexes": [
    {
      "indexName": "formId",
      "indexList": [{ "fieldName": "formId", "sortType": "ASC" }]
    }
  ],
  "objectTypeName": "t_record",
  "permissions": [...]
}

3.2. dataentry創(chuàng)建

3.2.1 展開CloudProgram -> clouddb -> dataentry 右擊dataentry目錄,創(chuàng)建 -> Cloud DB Data Entry 這里先選擇上面創(chuàng)建的Object Type為t_form,再輸入Data Entry Name為form_data,點(diǎn)擊確認(rèn),代碼內(nèi)容如下:

{
  "cloudDBZoneName": "widgetCard",
  "objectTypeName": "t_form",
  "objects": [
    {
      "formId": "x000001",
      "formName": "卡片1",
      "dimension": 2
    }
  ]
}

3.2.2 展開CloudProgram -> clouddb -> dataentry 右擊dataentry目錄,創(chuàng)建 -> Cloud DB Data Entry 這里先選擇上面創(chuàng)建的Object Type為t_record,再輸入Data Entry Name為record_data,點(diǎn)擊確認(rèn),修改內(nèi)容如下:

{
  "cloudDBZoneName": "widgetCard",
  "objectTypeName": "t_record",
  "objects": [
    {
      "formId": "x000001",
      "matrixNum": "4x4",
      "bestScore": 2.234
    }
  ]
}

3.3. 小結(jié)

其實(shí)dataentry文件可以不創(chuàng)建,這里對(duì)兩個(gè)表都初始化了一條數(shù)據(jù),是方便下面的調(diào)用使用,云數(shù)據(jù)庫就是定義好表結(jié)構(gòu)、權(quán)限配置就可以,數(shù)據(jù)的添加、修改、刪除、查詢都可以通過云函數(shù)來完成。

4.云函數(shù)開發(fā)講解

4.1. 卡片云函數(shù)創(chuàng)建

4.1.1 展開CloudProgram -> cloudfunctions 右擊cloudfunctions目錄,創(chuàng)建 -> Cloud Function 輸入Cloud Function Name為form,點(diǎn)擊確認(rèn), 卡片云函數(shù)里包含了增刪改查操作,所以在form下,創(chuàng)建不同的文件夾來區(qū)分,目錄結(jié)構(gòu)如下:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_03鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_03

4.1.2 首先說一下與云數(shù)據(jù)庫交互文件,t_form.js對(duì)應(yīng)的是云數(shù)據(jù)庫實(shí)體類,如各屬性的get和set方法,之前FA模式下的DevEco Studio端云一體化開發(fā),支持直接調(diào)用云數(shù)據(jù)庫,現(xiàn)在Stage模式下的DevEco Studio端云一體化開發(fā),還不支持直接調(diào)用云數(shù)據(jù)庫,通過云函數(shù)來調(diào)用,所以這里的云數(shù)據(jù)庫實(shí)體類,可以通過AGC導(dǎo)出,然后復(fù)制到t_form文件內(nèi),導(dǎo)出步驟圖:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_04鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_04

如卡片實(shí)例體類:

class t_form {
    getFieldTypeMap() {
        let fieldTypeMap = new Map();
        fieldTypeMap.set('formId', 'String');
        fieldTypeMap.set('formName', 'String');
        fieldTypeMap.set('dimension', 'Integer');
        return fieldTypeMap;
    }
    
    getClassName() {
        return 't_form';
    }

    getPrimaryKeyList() {
        let primaryKeyList = [];
        primaryKeyList.push('formId');
        return primaryKeyList;
    }

    getIndexList() {
        let indexList = [];
        return indexList;
    }

    getEncryptedFieldList() {
        let encryptedFieldList = [];
        return encryptedFieldList;
    }

	// set and get
    setFormId(formId) {this.formId = formId;}
    getFormId() {return this.formId;}
    setFormName(formName) {this.formName = formName;}
    getFormName() {return this.formName;}
    setDimension(dimension) {this.dimension = dimension;}
    getDimension() {return this.dimension;}
}

module.exports = {t_form}

4.1.3 CloudDBZoneWrapper操作云數(shù)據(jù)庫,這里主要列舉構(gòu)造函數(shù)和增加方法內(nèi)容:

import * as clouddb from '@agconnect/database-server';
import { t_form as FormBean } from './models/t_form';
import * as agconnect from '@agconnect/common-server';

const ZONE_NAME = "widgetCard";

export class CloudDBZoneWrapper {
  logger;
  cloudDbZone;

  constructor(credential, logger) {
    this.logger = logger;
    try {
      // 初始化AGCClient
      let agcClient;
      try {
        agcClient = agconnect.AGCClient.getInstance();
      } catch {
        agconnect.AGCClient.initialize(credential);
        agcClient = agconnect.AGCClient.getInstance();
      }
      // 初始化AGConnectCloudDB實(shí)例
      let cloudDbInstance;
      try {
        cloudDbInstance = clouddb.AGConnectCloudDB.getInstance(agcClient);
      } catch {
        clouddb.AGConnectCloudDB.initialize(agcClient);
        cloudDbInstance = clouddb.AGConnectCloudDB.getInstance(agcClient);
      }
      // 創(chuàng)建CloudDBZoneConfig配置對(duì)象,并設(shè)置云側(cè)CloudDB zone名稱,打開Cloud DB zone實(shí)例
      const cloudDBZoneConfig = new clouddb.CloudDBZoneConfig(ZONE_NAME);
      this.cloudDbZone = cloudDbInstance.openCloudDBZone(cloudDBZoneConfig);
    } catch (err) {
      logger.error("xx [form-func]CloudDBZoneWrapper init CloudDBZoneWrapper error: " + err);
    }
  }

  async insert(addForm) {
    if (!this.cloudDbZone) {
      this.logger.error("xx  [form-func]CloudDBZoneWrapper->insert CloudDBClient is null, try re-initialize it");
    }

    try {
      let res = await this.cloudDbZone.executeUpsert(addForm);
      this.logger.info("xx  [form-func]CloudDBZoneWrapper->insert Insert " + res + " records success");
    } catch (error) {
      this.logger.error("xx  [form-func]CloudDBZoneWrapper->insert executeInsert addressRecords failed " + error);
    }
  }
}

4.1.4 新增卡片函數(shù)form-insert,關(guān)鍵代碼如下:

import { CloudDBZoneWrapper } from '../clouddb/CloudDBZoneWrapper.js';
import * as Utils from '../utils/Utils.js';

export const myHandler = async function (event, context, callback, logger) {
  const credential = Utils.getCredential(context, logger);
  try {
    const cloudDBZoneWrapper = new CloudDBZoneWrapper(credential, logger);
    let formObj = cloudDBZoneWrapper.getForm(event);
    await cloudDBZoneWrapper.insert(formObj);

    callback({
      ret: { code: 0, desc: "SUCCESS" },
    });
  } catch (err) {
    logger.error("xx [form-func]insert func error:" + err.message + " stack:" + err.stack);
    callback({
      ret: { code: -1, desc: "ERROR" },
    });
  }
};

4.1.5 卡片云函數(shù)主入口,關(guān)鍵代碼如下:

let myHandler = async function (event, context, callback, logger) {
  let operation;
  let params;

  logger.info("xx enter form func with operation " + event.operation);
  operation = event.body ? JSON.parse(event.body).operation : event.operation;
  params = event.body ? JSON.parse(event.body).params : event.params;

  switch (operation) {
    case "query":
      query.myHandler(params, context, callback, logger);
      break;
    case "queryById":
      queryById.myHandler(params, context, callback, logger);
      break;
    case "insert":
      insert.myHandler(params, context, callback, logger);
      break;
    case "update":
      update.myHandler(params, context, callback, logger);
      break;
    case "delete":
      deleteByObj.myHandler(params, context, callback, logger);
      break;
    default:
      callback({
        ret: { code: -1, desc: "no such function" },
      });
  }

};
module.exports.myHandler = myHandler;

4.2. 記錄云函數(shù)創(chuàng)建

4.2.1 展開CloudProgram -> cloudfunctions 右擊cloudfunctions目錄,創(chuàng)建 -> Cloud Function 輸入Cloud Function Name為record,點(diǎn)擊確認(rèn), 成績?cè)坪瘮?shù)里包含了增刪改查操作,所以在record下,創(chuàng)建不同的文件夾來區(qū)分,目錄結(jié)構(gòu)如下:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_05鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_05

4.2.2 記錄表云數(shù)據(jù)庫操作與卡片操作一樣,這里就不在重復(fù)了,可以參考一下上面卡片操作方法就可以。

5.元服務(wù)開發(fā)

5.1. 1*2卡片開發(fā)

5.1.1 創(chuàng)建卡片步驟:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_端云一體化開發(fā)_06鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_端云一體化開發(fā)_06

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_端云一體化開發(fā)_07鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_端云一體化開發(fā)_07

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_08鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_08

5.1.2 卡片模板創(chuàng)建好后,修改為翻牌游戲UI, 就是左邊顯示一張獎(jiǎng)牌圖片,右邊顯示最快記錄時(shí)間,圖片效果為:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_09鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_游戲卡片_09

UI代碼如下:

build() {
    Row() {
      Image($r('app.media.cup'))
        .width(32).height(32).objectFit(ImageFit.Cover)
      Text(`最快成績:${this.totalBestScore}'s`)
        .fontSize($r('app.float.font_size'))
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.SpaceEvenly)
    .onClick(() => {
      postCardAction(this, {
        "action": 'router',
        "abilityName": 'EntryAbility',
        "params": {
          "message": 'view history'
        }
      });
    })
  }

5.2. 4*4卡片開發(fā)

5.2.1 創(chuàng)建卡片步驟如上面步驟。

5.2.2 卡片模板創(chuàng)建好后,修改為翻牌游戲UI, 就是頂部顯示游戲信息,如:游戲標(biāo)題,當(dāng)前用時(shí),倒計(jì)時(shí),開始游戲,中部顯示16張卡片,圖片效果為:

鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_10鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲_Serverless_10

UI部分代碼如下:

build() {
    Column() {
      Row() {
        Text('記憶翻牌游戲')
        // Text(`最快:${this.totalBestScore}'s`)
        //   .fontSize(10)
        Text(`當(dāng)前:${this.tookTime}'s`)
          .fontSize(10)
        Text(`倒計(jì)時(shí):${this.timeCount}'s`)
          .fontSize(10)
        Text('開始')
          .visibility(this.isStart ? Visibility.Visible : Visibility.Hidden)
          .onClick(() => {
            this.startGame()
          })
      }
      .width(FULL_WIDTH_PERCENT)
      .justifyContent(FlexAlign.SpaceBetween)
      .height(30)

      Stack(){
        Flex({wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceEvenly}) {
          ForEach(this.arr, (idx) => {
            GameCard({card: this.cards[idx], cardArray: $cards, startTime: this.startTime})
          }, (idx) => idx.toString())
        }

        Text(this.resultMessage)
          .width(FULL_WIDTH_PERCENT)
          .height(FULL_HEIGHT_PERCENT)
          .textAlign(TextAlign.Center)
          .fontColor(Color.White)
          .backgroundColor('rgba(0,0,0,0.5)')
          .visibility(this.isStart ? Visibility.Visible : Visibility.None)
      }
      .width(FULL_WIDTH_PERCENT)
      .layoutWeight(1)
    }
    .width(FULL_WIDTH_PERCENT)
    .height(FULL_HEIGHT_PERCENT)
    .padding(10)
  }

6.代碼講解

6.1. 云函數(shù)調(diào)用公共類

export class DatabaseUtils {

  async callWithParams(context, trigger, operation, params) {
    await getAGConnect(context);
    let body = {
      "operation": operation,
      "params": params
    }

    try {
      let functionCallable = agconnect.function().wrap(trigger);
      let functionResult = await functionCallable.call(body);
      return functionResult.getValue();
    }
    catch (err) {
      return {
        "ret": {"code": -1, "desc": "ERROR"}
      }
    }
  }
    
  async invoke(context: any, trigger?: string, operation?: string, params?: object) {
    console.info(CommonConstants.DATABASE_TAG, 'xx invoke params: '+JSON.stringify(params))
    return await this.callWithParams(context, trigger, operation, params);
  }

  /**
   * 插入卡片數(shù)據(jù)。
   *
   * @param{Form}Form表單實(shí)體。
   * @param{DataRdb.RdbStore}RDB存儲(chǔ)RDB數(shù)據(jù)庫。
   * @return返回操作信息。
   */
  async insertForm(context: any, form: Form) {
    let res = await this.invoke(context, Triggers.FormFunc, RequestType.Insert, form);
    console.info(CommonConstants.DATABASE_TAG, 'xx insertForm result: ' + JSON.stringify(res));
  }
  ......
}

6.2. 卡片Ability調(diào)用公共類

EntryFormAbility.ets卡片生命周期代碼如下:

onAddForm(want) {
    // 獲取卡片ID:ohos.extra.param.key.form_identity
    let formId: string = want.parameters[CommonConstants.FORM_PARAM_IDENTITY_KEY] as string;
    // 獲取卡片名稱:ohos.extra.param.key.form_name
    let formName: string = want.parameters[CommonConstants.FORM_PARAM_NAME_KEY] as string;
    // 獲取卡片規(guī)格:ohos.extra.param.key.form_dimension
    let dimensionFlag: number = want.parameters[CommonConstants.FORM_PARAM_DIMENSION_KEY] as number;

    // 卡片信息
    let form: Form = new Form();
    form.formId = formId;
    form.formName = formName;
    form.dimension = dimensionFlag;

    // 保存卡片信息到數(shù)據(jù)庫
    DatabaseUtils.insertForm(this.context, form);
    // 獲取最優(yōu)成績
    getScoreById(this.context, dimensionFlag, formId);

    // 每五分鐘刷新一次
    formProvider.setFormNextRefreshTime(formId, CommonConstants.FORM_NEXT_REFRESH_TIME, (error, data) => {
      if (error) {
        console.error(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片失敗:' + JSON.stringify(error))
      } else {
        console.info(CommonConstants.ENTRY_FORM_ABILITY_TAG, 'xx onAddForm 更新卡片成功')
      }
    });

    // 返回初始化卡片數(shù)據(jù)
    let formData: FormData = new FormData();
    formData.formId = formId;
    formData.bestScore = 0;
    formData.matrixNum = '1x1';
    formData.totalBestScore = 0;
    return formBindingData.createFormBindingData(formData);
  }

6.3. 主界面調(diào)用公共類

@Entry
@Component
struct Index {
  @State scoreDataList: Array<FormData> = []

  aboutToAppear() {
    // 請(qǐng)求通知欄權(quán)限
    this.requestNotification();
    // 更新卡片信息
    DatabaseUtils.updateForms(getContext(this));
    // 獲取成績歷史記錄
    this.getScoreListData()
  }
  onPageShow() {
    // 更新卡片信息
    DatabaseUtils.updateForms(getContext(this));
    // 獲取成績歷史記錄
    this.getScoreListData()
  }
    // 獲取成績歷史數(shù)據(jù)
  getScoreListData() {
    DatabaseUtils.getScoreListData(getContext(this))
      .then((res) => {
        this.scoreDataList = res;
        // 發(fā)送通知
        NotificationUtils.sendNotifications(this.scoreDataList[0].totalBestScore);
      }).catch((error) => {
      console.error(CommonConstants.MAIN_PAGE_TAG, 'xx aboutToAppear or onPageShow getScoreListData error ' + JSON.stringify(error));
    });
  }

  build() {...}
}

7.總結(jié)

通過翻牌小游戲元服務(wù)使用Serverless云函數(shù)、云數(shù)據(jù)庫,學(xué)習(xí)到不少知識(shí),開始時(shí)不懂得怎么使用云函數(shù)調(diào)用云數(shù)據(jù)庫,一邊參考官方商城模板,一邊測(cè)試,到使用到這個(gè)小游戲上, 總結(jié)這個(gè)項(xiàng)目用到以下知識(shí)點(diǎn):

  • 使用Notification發(fā)布通知。
  • 使用端云一體化開發(fā)、開發(fā)云函數(shù)、開發(fā)云數(shù)據(jù)庫。
  • 使用FormExtensionAbility創(chuàng)建、更新、刪除元服務(wù)卡片。

各位也可以點(diǎn)擊元服務(wù)官網(wǎng),了解更多相關(guān)信息。

元服務(wù)官網(wǎng)鏈接: https://developer.huawei.com/consumer/cn/harmonyos/fa?ha_source=yuanfuwuGW&ha_sourceld=89000452


?著作權(quán)歸作者所有:來自51CTO博客作者狼哥Army的原創(chuàng)作品,請(qǐng)聯(lián)系作者獲取轉(zhuǎn)載授權(quán),否則將追究法律責(zé)任 鴻蒙萬能卡片開發(fā)詳解-記憶翻牌游戲 https://blog.51cto.com/u_15008042/6972493

責(zé)任編輯:張燕妮 來源: 51CTO博客
相關(guān)推薦

2023-05-31 15:42:06

游戲開發(fā)關(guān)系型數(shù)據(jù)庫

2023-06-14 15:10:36

鴻蒙游戲開發(fā)

2016-11-24 12:07:42

Android萬能圓角ImageView

2023-03-22 09:00:38

2023-08-07 12:53:05

開發(fā)服務(wù)

2023-08-11 14:00:42

鴻蒙元服務(wù)

2009-02-27 13:48:00

Mdaemon郵件服務(wù)器

2022-06-23 18:10:15

多云

2020-06-16 08:32:00

人工智能技術(shù)機(jī)器學(xué)習(xí)

2022-11-21 09:57:18

網(wǎng)關(guān)系統(tǒng)

2021-07-29 06:09:05

萬能指針C語言void

2009-12-03 18:13:36

PHP萬能密碼

2022-06-27 08:36:08

PythonLambda

2021-08-17 14:25:11

人臉識(shí)別人工智能身份識(shí)別

2022-11-30 13:13:41

節(jié)能減碳PUE

2011-06-16 15:57:25

Android

2021-11-11 10:41:25

代碼開發(fā)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩毛片视频| 亚洲免费福利| 99久久精品国产导航| 日韩av三级在线观看| 欧美88888| 超碰成人免费| 在线观看日韩av先锋影音电影院| 永久免费在线看片视频| 少妇喷水在线观看| 蜜桃久久久久久久| 久久久久久久久国产精品| 国产熟妇久久777777| 国产亚洲观看| 色天天综合色天天久久| 丰满人妻一区二区三区53号| 亚洲区小说区图片区| 国产一区免费电影| 日本久久久久久| 久久国产精品波多野结衣| 精品国产一区二区三区香蕉沈先生| 日韩丝袜情趣美女图片| 亚洲人成色77777| 欧美1—12sexvideos| 中文字幕av一区 二区| 国产精品亚洲综合| 国产免费不卡视频| 免费亚洲电影在线| 1769国产精品| 久久久91视频| 99热国内精品| 亚洲视频在线观看视频| 无码国产69精品久久久久网站| 国产一区二区三区四区五区3d | www.黄色com| 亚洲美女久久| 亚洲精品国产免费| 成人做爰www看视频软件| 亚洲综合资源| 欧美精品久久天天躁| 999在线免费视频| 无码小电影在线观看网站免费| 亚洲已满18点击进入久久| 天堂精品视频| 国产一级在线| 久久久综合激的五月天| 国产高清在线一区二区| 国产成人精品免费看视频| 久久99精品国产91久久来源| 国产精品99久久久久久白浆小说 | 亚洲av无码成人精品国产| 国产主播性色av福利精品一区| 欧美一区二区国产| 亚洲成人av免费观看| 99视频这里有精品| 欧美老年两性高潮| 婷婷激情综合五月天| 亚洲日本中文| 欧美一级片免费看| 亚洲午夜精品在线观看| 日韩中文字幕在线一区| 日韩午夜三级在线| 日本不卡视频一区| 欧美精品密入口播放| 日韩精品久久久久久福利| 欧美熟妇精品黑人巨大一二三区| 九九热播视频在线精品6| 亚洲爱爱爱爱爱| 国产精品探花一区二区在线观看| 日韩有码中文字幕在线| 亚洲人成电影网站色www| 中文字幕免费高清| 91亚洲国产高清| 久久综合免费视频影院| 精品午夜福利视频| 亚洲影视综合| 成人黄色短视频在线观看| 精品国产伦一区二区三区| 国产iv一区二区三区| 国内精品久久国产| 丁香婷婷在线| 一区二区三区自拍| 免费成人在线视频网站| 欧美日韩精品免费观看视欧美高清免费大片| 在线一区二区三区四区五区| 无尽裸体动漫2d在线观看| 欧美日韩午夜电影网| 亚洲精品一区二区三区99| 国产精久久一区二区三区| 欧美大黑bbbbbbbbb在线| 欧美国产日韩在线| 黄色一级视频免费看| 久草精品在线观看| 国产亚洲欧美一区二区| av在线免费一区| 亚洲综合另类小说| 亚洲国产精品毛片av不卡在线| 狠狠久久综合| 亚洲精品黄网在线观看| 国产一二三av| 日韩视频中文| 亚洲一区中文字幕在线观看| 无码精品人妻一区二区三区影院| 国产欧美一区视频| 成人免费在线网| 粉嫩91精品久久久久久久99蜜桃| 精品久久久影院| 天天干天天操天天拍| 激情欧美丁香| 亚洲va电影大全| 噜噜噜噜噜在线视频| 亚洲综合一区在线| 天天干天天综合| 日韩福利视频一区| 欧美高清自拍一区| 亚洲最大成人av| 久久久久久免费网| 日韩成人手机在线| 亚洲成a人片777777久久| 亚洲剧情一区二区| 日产精品久久久久| 国产精品91xxx| 亚洲一区二区高清视频| 不卡av播放| 亚洲国产精品美女| 妺妺窝人体色www婷婷| 极品少妇一区二区三区精品视频 | 色欲av永久无码精品无码蜜桃| 亚洲四区在线观看| 高潮一区二区三区| 国产亚洲一区| 欧美在线视频一区| 午夜影院免费体验区| 一区二区在线观看免费| 宇都宫紫苑在线播放| 日韩午夜电影网| 国产精品欧美一区二区三区奶水| 欧美色图另类| 欧美日韩在线影院| 精品夜夜澡人妻无码av| 99精品福利视频| 国产欧美日韩一区| sqte在线播放| 亚洲国产日韩欧美在线动漫| 国产无码精品视频| 成人免费看黄yyy456| 一本久道高清无码视频| 国产精品白丝av嫩草影院| 欧美精品18videos性欧| 丰满人妻妇伦又伦精品国产| 亚洲一区二区在线免费观看视频| 国内精品国产三级国产aⅴ久| 91精品推荐| 亚洲japanese制服美女| a级片国产精品自在拍在线播放| 欧美日韩国产精品成人| 99re6热在线精品视频| 免费日本视频一区| 中文字幕日韩精品一区二区| 在线视频成人| 欧美乱妇高清无乱码| 亚洲精品字幕在线| 五月天亚洲精品| 成人免费无码大片a毛片| 久久成人精品| 视频一区二区三区在线观看| 成人免费av电影| 日韩视频第一页| 国产91视频在线| 午夜精品久久久久久久蜜桃app| 免费成人深夜夜行p站| 久久夜色精品| 黄频视频在线观看| www国产精品| 欧美与黑人午夜性猛交久久久| 免费成人av电影| 欧美日韩国产另类一区| 久久久久久久久久久久国产| 成a人片亚洲日本久久| 青青草原成人网| 水蜜桃精品av一区二区| 不卡一卡2卡3卡4卡精品在| sm久久捆绑调教精品一区| 亚洲人成网站在线播| 国产又粗又猛视频免费| 亚洲永久精品大片| 日本高清www| 激情综合色播激情啊| 国产曰肥老太婆无遮挡| 国产一区国产二区国产三区| 91精品在线观| 国产精品高颜值在线观看| 亚洲小视频在线| www.国产三级| 在线观看不卡视频| 黄色一级片在线| 国产精品午夜春色av| 在线播放国产视频| 日韩av一区二区三区四区| 日韩视频一二三| 久久av影视| 成人三级在线| 久久精品嫩草影院| 国产69精品久久久久久| 国产黄色在线观看| 一区二区欧美日韩视频| 丰满肉肉bbwwbbww| 欧美日韩国产天堂| 在线观看日韩中文字幕| 亚洲日穴在线视频| 国产成人免费观看网站| 成人午夜激情在线| 手机精品视频在线| 日本麻豆一区二区三区视频| 欧日韩免费视频| 午夜精品视频一区二区三区在线看| 蜜桃传媒一区二区| 国产成人夜色高潮福利影视| 国产日韩精品电影| 三级成人黄色影院| 91国产精品91| 日本三级韩国三级欧美三级| 最新中文字幕亚洲| 欧美伦理影视网| 日韩国产欧美区| 亚洲精品无amm毛片| 91精品国产综合久久精品| 中文字幕第31页| 色综合中文字幕| 日韩精品手机在线| 亚洲国产wwwccc36天堂| 日本一级二级视频| 亚洲天天做日日做天天谢日日欢| aa一级黄色片| 99久久精品国产导航| 亚洲欧美日韩色| 国产69精品久久久久777| 亚洲高清在线不卡| 国内精品写真在线观看| 国产成年人视频网站| 美女视频一区二区三区| 天天爽天天爽夜夜爽| 久久婷婷av| 欧美激情成人网| 久久精品毛片| 久久久久免费精品| 奇米888四色在线精品| 中文字幕第36页| 日本中文字幕一区| 亚洲77777| 精品一区二区三区在线观看国产 | 日日狠狠久久| 成人av.网址在线网站| 99久久这里有精品| 亚洲专区在线视频| 99久久人爽人人添人人澡 | 亚洲最新视频在线播放| 久草免费在线观看视频| 亚洲夂夂婷婷色拍ww47| 91在线看视频| 欧美性猛交xxxx免费看| 国产午夜麻豆影院在线观看| 色悠悠久久综合| 中文精品久久久久人妻不卡| 欧美视频精品在线| 91福利免费视频| 日韩欧美在线影院| 无码国产精品一区二区免费16| 精品无人区太爽高潮在线播放 | 欧美丰满少妇xxxxx做受| 欧美hdxxxx| 1769国产精品| 精品176极品一区| 91九色在线观看| www.豆豆成人网.com| 欧美精品一区三区在线观看| 精品国产乱码久久久久久蜜坠欲下| 一本久道久久综合| 一区视频在线| 成年人免费大片| 国产在线视视频有精品| 91传媒理伦片在线观看| 久久精品这里都是精品| 一级免费黄色录像| 亚洲一区二区三区四区五区黄 | 久久99精品久久久水蜜桃| 欧美久久精品一级c片| 国产一二三四区在线观看| 亚洲三级视频| 日韩大片一区二区| 国产成人亚洲综合a∨婷婷图片| 疯狂揉花蒂控制高潮h| 国产精品毛片高清在线完整版| 久久精品国产亚洲av香蕉 | 97在线免费视频| 久久久国产精品网站| 国产精品初高中精品久久| 精品中文一区| 成人性做爰片免费视频| 一区二区黄色| 无码国产精品一区二区高潮| 久久综合九色综合97婷婷女人| 手机av在线看| 一本大道av伊人久久综合| 国产黄色小视频在线观看| 亚洲欧美www| heyzo一区| 91久久精品国产91性色| 九九视频免费观看视频精品| 久久av高潮av| 久色婷婷小香蕉久久| 亚洲中文字幕无码av| 亚洲欧美激情一区二区| 男操女视频网站| 亚洲国产成人久久综合一区| 黄色在线免费网站| 国产精品盗摄久久久| 日韩精品免费一区二区三区竹菊| 欧美一级特黄aaaaaa在线看片| 日韩高清不卡一区二区| 日韩aaaaa| 亚洲午夜羞羞片| 精品国产伦一区二区三| 爱福利视频一区| 亚洲天堂1区| 日本精品一区| 国产精品综合| 2一3sex性hd| 亚洲综合999| 性生活视频软件| 久久国产视频网站| 精品国产一区二| 干日本少妇视频| 黄页网站大全一区二区| 国产在线免费看| 欧美日韩电影一区| 91女主播在线观看| 国产精品一区二区三区毛片淫片| 国产精品一区二区av日韩在线| 日本久久久精品视频| 91伊人久久大香线蕉| 国产性xxxx高清| 亚洲美女激情视频| 综合在线影院| 亚洲高清123| 久久国产精品色| 国语对白在线播放| 日韩精品一区二区三区视频播放 | 福利视频在线导航| 国产精品免费久久久久久| 波多野结衣在线播放一区| 成年人网站大全| 国产精品青草久久| 国产又粗又猛又爽又黄视频| 欧美疯狂性受xxxxx另类| 国偷自产视频一区二区久| 国产中文字幕免费观看| 国产丝袜美腿一区二区三区| 一级黄色短视频| 欧美xxxx综合视频| 精品三级av在线导航| 成人av一级片| 中文字幕免费不卡| av中文字幕免费在线观看| 国模私拍视频一区| 亚洲动漫精品| 国产成人久久婷婷精品流白浆| 国产成人精品免费看| 最新av电影网站| 日韩一级精品视频在线观看| av在线网页| 欧美一级爱爱| 国产在线精品一区二区| 波多野结衣家庭教师| 亚洲国产精品久久久| 中文在线资源| 亚洲 欧洲 日韩| 国产不卡视频在线播放| 九九视频免费看| 亚洲黄色免费三级| sm在线播放| 亚洲一区二区高清视频| 国产传媒欧美日韩成人| 青青青国产在线| 日韩一级黄色av| 亚洲裸色大胆大尺寸艺术写真| 中文字幕一区二区三区四区在线视频| 亚洲视频每日更新| 可以免费看毛片的网站| 国产精品视频免费观看www| 天天做天天爱天天综合网2021| av网页在线观看| 欧美性猛交xxxx乱大交退制版| 先锋成人av| 久久资源亚洲| 国产成人在线观看免费网站| www亚洲视频| 中文字幕亚洲国产| 欧美日日夜夜| 8x8x最新地址| 午夜精品视频在线观看|