色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

還在自己實(shí)現(xiàn)責(zé)任鏈?我建議你造輪子之前先看看這個(gè)開源項(xiàng)目

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-20 14:38 ? 次閱讀

1. 前言

設(shè)計(jì)模式在軟件開發(fā)中被廣泛使用。通過使用設(shè)計(jì)模式,開發(fā)人員可以更加高效地開發(fā)出高質(zhì)量的軟件系統(tǒng),提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。

責(zé)任鏈模式是一種常用的行為型設(shè)計(jì)模式,它將請(qǐng)求沿著處理鏈進(jìn)行發(fā)送,直到其中一個(gè)處理者對(duì)請(qǐng)求進(jìn)行處理為止。在責(zé)任鏈模式中,通常會(huì)有多個(gè)處理者,每個(gè)處理者都有一個(gè)處理請(qǐng)求的方法。當(dāng)一個(gè)請(qǐng)求到達(dá)處理鏈的起點(diǎn)時(shí),會(huì)依次傳遞給每個(gè)處理者進(jìn)行處理,直到某個(gè)處理者能夠處理該請(qǐng)求。這樣可以保證每個(gè)請(qǐng)求都能被處理,并且可以根據(jù)實(shí)際情況動(dòng)態(tài)地添加或刪除處理者,以滿足不同的需求。

責(zé)任鏈模式可以幫助降低系統(tǒng)的耦合度,增加系統(tǒng)的靈活性和可擴(kuò)展性,其在SpringMVC、Netty等許多框架中均有實(shí)現(xiàn)。責(zé)任鏈模式常用于以下場(chǎng)景:處理復(fù)雜的請(qǐng)求邏輯,例如權(quán)限驗(yàn)證、日志記錄等;避免請(qǐng)求發(fā)送者和接收者之間的耦合關(guān)系;動(dòng)態(tài)地組織處理流程,以適應(yīng)不同的請(qǐng)求類型和復(fù)雜度。

我們?cè)谌粘i_發(fā)中如果要使用責(zé)任鏈模式,通常需要自己來實(shí)現(xiàn),但自己臨時(shí)實(shí)現(xiàn)的責(zé)任鏈既不通用,也很容易產(chǎn)生框架與業(yè)務(wù)代碼耦合不清等問題,增加Code Review 的成本。

Netty的代碼向來以優(yōu)雅著稱,早年我在閱讀Netty的源碼時(shí),萌生出將其責(zé)任鏈的實(shí)現(xiàn)應(yīng)用到業(yè)務(wù)開發(fā)中的想法,之后花了點(diǎn)時(shí)間將Netty中責(zé)任鏈的實(shí)現(xiàn)代碼抽取出來,形成了本項(xiàng)目,也就是pie。pie的核心代碼均來自Netty,絕大部分的 API 與 Netty 是一致的。

pie 是一個(gè)可快速上手的責(zé)任鏈框架,開發(fā)者只需要專注業(yè)務(wù),開發(fā)相應(yīng)的業(yè)務(wù)Handler,即可完成業(yè)務(wù)的責(zé)任鏈落地。

一分鐘學(xué)會(huì)、三分鐘上手、五分鐘應(yīng)用,歡迎 star。

pie 源碼地址:https://github.com/feiniaojin/pie.git

pie 案例工程源碼地址:https://github.com/feiniaojin/pie-example.git

2. 快速入門

2.1 引入 maven 依賴

pie 目前已打包發(fā)布到 maven 中央倉庫,開發(fā)者可以直接通過 maven 坐標(biāo)將其引入到項(xiàng)目中。


    com.feiniaojin.ddd.ecosystem
    pie
    1.0

目前最新的版本是 1.0

2.2 實(shí)現(xiàn)出參工廠

出參也就是執(zhí)行結(jié)果,一般的執(zhí)行過程都要求有執(zhí)行結(jié)果返回。實(shí)現(xiàn) OutboundFactory 接口,用于產(chǎn)生接口默認(rèn)返回值。

例如:

public class OutFactoryImpl implements OutboundFactory {
    @Override
    public Object newInstance() {
        Result result = new Result();
        result.setCode(0);
        result.setMsg("ok");
        return result;
    }
}

