聊聊Cola-StateMachine轻量级状态机的实现

背景

在分析Seata的saga模式实现时,实在是被其复杂的 json 状态语言定义文件劝退,我是有点没想明白为啥要用这么来实现状态机;盲猜可能是基于可视化的状态机设计器来定制化流程,更方便快捷且上手快吧,毕竟可以通过UI直接操作,设计状态流转图,但我暂时不太能get到。对于Saga模式的实现,之前的博文中已经阐述了基于状态机模式实现Saga,是比较常见且合适的做法,因此了解了下Java中的状态机实现方案,以后有相关的业务场景也可以直接上手使用状态机。

Cola-StateMachine

Cola-StateMachine组件是一种轻量级的、无状态的、基于注解的状态机实现,可以方便地管理订单等业务对象的状态转换。COLA框架的状态机使用了连贯接口(Fluent Interfaces)来定义状态和事件,以及对应的动作和检查。COLA框架的状态机是COLA 4.0应用架构的一部分,旨在控制复杂度,提高开发效率。开发背景可见实现一个状态机引擎,教你看清DSL的本质。

基础模型

在Cola-StateMachine组件中有如下的抽象概念模型:


(相关资料图)

1.State:状态2.Event:事件,状态由事件触发,引起变化3.Transition:流转,表示从一个状态到另一个状态4.External Transition:外部流转,两个不同状态之间的流转5.Internal Transition:内部流转,同一个状态之间的流转6.Condition:条件,表示是否允许到达某个状态7.Action:动作,到达某个状态之后,可以做什么8.StateMachine:状态机

Cola-StateMachine链路图业务应用示例

基于订单业务的场景,做一个简单的demo。

关闭订单的简单流程图

关闭订单简单的状态流转图

添加依赖

    com.alibaba.cola    cola-component-statemachine    4.3.1

定义一个订单的实体类、订单状态的枚举值、订单事件的枚举值

@Data@Builderpublic class Order {    public OrderStatusEnum orderStatusEnum;    public Integer orderId;    public String orderName;}public enum OrderStatusEnum {    INIT("0", "待付款"),    WAITING_FOR_DELIVERY("1", "待发货"),    HAVE_BEEN_DELIVERY("2", "已发货"),    CLOSE("3", "已取消");    private final String code;    private final String info;    OrderStatusEnum(String code, String info)    {        this.code = code;        this.info = info;    }    public String getCode()    {        return code;    }    public String getInfo()    {        return info;    }}public enum OrderEvent {    /**     * 用户关闭     */    USER_CLOSE("0", "用户取消"),    /**     * 管理员关闭     */    ADMIN_CLOSE("1", "后台取消"),    /**     * 超时关闭     */    OVERTIME_CLOSE("2", "超时取消"),    /**     * 检查错误关闭     */    CHECK_ERROR_CLOSE("3", "上级审核取消"),    /**     * 用户付费     */    USER_PAY("4", "用户支付");    /**     * 密码     */    private final String code;    /**     * 信息     */    private final String info;    /**     * 订单事件     *     * @param code 密码     * @param info 信息     */    OrderEvent(String code, String info) {        this.code = code;        this.info = info;    }    /**     * 获取代码     *     * @return {@link String}     */    public String getCode() {        return code;    }    /**     * 获取信息     *     * @return {@link String}     */    public String getInfo() {        return info;    }}

在容器启动的时候注册一个订单状态变更的工厂

