精品欧美一区二区三区在线观看 _久久久久国色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)

精品久久久久中文慕人妻 | 我不卡伦不卡影院| 午夜视频在线观看一区| 久久精品二区| 亚洲 欧美 中文字幕| 久久久久高潮毛片免费全部播放| 午夜电影网一区| 久久久综合亚洲91久久98| 国产高清中文字幕| 国产精品片aa在线观看| 欧美日韩一级片在线观看| 欧美日韩综合精品| 一级特黄特色的免费大片视频| 一区二区中文| 亚洲国产天堂久久综合| 亚洲自偷自拍熟女另类| av影片免费在线观看| 国产乱人伦偷精品视频免下载 | 亚洲欧美日韩一区| 国产一区二区三区色淫影院| 欧美日韩一级黄色片| 日韩在线第七页| 精品捆绑美女sm三区 | 亚洲人成人无码网www国产| 天天综合网站| 亚洲资源中文字幕| 日本一区二区三不卡| a天堂视频在线| 亚洲精品色图| 中文字幕亚洲专区| 国产国语老龄妇女a片| 国产精品高清乱码在线观看| 一区二区三区在线视频免费观看| 欧美日韩国产一二| 国产黄色片av| 99成人免费视频| 亚洲全黄一级网站| 免费人成视频在线播放| 国精产品一区一区三区四川| 亚洲卡通动漫在线| 欧美日本国产精品| 欧美77777| 久久99国产精品免费| 欧美中文在线观看| 亚洲精品久久久久久国| 中国av一区| 欧美精品一区二区三区四区| 一级黄色片国产| 精品裸体bbb| 岛国av一区二区三区| 日本久久高清视频| av福利精品| 久久午夜老司机| 亚洲最大福利视频网| 波多野结衣电车痴汉| 亚洲欧洲日本mm| 久久久久久这里只有精品| 欧美人妻精品一区二区三区| 综合天天久久| 久操成人在线视频| 欧美极品aaaaabbbbb| 你懂的成人av| 欧美另类交人妖| 麻豆changesxxx国产| 欧美精品二区| 97精品国产91久久久久久| 国产一区二区三区影院| 亚洲毛片av| 欧美一区二区三区免费观看 | 伦xxxx在线| 国产欧美一区二区精品秋霞影院| 色噜噜狠狠一区二区三区| av在线中文| 亚洲色欲色欲www| 免费看日本黄色| 僵尸再翻生在线观看| 欧美午夜美女看片| 簧片在线免费看| 在线视频成人| 亚洲精品一区二区三区在线观看 | 国产精品萝li| 亚洲第一页在线视频| 青青在线视频| 欧美日韩在线影院| 亚洲最大成人在线观看| xxxxwww一片| 666av成人影院在线观看| 在线免费观看日本一区| 国产九九在线视频| 久久一级大片| 亚洲精品美女视频| 国产三级短视频| 欧美日韩精品免费观看视频完整| 91黄色8090| 中文字幕一区二区久久人妻| 国产精品2024| 久久人人九九| 国产日产一区二区| 婷婷丁香久久五月婷婷| 一道本视频在线观看| 日韩激情综合| 亚洲无亚洲人成网站77777| 四虎884aa成人精品| 在线视频精品| 成人在线视频网站| 四虎影视在线播放| 亚洲视频资源在线| 国产1区2区在线| 欧美激情精品| 国产亚洲成av人片在线观看桃| 日韩va亚洲va欧美va清高| 99人久久精品视频最新地址| 国产日韩精品电影| 日韩电影免费| 一区二区高清在线| 天天干天天干天天干天天干天天干| 1204国产成人精品视频| 最新国产精品亚洲| 你懂的国产在线| 国产成人一区二区精品非洲| 国产精品videossex久久发布| 亚洲精品久久久久| 国产美女高潮视频| 三级一区在线视频先锋| 国产福利久久| 国产在线高清理伦片a| 色综合久久99| 妖精视频一区二区| 夜间精品视频| 国产美女被下药99| 黄色av网站在线免费观看| 五月天久久比比资源色| 国产吃瓜黑料一区二区| 天天色综合色| 国产精品午夜视频| a视频网址在线观看| 欧美日韩一区二区免费在线观看| 白丝校花扒腿让我c| 影音先锋日韩在线| 91视频88av| 在线观看免费黄视频| 色8久久精品久久久久久蜜| 亚洲精品乱码久久久久久久| 黄色成人精品网站| 不卡视频一区二区三区| 在线你懂的视频| 在线播放一区二区三区| 欧美成人久久久免费播放| 久久久久99| 欧美日韩亚洲一区二区三区四区| 欧美男男激情videos| 精品sm在线观看| 波多野结衣不卡视频| 国产一区二区不卡在线| 中文字幕久久一区| 精品视频成人| 欧美精品一区三区| 亚洲国产日韩在线观看| 一区二区成人在线| www.四虎精品| 99精品国产在热久久| 久久亚洲免费| 国产精品字幕| 日韩有码视频在线| 97在线视频人妻无码| 亚洲天堂福利av| 成人三级做爰av| 亚洲国产精品一区制服丝袜| 麻豆传媒一区| 成人mm视频在线观看| 精品国产美女在线| 午夜精品久久久久久久99热黄桃 | 视频一区三区| 精品福利在线| 欧美另类极品videosbest最新版本 | 国产a级片视频| 亚洲黄页一区| 日韩免费电影一区二区三区| 婷婷精品久久久久久久久久不卡| 久久久久www| 日本黄色大片视频| 欧美性色黄大片手机版| frxxee中国xxx麻豆hd| 国产69精品一区二区亚洲孕妇| 女人天堂av手机在线| 日韩av在线播放网址| 亚洲自拍欧美色图| 午夜影院在线观看国产主播| 色婷婷综合久久久久| 亚洲精品视频专区| 91国产视频在线观看| 91日韩中文字幕| 2021中文字幕一区亚洲| 欧美特黄aaa| 亚洲电影成人| 亚洲免费不卡| 国产成人aa在线观看网站站| 国产精品video| 国产乱码在线| 最新国产精品拍自在线播放 | 日韩成人免费av| 久久久久在线观看| 久久99精品久久| 日韩经典第一页| 国产绳艺sm调教室论坛| 色噜噜狠狠色综合欧洲selulu| 国产精品三区在线观看| 久久久久久久久久久黄色 | 中文字幕在线观看欧美| 亚洲国产精品影院| 欧美a级片免费看| 久久先锋影音av| 日本人添下边视频免费| 免费观看久久久4p| 国产熟女高潮视频| 国内精品99| www.黄色网址.com| 日韩精品一区二区三区免费观影 | 欧美一区二区黄片| 欧美日韩亚洲综合在线| 日韩综合在线观看| 午夜精品福利视频网站| 免费一级全黄少妇性色生活片| 国产精品网站在线| 国产人妻一区二区| 99视频一区二区| 色婷婷狠狠18禁久久| 精品制服美女丁香| 久草福利视频在线| 男女精品视频| 日本少妇高潮喷水视频| 黄色精品网站| 成人黄色片免费| 香蕉视频国产精品| 一级特黄录像免费播放全99| 国产一区二区三区日韩精品| 久久久久久艹| 欧美黄色影院| 精品乱码一区| 精品人人人人| 国产欧美日韩一区二区三区| 深夜福利一区二区三区| 91在线观看免费网站| 亚洲ww精品| 国产欧美精品久久久| jizz亚洲女人高潮大叫| 国产精品久久久久久久久久久不卡 | 26uuu日韩精品一区二区| 欧美1—12sexvideos| 欧美黄色片视频| 青草影视电视剧免费播放在线观看| 欧美美最猛性xxxxxx| 天堂av资源在线观看| 欧美激情一区二区久久久| 青春草在线免费视频| 久久久久久久久久久91| 华人av在线| 26uuu另类亚洲欧美日本一| 午夜日韩成人影院| 国产精品久久久久久亚洲调教| www.一区| 亚洲一区二区自拍| 51亚洲精品| 精品视频一区二区| 免费观看久久av| 婷婷精品国产一区二区三区日韩| 日韩激情在线| 51xx午夜影福利| 99视频精品| 欧美性猛交久久久乱大交小说| 久久字幕精品一区| 青青青国产在线视频| 美腿丝袜亚洲色图| 色黄视频免费看| 成人的网站免费观看| 国产色视频一区二区三区qq号| 中文字幕精品—区二区四季| 91麻豆精品成人一区二区| 一区二区三区不卡视频 | 午夜综合激情| 亚洲国产精品三区| 国产精品综合在线视频| 美国黄色一级视频| 久久精品亚洲精品国产欧美| 成年人网站在线观看视频| 一区二区三区国产精品| 中文字字幕在线中文| 欧美私人免费视频| 精品人妻一区二区三区蜜桃| 日韩精品在线电影| 成年人黄视频在线观看| **欧美日韩vr在线| 日韩城人网站| 久久久久久九九九九| 久久人体视频| 日韩在线一级片| 国精产品一区一区三区mba视频 | 无码人妻精品一区二区三区在线| 日本不卡的三区四区五区| 欧美性猛交乱大交| 国产日韩欧美电影| 久久久久无码国产精品| 欧美制服丝袜第一页| 色窝窝无码一区二区三区| 在线电影av不卡网址| 爱看av在线| 91精品中文在线| 怕怕欧美视频免费大全| 亚洲熟妇无码av在线播放| 麻豆精品新av中文字幕| 亚洲黄色免费在线观看| 亚洲精品国产高清久久伦理二区| 无码人妻丰满熟妇区五十路 | 黄色大片在线免费观看| 欧美极品少妇xxxxⅹ免费视频| 成人午夜在线| 欧美日韩国产三区| 99精品久久久| 欧美一级片在线免费观看| 国产精品久久影院| 自拍偷拍18p| 日韩精品丝袜在线| 欧美xxxx免费虐| 成人亚洲欧美一区二区三区| 国产一区二区精品久| 777久久久精品一区二区三区| 国产成人99久久亚洲综合精品| 日韩欧美视频免费观看| 色婷婷国产精品久久包臀| 国产91绿帽单男绿奴| 欧美成人h版在线观看| 免费成人黄色网| 亚洲成人午夜在线| 久久久久久9| 色噜噜日韩精品欧美一区二区| 午夜精品久久久久久久| 午夜精品久久久久久久96蜜桃| 欧美成人久久久| 久久伊人精品| 特级西西444| 国产成人av自拍| 久久久久久蜜桃| 亚洲成人1234| bbw在线视频| 国产自产精品| 亚洲一区免费| 性久久久久久久久久| 欧美午夜影院在线视频| 天堂a中文在线| 青青在线视频一区二区三区| 在线观看欧美理论a影院| 欧美视频第三页| 国产欧美精品一区二区三区四区 | 大地资源高清在线视频观看| 欧美酷刑日本凌虐凌虐| 国产三级在线播放| 91免费版网站在线观看| 欧美日韩一区二区国产| 无码任你躁久久久久久老妇| 亚洲va国产va欧美va观看| 亚洲AV成人无码一二三区在线| 欧美有码在线观看| 精品福利久久久| 天天干天天操天天玩| 18欧美亚洲精品| 免费av网站在线播放| 欧美中文在线免费| 久久国产亚洲精品| 北条麻妃亚洲一区| 亚洲动漫第一页| 国产精品一二三区视频| 国产日韩视频在线观看| 综合久久一区| 国产乱了高清露脸对白| 欧美在线你懂得| 在线网址91| 久久99精品久久久久久秒播放器 | 永久看看免费大片| 亚洲成a人在线观看| 蜜芽tv福利在线视频| 成人国产精品久久久| 国模 一区 二区 三区| x88av在线| 日韩一级黄色大片| 自拍偷拍亚洲视频| 亚洲一区3d动漫同人无遮挡 | 一本色道久久综合亚洲精品高清| 男生裸体视频网站| 精品视频在线视频| 青草影视电视剧免费播放在线观看| 美女主播视频一区| 极品美女销魂一区二区三区 | 欧美少妇性性性| 青草在线视频| 四虎影院一区二区三区 | 精品成人无码一区二区三区| 日韩欧美你懂的| 欧美一区久久久| 免费看欧美黑人毛片| 国产精品网站在线观看|