2.3 實(shí)現(xiàn) handler 接口完成業(yè)務(wù)邏輯

在 pie 案例工程( https://github.com/feiniaojin/pie-example.git )的 Example1 中,為了展示 pie 的使用方法,實(shí)現(xiàn)了一個(gè)虛擬的業(yè)務(wù)邏輯:CMS類項(xiàng)目修改文章標(biāo)題、正文,大家不要關(guān)注修改操作放到兩個(gè) handler 中是否合理,僅作為講解案例。

三個(gè) Handler 功能如下:

CheckParameterHandler:用于參數(shù)校驗(yàn)。

ArticleModifyTitleHandler:用于修改文章的標(biāo)題。

ArticleModifyContentHandler:用于修改文章的正文。

CheckParameterHandler 的代碼如下:

public class CheckParameterHandler implements ChannelHandler {

    private Logger logger = LoggerFactory.getLogger(CheckParameterHandler.class);

    @Override
    public void channelProcess(ChannelHandlerContext ctx,
                               Object in,
                               Object out) throws Exception {

        logger.info("參數(shù)校驗(yàn):開始執(zhí)行");

        if (in instanceof ArticleTitleModifyCmd) {
            ArticleTitleModifyCmd cmd = (ArticleTitleModifyCmd) in;
            String articleId = cmd.getArticleId();
            Objects.requireNonNull(articleId, "articleId不能為空");
            String title = cmd.getTitle();
            Objects.requireNonNull(title, "title不能為空");
            String content = cmd.getContent();
            Objects.requireNonNull(content, "content不能為空");
        }
        logger.info("參數(shù)校驗(yàn):校驗(yàn)通過,即將進(jìn)入下一個(gè)Handler");
        ctx.fireChannelProcess(in, out);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {
        logger.error("參數(shù)校驗(yàn):異常處理邏輯", cause);
        Result re = (Result) out;
        re.setCode(400);
        re.setMsg("參數(shù)異常");
    }
}

ArticleModifyTitleHandler 的代碼如下:

public class ArticleModifyTitleHandler implements ChannelHandler {

    private Logger logger = LoggerFactory.getLogger(ArticleModifyTitleHandler.class);

    @Override
    public void channelProcess(ChannelHandlerContext ctx,
                               Object in,
                               Object out) throws Exception {

        logger.info("修改標(biāo)題:進(jìn)入修改標(biāo)題的Handler");

        ArticleTitleModifyCmd cmd = (ArticleTitleModifyCmd) in;

        String title = cmd.getTitle();
        //修改標(biāo)題的業(yè)務(wù)邏輯
        logger.info("修改標(biāo)題:title={}", title);

        logger.info("修改標(biāo)題:執(zhí)行完成,即將進(jìn)入下一個(gè)Handler");
        ctx.fireChannelProcess(in, out);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {
        logger.error("修改標(biāo)題:異常處理邏輯");
        Result re = (Result) out;
        re.setCode(1501);
        re.setMsg("修改標(biāo)題發(fā)生異常");
    }
}

ArticleModifyContentHandler 的代碼如下:

public class ArticleModifyContentHandler implements ChannelHandler {

    private Logger logger = LoggerFactory.getLogger(ArticleModifyContentHandler.class);

    @Override
    public void channelProcess(ChannelHandlerContext ctx,
                               Object in,
                               Object out) throws Exception {

        logger.info("修改正文:進(jìn)入修改正文的Handler");
        ArticleTitleModifyCmd cmd = (ArticleTitleModifyCmd) in;
        logger.info("修改正文,content={}", cmd.getContent());
        logger.info("修改正文:執(zhí)行完成,即將進(jìn)入下一個(gè)Handler");
        ctx.fireChannelProcess(in, out);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {

        logger.error("修改標(biāo)題:異常處理邏輯");

        Result re = (Result) out;
        re.setCode(1502);
        re.setMsg("修改正文發(fā)生異常");
    }
}

2.4 通過 BootStrap 拼裝并執(zhí)行

public class ArticleModifyExample1 {

    private final static Logger logger = LoggerFactory.getLogger(ArticleModifyExample1.class);

    public static void main(String[] args) {
        //構(gòu)造入?yún)?        ArticleTitleModifyCmd dto = new ArticleTitleModifyCmd();
        dto.setArticleId("articleId_001");
        dto.setTitle("articleId_001_title");
        dto.setContent("articleId_001_content");

        //創(chuàng)建引導(dǎo)類
        BootStrap bootStrap = new BootStrap();

        //拼裝并執(zhí)行
        Result result = (Result) bootStrap
                .inboundParameter(dto)//入?yún)?                .outboundFactory(new ResultFactory())//出參工廠
                .channel(new ArticleModifyChannel())//自定義channel
                .addChannelHandlerAtLast("checkParameter", new CheckParameterHandler())//第一個(gè)handler
                .addChannelHandlerAtLast("modifyTitle", new ArticleModifyTitleHandler())//第二個(gè)handler
                .addChannelHandlerAtLast("modifyContent", new ArticleModifyContentHandler())//第三個(gè)handler
                .process();//執(zhí)行
        //result為執(zhí)行結(jié)果
        logger.info("result:code={},msg={}", result.getCode(), result.getMsg());
    }
}

2.5 執(zhí)行結(jié)果

以下是運(yùn)行 ArticleModifyExample1 的 main 方法打出的日志,可以看到我們定義的 handler 被逐個(gè)執(zhí)行了。

wKgaombtGFuAFlFjAAMfA3tGG9c190.png

3. 異常處理

3.1 Handler 異常處理

當(dāng)某個(gè)Handler執(zhí)行發(fā)生異常時(shí),我們可將其異常處理邏輯實(shí)現(xiàn)在當(dāng)前 Handler 的 exceptionCaught 方法中。

在 pie 案例工程( https://github.com/feiniaojin/pie-example.git )的 example2 包中,展示了某個(gè) Handler 拋出異常時(shí)的處理方式。

假設(shè) ArticleModifyTitleHandler 的業(yè)務(wù)邏輯會(huì)拋出異常,實(shí)例代碼如下:

public class ArticleModifyTitleHandler implements ChannelHandler {

    private Logger logger = LoggerFactory.getLogger(ArticleModifyTitleHandler.class);

    @Override
    public void channelProcess(ChannelHandlerContext ctx,
                               Object in,
                               Object out) throws Exception {

        logger.info("修改標(biāo)題:進(jìn)入修改標(biāo)題的Handler");
        ArticleTitleModifyCmd cmd = (ArticleTitleModifyCmd) in;
        String title = cmd.getTitle();
        //此處的異常用于模擬執(zhí)行過程中出現(xiàn)異常的場(chǎng)景
        throw new RuntimeException("修改title發(fā)生異常");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {
        logger.error("修改標(biāo)題:異常處理邏輯");
        Result re = (Result) out;
        re.setCode(1501);
        re.setMsg("修改標(biāo)題發(fā)生異常");
    }
}

此時(shí) ArticleModifyTitleHandler 的 channelProcess 方法一定會(huì)拋出異常, 在當(dāng)前 Handler 的 exceptionCaught 方法中對(duì)異常進(jìn)行了處理。

運(yùn)行 ArticleModifyExample2 的 main 方法,輸出如下:

wKgaombtGGeAdo9GAAHqAaCzzZs111.png

3.2 全局異常處理

有時(shí)候,我們不想每個(gè) handler 都處理一遍異常,我們希望在執(zhí)行鏈的最后統(tǒng)一進(jìn)行處理。
在 ArticleModifyExample3 中,我們展示了通過一個(gè)全局異常進(jìn)行最后的異常處理,其實(shí)現(xiàn)主要分為以下幾步:

3.2.1 業(yè)務(wù) Handler 傳遞異常

如果業(yè)務(wù) Handler 實(shí)現(xiàn)了 ChannelHandler 接口,那么需要手工調(diào)用 ctx.fireExceptionCaught 方法向下傳遞異常。
例如 CheckParameterHandler 捕獲到異常時(shí)的示例如下:


@Override
public class XXXHandler implements ChannelHandler {

    //省略其他邏輯

    //異常處理
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {

        logger.info("參數(shù)校驗(yàn)的異常處理邏輯:不處理直接向后傳遞");
        ctx.fireExceptionCaught(cause, in, out);
    }
}

如果業(yè)務(wù) Handler 繼承了 ChannelHandlerAdapter,如果沒有重寫 fireExceptionCaught 方法,則默認(rèn)將異常向后傳遞。

3.2.2 實(shí)現(xiàn)全局異常處理的 Handler

我們把業(yè)務(wù)異常處理邏輯放到最后的 Handler 中進(jìn)行處理,該 Handler 繼承了ChannelHandlerAdapter,只需要重寫異常處理的exceptionCaught
方法。
示例代碼如下:

public class ExceptionHandler extends ChannelHandlerAdapter {

    private Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
                                Throwable cause,
                                Object in,
                                Object out) throws Exception {

        logger.error("異常處理器中的異常處理邏輯");
        Result re = (Result) out;
        re.setCode(500);
        re.setMsg("系統(tǒng)異常");
    }
}

3.2.3 將 ExceptionHandler 加入到執(zhí)行鏈中

直接通過 BootStrap 加入到執(zhí)行鏈最后即可,示例代碼如下:


public class ArticleModifyExample3 {

    private final static Logger logger = LoggerFactory.getLogger(ArticleModifyExample3.class);

    public static void main(String[] args) {
        //入?yún)?        ArticleTitleModifyCmd dto = new ArticleTitleModifyCmd();
        dto.setArticleId("articleId_001");
        dto.setTitle("articleId_001_title");
        dto.setContent("articleId_001_content");
        //創(chuàng)建引導(dǎo)類
        BootStrap bootStrap = new BootStrap();

        Result result = (Result) bootStrap
                .inboundParameter(dto)//入?yún)?                .outboundFactory(new ResultFactory())//出參工廠
                .channel(new ArticleModifyChannel())//自定義channel
                .addChannelHandlerAtLast("checkParameter", new CheckParameterHandler())//第一個(gè)handler
                .addChannelHandlerAtLast("modifyTitle", new ArticleModifyTitleHandler())//第二個(gè)handler
                .addChannelHandlerAtLast("modifyContent", new ArticleModifyContentHandler())//第三個(gè)handler
                .addChannelHandlerAtLast("exception", new ExceptionHandler())//異常處理handler
                .process();//執(zhí)行
        //result為執(zhí)行結(jié)果
        logger.info("result:code={},msg={}", result.getCode(), result.getMsg());
    }
}

3.2.4 運(yùn)行 ArticleModifyExample3

運(yùn)行 ArticleModifyExample3 的 main 方法,控制臺(tái)輸出如下,可以看到異常被傳遞到最后的 ExceptionHandler 中進(jìn)行處理。

wKgZombtGGmAT1MbAAKoayl5eCE437.png

4. 總結(jié)

本文通過簡(jiǎn)單的例子,向讀者介紹了如何使用pie框架快速進(jìn)行責(zé)任鏈模式開發(fā),包括責(zé)任鏈初始化和異常處理等日常開發(fā)中常見的場(chǎng)景。讀者可以參考這些案例,并將pie框架應(yīng)用于實(shí)際開發(fā)中,以快速實(shí)現(xiàn)通用的責(zé)任鏈模式,最終降低代碼的耦合度、增加代碼的可擴(kuò)展性和提高代碼的可讀性。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8577

    瀏覽量

    151023
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3320

    瀏覽量

    42473
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    639

    瀏覽量

    29185
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    開源項(xiàng)目!OpenCat—— 一個(gè)全能的平價(jià)四足機(jī)器人

    的消費(fèi)市場(chǎng)。可以把它想象成一個(gè)有腿的安卓手機(jī)或Alexa,帶有一個(gè)可供第三方擴(kuò)展的應(yīng)用商店。它可以以約每秒 2.6 個(gè)身體長(zhǎng)度的速度持續(xù)運(yùn)行 60分鐘,或者坐著播放視頻幾個(gè)小時(shí)。還在脊柱下方預(yù)留了一些
    發(fā)表于 12-16 11:44

    ElfBoard開源項(xiàng)目|車牌識(shí)別項(xiàng)目技術(shù)文檔

    車牌識(shí)別項(xiàng)目基于百度智能云平臺(tái),旨在利用其強(qiáng)大的OCR服務(wù)實(shí)現(xiàn)車牌號(hào)碼的自動(dòng)識(shí)別。選擇百度智能云的原因是其高效的API接口和穩(wěn)定的服務(wù)質(zhì)量,能夠幫助開發(fā)者快速實(shí)現(xiàn)車牌識(shí)別應(yīng)用。這個(gè)
    的頭像 發(fā)表于 12-06 10:30 ?236次閱讀
    ElfBoard<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>|車牌識(shí)別<b class='flag-5'>項(xiàng)目</b>技術(shù)文檔

    凌蒙派OpenHarmony開源項(xiàng)目榮獲本期Gitee官方推薦

    近日,司凌蒙派OpenHarmony開源項(xiàng)目榮獲本期Gitee官方推薦。本期Gitee官方推薦不僅是對(duì)凌蒙派OpenHarmony開源項(xiàng)目
    的頭像 發(fā)表于 11-20 01:04 ?245次閱讀
    凌蒙派OpenHarmony<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>榮獲本期Gitee官方推薦

    ElfBoard開源項(xiàng)目|“智慧光伏”開源項(xiàng)目技術(shù)文檔

    最大化地捕捉和利用。下面就和各位小伙伴詳細(xì)介紹一下這一開源項(xiàng)目是怎樣實(shí)現(xiàn)的。環(huán)境說明1.開發(fā)環(huán)境操作系統(tǒng):Ubuntu18.0464位版2.交叉編譯工具:arm-
    的頭像 發(fā)表于 10-11 15:52 ?389次閱讀
    ElfBoard<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>|“智慧光伏”<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>技術(shù)文檔

    Matepad pro12.2 已上市半個(gè)月,但是還沒有在開源網(wǎng)站看到該項(xiàng)目開源信息,違背開源精神

    Matepad pro12.2 已上市半個(gè)月,本人自己也購(gòu)買了同款12+256的pad,想要同步學(xué)習(xí)下這款pad的一些體驗(yàn)還不錯(cuò)的功能點(diǎn),但是目前為止還沒有在開源網(wǎng)站看到該項(xiàng)目開源
    發(fā)表于 08-27 17:25

    開源項(xiàng)目!基于 Arduino DIY 漂亮的宏機(jī)械鍵盤

    。 接下來,我們將要制作的這款鍵盤擁有 12 個(gè)按鍵,可以根據(jù)自己的喜好和需求,將這些按鍵與所需的快捷鍵進(jìn)行關(guān)聯(lián)。盡管這個(gè)項(xiàng)目聽起來可能有些復(fù)雜,但實(shí)際上無論是電子部分還是軟件部分,
    發(fā)表于 08-19 17:02

    開源項(xiàng)目!用ESP8266 DIY會(huì)爬墻的無人機(jī)

    有點(diǎn)神奇,作者表示,下面介紹的這個(gè)無人機(jī)就能做到! 一個(gè)基于NodeMCU飛行控制器和安卓應(yīng)用控制的爬墻項(xiàng)目。完整的細(xì)節(jié)和解釋視頻。 相信,會(huì)愛上它。 玩無人機(jī)需要一個(gè)飛行控制器,
    發(fā)表于 07-04 09:22

    華為車究竟成沒成功,這個(gè)責(zé)任誰來擔(dān)?

    華為車,一種很新的車方式。
    的頭像 發(fā)表于 06-20 11:16 ?263次閱讀

    嵌入式軟件工程師如何提升自己

    、分享項(xiàng)目經(jīng)驗(yàn)等方式,展示自己的專業(yè)能力和行業(yè)見解,樹立自己在行業(yè)中的聲譽(yù)。 6.尋找合適的導(dǎo)師 在職業(yè)生涯的發(fā)展過程中,有一個(gè)經(jīng)驗(yàn)豐富的導(dǎo)師是非常寶貴的。他們可以給予指導(dǎo)和
    發(fā)表于 06-12 11:20

    項(xiàng)目分享|基于ELF 1S開發(fā)板完成的物聯(lián)網(wǎng)開源項(xiàng)目

    與技術(shù)的火花。關(guān)于這個(gè)項(xiàng)目的思維導(dǎo)圖,如下圖所示:接下來,將會(huì)從云-網(wǎng)-邊-端的物聯(lián)網(wǎng)體系架構(gòu)出發(fā),描述整個(gè)開源項(xiàng)目的開發(fā)過程,整個(gè)開源
    的頭像 發(fā)表于 05-14 09:03 ?1344次閱讀
    <b class='flag-5'>項(xiàng)目</b>分享|基于ELF 1S開發(fā)板完成的物聯(lián)網(wǎng)<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>

    開源項(xiàng)目】Arduino ESP32 彩色電子氣象站

    展示是如何構(gòu)建這個(gè)項(xiàng)目的,以及如何使用相同或相似的顯示器來構(gòu)建自己項(xiàng)目。 首先,讓解釋一
    發(fā)表于 01-16 14:01

    關(guān)于FPGA的開源項(xiàng)目介紹

    Hello,大家好,之前給大家分享了大約一百多個(gè)關(guān)于FPGA的開源項(xiàng)目,涉及PCIe、網(wǎng)絡(luò)、RISC-V、視頻編碼等等,這次給大家?guī)淼氖遣豢菰锏膴蕵?b class='flag-5'>項(xiàng)目,主要偏向老的游戲內(nèi)核使用FP
    的頭像 發(fā)表于 01-10 10:54 ?1452次閱讀
    關(guān)于FPGA的<b class='flag-5'>開源</b><b class='flag-5'>項(xiàng)目</b>介紹

    五元左右?要的不是雪,而是開源的雪花燈

    佳作,愿也喜歡——用工程師的獨(dú)有浪漫與神奇魔法,一起點(diǎn)亮不會(huì)融化的雪花燈。觸摸無極調(diào)光雪花燈-開源分享-雪花燈原創(chuàng)開源項(xiàng)目采用SGL8022W觸摸芯片+陶瓷燈絲
    的頭像 發(fā)表于 01-06 08:04 ?571次閱讀
    五元左右?<b class='flag-5'>我</b>要的不是雪,而是<b class='flag-5'>開源</b>的雪花燈

    開源FPGA項(xiàng)目有哪些

    請(qǐng)問開源FPGA項(xiàng)目有哪些?
    發(fā)表于 12-26 12:09

    OpenHarmony Meetup 2023南京站亮點(diǎn)搶先看

    點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們 開源項(xiàng)目 OpenHarmony 是每個(gè)人的 OpenHarmony 原文標(biāo)題:OpenHarmony Meetup 2023南京站亮點(diǎn)搶先看 文章出處:【微信公眾號(hào):OpenAtom OpenHarmo
    的頭像 發(fā)表于 12-25 21:10 ?581次閱讀
    OpenHarmony Meetup 2023南京站亮點(diǎn)搶<b class='flag-5'>先看</b>
    主站蜘蛛池模板: 日本中文字幕伊人成中文字幕 | 久久re热线视频国产| 久久综合色一综合色88中文| 秋霞网在线伦理免费| 亚洲免费人成在线视频观看| 99久久麻豆AV色婷婷综合| 国产人妻人伦精品无码.麻豆 | 人成片在线观看亚洲无遮拦| 亚洲国产在线99视频| a免费在线观看视频| 国产色综合色产在线视频| 免费精品国产人妻国语麻豆| 午夜国产福利| 99久酒店在线精品2019| 狠狠干老司机| 三级黄色在线免费观看| 综合色就爱涩涩涩综合婷婷| 国产精品人妻午夜福利| 欧美国产精品久久久乱码| 亚洲午夜久久久无码精品网红A片| 百度影音第四色| 老司机午夜影院味味| 午夜天堂AV久久久噜噜噜| chinesevideoshd性舞| 久久精品成人免费看| 午夜视频体内射.COM.COM| freehd另类xxxx喷水| 久久免费精品一区二区| 亚洲AV无码久久流水呻蜜桃久色| aaaaaaa一级毛片| 久久国产免费观看精品1| 手机在线国产视频| caoporon超碰在线视频| 久久免费精品视频| 亚洲国产日韩欧美视频二区| 国产ZZJJZZJJ视频全免费| 欧美乱码伦视频免费66网| 5278欧美一区二区三区| 精品久久久麻豆国产精品 | 亚洲中文在线精品国产| 国产AV亚洲精品久久久久软件|