@Componentpublic class StateMachineBuilderConfig {    @Autowired    UserCloseAction userCloseAction;    @Bean("orderOperaMachine")    public StateMachine orderOperaMachine() {        String ORDER_OPERA = "order_opera";        StateMachineBuilder builder = StateMachineBuilderFactory.create();        //订单从初始化状态-待发货-状态-转到-关闭订单状态--用户关闭        builder.externalTransitions()                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.USER_CLOSE)                .when(checkCondition())                .perform(userCloseAction);        //订单从-初始化状态-已发货-待发货--转到-关闭订单状态--后台操作人员关闭        builder.externalTransitions()                .fromAmong(OrderStatusEnum.INIT, OrderStatusEnum.HAVE_BEEN_DELIVERY, OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.ADMIN_CLOSE)                .when(checkCondition())                .perform(doAction());        //订单从等待发货状态-转为-订单关闭状态-超时关闭        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.OVERTIME_CLOSE)                .when(checkCondition())                .perform(doAction());        //订单从待发货状态--转为-订单关闭状态-上级审批不通过关闭        builder.externalTransition()                .from(OrderStatusEnum.WAITING_FOR_DELIVERY)                .to(OrderStatusEnum.CLOSE)                .on(OrderEvent.CHECK_ERROR_CLOSE)                .when(checkCondition())                .perform(doAction());        //订单从初始化状态--转为待发货状态--用户支付完毕动        builder.externalTransition()                .from(OrderStatusEnum.INIT)                .to(OrderStatusEnum.WAITING_FOR_DELIVERY)                .on(OrderEvent.USER_PAY)                .when(checkCondition())                .perform(doAction());        StateMachine orderOperaMachine = builder.build(ORDER_OPERA);        //打印uml图        String plantUML = orderOperaMachine.generatePlantUML();        System.out.println(plantUML);        return orderOperaMachine;    }    private Condition checkCondition() {        return (ctx) -> {            return true;        };    }    private Action doAction() {        return (from, to, event, ctx) -> {            System.out.println(ctx.getOrderName() + " 正在操作 " + ctx.getOrderId() + " from:" + from + " to:" + to + " on:" + event);        };    }}

在定义一个特殊的,只是举个例子,可以通过集成的方式集成实现一个用户关单的具体操作

@Componentpublic class UserCloseAction implements Action {    @Override    public void execute(OrderStatusEnum from, OrderStatusEnum to, OrderEvent event, Order context) {        System.out.println("用户关闭流程开始走了");        System.out.println("从这个状态-【" + from.getInfo() + "】-转为+【" + to.getInfo() + "】 的状态");        System.out.println("上下文信息:" + context.toString());        System.out.println("中间执行的一些操作.......");        System.out.println("用户关闭流程完毕了");    }}

定义一个 controller 的操作接口

@RestControllerpublic class OrderOperaController {    @Autowired    @Qualifier("orderOperaMachine")    StateMachine orderOperaMachine;    /**     * 场景1-用户关闭订单     *     * @return {@link Boolean}     */    @RequestMapping("userclose")    public Boolean userCloseOrder() {        //把订单状态改为关闭        String machineId = orderOperaMachine.getMachineId();        System.out.println(machineId);        Order order = Order.builder().orderId(1).orderName("用户").orderStatusEnum(OrderStatusEnum.INIT).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.INIT,OrderEvent.USER_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 场景2-管理员关闭订单     *     * @return {@link Boolean}     */    @RequestMapping("adminClose")    public Boolean adminCloseOrder() {        //把订单状态改为关闭        Order order = Order.builder().orderId(1).orderName("后台操作人员").orderStatusEnum(OrderStatusEnum.HAVE_BEEN_DELIVERY).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.HAVE_BEEN_DELIVERY, OrderEvent.ADMIN_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 场景3-超时关闭订单     *     * @return {@link Boolean}     */    @RequestMapping("overTimeclose")    public Boolean overTimeCloseOrder() {        //把订单状态改为关闭        Order order = Order.builder().orderId(1).orderName("超时了关闭订单")                .orderStatusEnum(OrderStatusEnum.WAITING_FOR_DELIVERY).build();        //OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.CLOSE, OrderEvent.OVERTIME_CLOSE, order);        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.WAITING_FOR_DELIVERY, OrderEvent.OVERTIME_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }    /**     * 场景4-检查错误关闭订单     *     * @return {@link Boolean}     */    @RequestMapping("checkErrorClose")    public Boolean checkErrorCloseOrder() {        //把订单状态改为关闭        Order order = Order.builder().orderId(1).orderName("上级检查错误").orderStatusEnum(OrderStatusEnum.WAITING_FOR_DELIVERY).build();        OrderStatusEnum orderStatusEnum = orderOperaMachine.fireEvent(OrderStatusEnum.WAITING_FOR_DELIVERY, OrderEvent.CHECK_ERROR_CLOSE, order);        System.out.println(orderStatusEnum.toString());        return true;    }}

启动程序

安装UML

随便新建一个uml文件,然后将启动程序的控制台输出内容复制到uml中

最后运行下

标签:

聊聊Cola-StateMachine轻量级状态机的实现

Cola-StateMachine组件是一种轻量级的、无状态的、基于注解的状态机实现,可以方便地管理订单等业务对象的

06-07 15:02:57

当前播报:5月11家车企召回118万辆,特斯拉占比超9成

5月11家车企召回118万辆,特斯拉占比超9成6月7日,国家市场监督管理总局披露,今年5月共11家汽车生产企业向

06-07 14:26:34

世界热头条丨信用卡逾期不良信用记录什么时候会消除?信用卡还不起申请法院查封房产要提供哪些材料?

信用卡逾期不良信用记录什么时候会消除?1、通过个人信用异议申请消

06-07 13:29:28

当前速读:陈泓在调研“三夏”生产、秸秆禁烧、防汛工作时强调:千方百计克服困难 确保粮食应收尽收

5月31日下午,市人大常委会副主任、县委书记陈泓调研博爱县“三夏”生产、秸秆禁烧、防汛工作。县委常委...

06-07 12:59:00

天天热推荐:新华社权威快报丨前5个月我国货物贸易进出口同比增长4.7%

新华社权威快报丨前5个月我国货物贸易进出口同比增长4 7%---海关总署6月7日发布数据显示2023年前5个月我国

06-07 12:24:47

10名中国选手赌球被禁赛,中国台球协会回应

10名中国选手赌球被禁赛,中国台球协会回应

06-07 11:50:55

“特殊照顾”防外破 保障高铁早通车

眼下,在330千伏威凉一、二回28号杆塔下,兰张三四线高铁铺轨工作正如火如荼进行,国网武威供电公司输电运

06-07 09:47:14

(空×甘雨)良医,良药【番外(4下)】

刚进入校长办公室,甘雨便眼前一亮。办公室很整洁利落,没有多余的花里胡哨的装修。枣红色的木桌上放着一台

06-07 09:22:17

白沫河畔. 茶马古道诗书画.|天天视点

​​​白沫河畔水连天,​茶马古道此溯源。​一线沉浮千里雪,马铃来往​春秋间。(孟勇诗书画)

06-07 08:58:29

0成本信息差项目,看懂马上就能赚钱

昨天晚上小编睡得比较晚,原因是在处理一些“互联网赚钱必修课”的东西。在这个过程中我按照往常一样使...

06-07 08:17:30

当前报道:谢谢你那么好看还关注我图片背景_谢谢喵是什么意思关注喵关注谢谢喵什么梗

想必现在有很多小伙伴对于谢谢喵是什么意思,关注喵关注谢谢喵什么梗方面的知识都比较想要了解,那么今天小

06-07 07:56:01

世界关注:干加偏旁组新字_寸字加偏旁组合成什么新字

1、“寸”字加偏旁的字有:村、付、肘、过、对、忖、射、时、存、刌、吋。2、释义1 中国市制长度单位,...

06-07 07:28:52

女生说心塞塞怎么回复_网络语心塞是什么意思女人说心塞是什么意思-全球看点

想必现在有很多小伙伴对于网络语心塞是什么意思,女人说心塞是什么意思方面的知识都比较想要了解,那么今天

06-07 07:31:25

天猫运费险只赔付首重吗_天猫运费险_当前速看

1、退货运费险(买家版)针对网络交易的特征,适时推出退货运费险产品,也简称“退运保险”。2、针对支持...

06-07 06:59:34

【时快讯】何以解忧唯有杜康的作者_何以解忧唯有杜康

1、“何以解忧,唯有杜康”经常被人们引用,意思是只有酒才能解除我心头的忧虑,和李白“举杯浇愁”意思...

06-07 06:21:45

当前时讯:加快上市步伐!淮安组织重点拟上市企业走进北交所

加快上市步伐!淮安组织重点拟上市企业走进北交所

06-07 06:09:02

侄子和外甥的区别是啥_侄子和外甥的区别

1、某人姐姐或者妹妹的子女叫做某人外甥或者外甥女,简单一点说它和侄子侄女的区别就是:侄子和侄女是哥哥或

06-07 05:58:57

世界热推荐:德阳建筑学院招聘_德阳建筑学院

1、位于四川省,德阳市。2、是经四川省人民政府批准组建的、国家公办高等职业技术学院,学院渊源1956年创建

06-07 05:29:10

疯狂招揽!梅西C罗本泽马或在沙特相遇,字母哥吃瓜:自荐守门员

今夏沙特联赛成为所有人关注的焦点,他们在去年世界杯结束之后拿下C罗,影响力倍增,相关的转播、赞助等收

06-07 04:48:01

面子les电影国语版_面子les电影

1、下载土豆视频,上边有,本人亲测(【面子-原版完整版】清晰度不够高。2、找到【面子】这个清晰度还好)

06-07 04:32:15

南回归线北回归线之间的大洲_南回归线 北回归线 天天短讯

1、南回归线是太阳直射点回归运动时移到最南时所在的纬线,其纬度数值等于黄赤交角,大约在南纬23度26分。2

06-07 03:59:48

每日热闻!侯友宜与竹苗首长议长餐叙 侯郭合作话题热

中国国民党2024参选人、新北市长侯友宜6日晚间拜访新竹县议会,受到新竹县议长张镇荣欢迎。张镇荣更出面作

06-07 03:20:37

麻辣变形计第二部预告(麻辣变形计第二季什么时候播出) 全球快看

1、问导演去啊。2、麻辣变形计第二季还没拍呢,所以最早也要2017年才播了2016年六月开始拍摄,2017年登陆湖

06-07 02:23:45

邬贺铨院士:面向AR/VR、车联网,5G能力不足需提升 速看料

题:邬贺铨院士:面向AR VR、车联网,5G能力不足需提升中新财经记者刘育英苹果刚发布的MR(混合现实)头显设

06-07 01:22:43

广东省发展新型储能出连招:地级市接招,制造、应用、投资齐驱动

送政策、送需求、送补贴;制造端、应用端、投资端齐驱动……广东省发展新型储能产业打出“组合拳”。

06-07 00:33:33

天天微资讯!股票c开头是什么意思_请问300开头的是什么股票

1、300开头的股票指的是创业板股票。2、  创业板又称二板市场,即第二股票交易市场。3、创业板是指专为暂

06-07 00:09:10

迅雷宣布2000万美元股票回购计划

迅雷6月6日宣布,公司董事会已批准一项新的股票回购计划,该公司可在未来12个月内回购最多2000万美元的股票

06-06 23:34:14

普力马发动机号位置_普力马发动机-世界今热点

1、海马普力马发动机属于国产生产的发动机。2、普力马这款车说实话虽然比较小众,但其实口碑相当不错。对于

06-06 22:29:25

美梦思和朗乐福床垫是一家吗_美梦思

1、可能含有甲醛,或者在制作的时候喷的柒没有会发完,我买的宝登床垫还不错。2、你可以买个试试。本文到此

06-06 21:16:59

全球球精选!每夜一个练胆大故事txt下载_每夜一个练胆小故事

1、朋友聚会时,大概就数恐怖故事最受欢迎,却又让人欲迎还拒。2、隐藏在我们内心深处的对刺激的小向往,让

06-06 20:47:05

这些高考前的小事 是他们没说出口的爱意与期许 天天报道

不敢回头再看一眼不敢再多叮嘱一句因为心中有万般不舍临近高考,湖南一位高三老师在黑板上写下对学生们

06-06 20:06:07

四川南充市举办“青春无毒·喜迎大运”2023年禁毒文艺会演 天天新视野

南充市禁毒文艺会演现场。南充市公安局供图民主与法制网讯(记者黎志飞□黄桐熊胡若兰)6月2日,由四川省南

06-06 19:28:42

中国石油坚持绿色发展 守护美好家园

6月5日是世界环境日。多年来,人与环境和谐共生、建设清洁美丽的地球早已成为全世界人民的美好愿景和共同追

06-06 18:51:01

什么是紧急制动_怎么理解紧急制动

欢迎观看本篇文章,小柴来为大家解答以上问题。什么是紧急制动,怎么理解紧急制动很多人还不知道,现在让我

06-06 18:06:07

当前资讯!研报掘金|交银国际:料下半年内房销售同比升5%至10%首选越秀地产

研报掘金|交银国际:料下半年内房销售同比升5%至10%首选越秀地产:交银国际发报告指,鉴于去年较低的基数,

06-06 17:09:48

【全球速看料】黄州区做大做强未成年人保护“朋友圈”,首批34人获聘“未成年人保护大使”

黄州区做大做强未成年人保护“朋友圈”,首批34人获聘“未成年人保护大使”---黄州区做大做强未成年人保...

06-06 14:28:03

天天速看:75岁知名富豪再度当爸,娇妻成功怀上三胎,直言不为钱只为爱情

本文编辑剧透社:issac恭喜,恭喜!现年已经开始75岁的知名富豪、马来

06-06 13:45:33

一站式体验非洲特产!第三届中非经贸博览会展馆情况抢先看|世界要闻

发布会现场。6月6日,第三届中国—非洲经贸博览会新闻发布会在长沙举行。第三届中国—非洲经贸博览会将...

06-06 12:53:44

从源头刹住“飙车炸街”乱象

原标题:从源头刹住“飙车炸街”乱象随着夏季到来,“飙车炸街”高发,为进一步加大打击整治力度,公安...

06-06 12:03:08

环球今亮点!安图12家A级景区面向全国军人免费或优惠开放

6月5日,记者从安图县退役军人事务局获悉,经安图县文化广播电视和旅游局和安图县退役军人事务局精心组织和

06-06 11:04:39

6月5日壹网壹创发布公告,其股东减持145万股 观热点

6月5日壹网壹创发布公告《壹网壹创关于公司股东减持计划实施进展暨减持数量过半的公告》其股东中金佳泰贰期

06-06 10:00:55

环球热点!海南三亚 普惠金融业务量增面扩

本报记者李力通讯员李业嘉近年来,人民银行三亚市中支通过建立“新机制”、构建“新模式”、形成“新示...

06-06 09:18:48

天天最新:冠豪高新:6月5日融资买入175.72万元,融资融券余额4.18亿元

6月5日,冠豪高新(600433)融资买入175 72万元,融资偿还197 96万元,融资净卖出22 24万元,融资余额4 18

06-06 08:30:02

北京“最热”土拍 房企逆势围猎 环球即时看

北京土拍热度又刷新了历史纪录,但这种“局部繁荣”非但不是楼市回暖的信号,反而在全国房地产市场恢复...

06-06 07:19:41

山东全力备战“三夏” 确保6000余万亩小麦颗粒归仓

在山东省高密市密水街道西锅框村,村民正在回收麦秸。李海涛摄中新网济南6月5日电(孙婷婷)麦浪滚滚,又是一

06-06 06:53:37

【世界时快讯】汉川市垌冢镇垌冢中心小学_关于汉川市垌冢镇垌冢中心小学简述

1、汉川市垌冢镇垌冢中心小学位于湖北省孝感市汉川市。文章到此就分享结束,希望对大家有所帮助。

06-06 05:20:44

形势大逆转,热火队迎3大喜讯,掘金队破绽太明显,恭喜巴特勒

形势大逆转,热火队迎3大喜讯,掘金队破绽太明显,恭喜巴特勒,泽勒,热火队,约基奇,阿德巴约,美国篮球,丹佛

06-06 04:39:51

极端情况或出现动力中断!99辆宝马电动汽车被召回

中新经纬6月2日电国家市场监督管理总局网站2日消息,日前,华晨宝马汽车有限公司、宝马(中国)汽车贸易有限

06-06 03:10:40

包承柯答中评:李尚福部长涉台表述非常坚定_天天微头条

参加第二十届香格里拉对话会的中国国务委员兼国防部长李尚福发表题为“中国的新安全倡议”的演讲,他指...

06-06 02:13:58

印度理工学院孟买分校世界排名:2023QS172

新东方在线托福整理了印度理工学院孟买分校QS世界大学排名、学校地理位置、历史文化、学费、申请要求和录取

06-06 01:38:51

甲胄_甲胄读音
环球热消息:邓肯-罗宾逊,总决赛射手!
全球球精选!力排众议的议是什么意思_力排众议
山野菜碗芹素馅饺子做法?-天天动态
男子路遇纸片鸟一查竟是国保动物随后报警
上海南站到浦东机场大巴多少时间_上海南站到浦东机场 环球快看
《崩坏星穹铁道》怎么获得牌浪滔天成就
珠峰“最凶险之一”登山季结束 12死5失踪
夏日多巴胺穿搭朋友圈高级文案句子
信息:恒瑞医药:获得HRS-5041片的药物临床试验批准通知书
全球视点!高考天气来了!
女鬼剑哪个职业好玩95版本 女鬼剑哪个职业好
世界热讯:一码畅行上海、哈尔滨等9座城市!青岛地铁有“通票”啦
曝iOS 17拥抱第三方应用商店:国内用户无缘
沙特“自砍百万桶”,勉强摆平“内乱”,OPEC+这次能救油价吗?
腾讯课堂课堂下载(腾讯ket课堂)-世界速看料
【报资讯】鸣枪在即 兰州马拉松6月4日举行实战预演
夏天到了,怎能缺少一顶洋气的沙滩帽~ 防晒又有魅力
一城人为吉他“狂”
怎么将苹果手表快速熄屏 苹果手表怎么设置熄灭屏幕
太空归来 盘点20年航天员落地出舱时刻-快看点
属于职工薪酬的有?(属于职工薪酬的有)
视频播放器哪个软件好用 视频播放器推荐 视频播放软件哪个好?
【新视野】显示屏无信号但是主机还在运转(显示屏无信号主机正常)
世界快播:地下城绝望之塔通关奖章怎么获得_绝望之塔通关奖章怎么获得
要闻:“高考房”预订同比增长近4倍 酒店商家也“备考”
俄罗斯安全局:美国通过入侵iPhone,监控在俄公民和外交官
百千万工程 青年在行动|回顾2023年连州市青年“领头雁”电商培训暨农文旅产业推广活动首阶段的精彩历程
程大爷论市|“五穷”之后,“翻身”在即?-世界头条
无双大蛇魔王再临增值版_无双大蛇魔王再临
天天简讯:今日pd999钯金回收价格查询(2023年06月04日)
世界观天下!河南牧业经济学院招生简章 河南牧业经济学院排名
深蓝S7首批量产车正式下线 预定价格区间16.99-23.99万元 焦点速读
【环球报资讯】天全亮相2023上海旅游产业博览会
世界即时看!山西恒山明火已扑灭 系人为用火导致
今亮点!河南:与天争时 全力抢收夏粮
奇·达楞太带队到中国机械总院集团北京机电研究所有限公司座谈并签约-报道
暗黑2眼光武器是什么属性_暗黑2眼光武器是什么 今日热搜
关于坚持的名人事例现代(关于坚持的名人事例)
张洪程院士“问稻”四十八载 把论文写在希望的田野上
三连胜!泰山队2-0轻取大连人,崔康熙带队4轮抢10分,前三有望 世界聚看点
寺庙烧香拜佛有什么讲究怎么磕头_寺庙烧香拜佛有什么讲究-当前视讯
热点聚焦:扎带规格及长度_请问谁知道扎带型号规格有哪些
反正弦函数的定义域和值域(反正弦函数)
董卿见访云今岁可摆落事役重理吟咏调以此诗(关于董卿见访云今岁可摆落事役重理吟咏调以此诗的简介)_关注
天天讯息:粤港澳大湾区41支龙舟队齐聚珠海斗门 展现高水平竞技
环球精选!玩转数据、代码、流量,这样的工作你心动了吗?|解码数字新职业
环球热资讯!【奔流•记者帮】兰州七旬老人离家走失,家人急寻!
天天微头条丨纯白色背景图(纯白色)
解读!事关海南自贸港这张“零关税”清单|世界聚焦
x 广告
x 广告

Copyright ©  2015-2022 华南纤维网版权所有  备案号:粤ICP备18025786号-52   联系邮箱: 954 29 18 82 @qq.com