焦点关注:前端可视化搭建定义联动协议实现

来源:脚本之家 2023-05-09 12:10:08

目录
引言设计联动协议实现联动协议总结

引言

虽然底层框架提供了通用的组件值与联动配置,可以建立对组件任意 props 的映射,但这只是一个能力,还不是协议。


(资料图)

业务层是可以确定一个协议的,还要让这个协议具有拓展性。

我们先从使用者角度设计 API,再看看如何根据已有的组件值与联动能力去实现。

设计联动协议

首先,不同的业务方会定义不同的联动协议,因此该联动协议需要通过拓展的方式注入:

import { createDesigner } from "designer"
import { onReadComponentMeta } from "linkage-protocol"
return 

首先可视化搭建框架支持 onReadComponentMeta属性,用于拓展所有已注册的组件元信息,而联动协议的拓展就是基于组件值与组件联动能力的,因此这种是最合理的拓展方式。

之后我们就注册了一个固定的联动协议,它形如下:

{
  "componentName": "input",
  "linkage": [{
    "target": "input1",
    "do": {
      "value": "{{ $self.value + "hello" }}"
    }
  }]
}

只要在组件实例上定义 linkage属性,就可以生效联动。比如上面的例子:

target: 联动目标。do: 联动效果,比如该例子为,组件 ID 为 input1的组件,组件值同步为当前组件实例的组件值 + "hello"$self: 描述自己实例,比如可以从 $self.value拿到自己的组件值,从 $self.props拿到自己的 props。

更近一步,target还可以支持数组,就表示同时对多个组件生效相同规则。

我们还可以支持更复杂的语法,比如让该组件可以同步其他组件值:

{
  "componentName": "input",
  "linkage": [{
    "deps": ["input1", "input2"]
    "props": {
      "text": "{{ $deps[0].value + deps[1].value }}"
    }
  }]
}

上面的例子表示,该组件实例的 props.text同步为 input1 + input2 的组件值:

deps: 描述依赖列表,每个依赖实例都可以在表达式里用 $deps[]访问到,比如 $deps[0].props可以访问组件 ID 为 input1组件的 props。props: 同步组件的 props。

如果定义了 target则作用于目标组件,未定义 target则作用于自身。但无论如何,表达式的 $self都指向自己实例。

总结一下,该联动协议允许组件实例实现以下效果:

设定组件值、组件 props 的联动效果。可以将自己的组件值同步给组件实例,也可以将其他组件值同步给自己。

基本上,可以满足任意组件联动到任意组件的诉求。而且甚至支持组件间传递,比如 A 组件的组件值同步组件 B, B 组件的组件值同步组件 C,那么 A 组件 setValue()后,组件 B 和 组件 C 的组件值会同时更新。

实现联动协议

以上联动协议只是一种实现,我们可以基于组件值与组件联动设定任意协议,因此实现联动协议的思维具备通用性,但为了方便,我们以上面说的这个协议为例子,说明如何用可视化搭建框架的基础功能实现协议。

首先解读组件实例的 linkage属性,将联动定义转化为组件联动关系,因为联动协议本质上就是产生了组件联动。接下来代码片段比较长,因此会尽量使用代码注释来解释:

const extendMeta = {
  // 定义 valueRelates 关系,就是我们上一节提到的定义组件联动关系的 key
  valueRelates: ({ componentId, selector }) => {
    // 利用 selector 读取组件实例 linkage 属性
    // 由于 selector 的特性,会实时更新,因此联动协议变化后,联动状态也会实时更新
    const linkage = selector(({ componentInstance }) => componentInstance.linkage)
    // 返回联动数组,结构: [{ sourceComponentId, targetComponentId, payload }]
    return linkage.map(relation => {
        const result = [];
        // 定义此类联动类型,就叫做 simpleRelation
        const payload = {
          type: "simpleRelation",
          do: JSON.parse(
            JSON.stringify(relation.do)
              // 将 $deps[index] 替换为 $deps[componentId]
              .replace(
                /\$deps\[([0-9]+)\]/g,
                (match: string, index: string) =>
                  `$deps["${relation.deps[Number(index)]}"]`,
              )
              // 将 $self 替换为 $deps[componentId]
              .replace(/\$self/g, () => `$deps["${componentId}"]`),
          ),
        };
        // 经过上面的代码,表达式里无论是 $self. 还是 $deps[0]. 都转化为了
        // $deps[componentId] 这个具体组件 ID,这样后面处理流程会简单而统一
        // 读取 deps,并定义 dep 组件作为 source,target 作为目标组件
        // 这是最关键的一步,将 dep -> target 关系绑定上
        relation.target.forEach((targetComponentId) => {
          if (relation.deps) {
            relation.deps.forEach((depIdPath: string) => {
              result.push({
                sourceComponentId: depIdPath,
                targetComponentId,
              });
            });
          }
          // 定义自己到 target 目标组件的联动关系
          result.push({
            sourceComponentId: componentId,
            targetComponentId,
            payload,
          });
        });
        return result;
      }).flat()
  }
}

上述代码利用 valueRelates,将联动协议的关联关系提取出来,转化为值联动关系。

接着,我们要实现 props 同步功能,实现这个功能自然是利用 runtimeProps以及 selector.relates,将关联到当前组件的组件值,按照联动协议的表达式执行,并更新到对应 key 上,下面是大致实现思路:

const extendMeta = {
  runtimeProps: ({ componentId, selector, getProps, getMergedProps }) => {
    // 拿到作用于自己的值关联信息: relates
    const relates = selector(({ relates }) => relates);
    // 记录最终因为值联动而影响的 props
    let relationProps: any = {};
    // 记录关联到自己的组件此时组件值
    const $deps = relates?.reduce(
      (result, next) => ({
        ...result,
        [next.componentId]: {
          value: next.value,
        },
      }),
      {},
    );
    // 为了让每个依赖变化都能生效,多对一每一项 do 都带过来了,需要按照 relationIndex 先去重
    relates
      .filter((relate) => relate.payload?.type === "simpleRelation")
      .forEach((relate) => {
        const expressionArgs = {
          // $deps[].value 指向依赖的 value
          $deps,
          get,
          getProps: relate.componentId === componentId ? getProps : getMergedProps,
        };
        // 处理 props 联动
        if (isObject(relate.payload?.do?.props)) {
          Object.keys(relate.payload?.do?.props).forEach((propsKey) => {
            relationProps = set(
              propsKey,
              selector(
                () =>
                  // 这个函数是关键,传入组件 props 与表达式,返回新的 props 值
                  getExpressionResult(
                    get(propsKey, relate.payload?.do?.props),
                    expressionArgs,
                  ),
                {
                  compare: equals,
                  // 根据表达式数量可能不同,所以不启用缓存
                  cache: false,
                },
              ),
              relationProps,
            );
          });
        }
      });
    return relationProps
  }
}

其中比较复杂函数就是 getExpressionResult,它要解析表达式并执行,原理就是利用代码沙盒执行字符串函数,并利用正则替换变量名以匹配上下文中的变量,大致代码如下:

// 代码执行沙盒,传入字符串 js 函数,利用 new Function 执行
function sandBox(code: string) {
  // with 是关键,利用 with 定制代码执行的上下文
  const withStr = `with(obj) { 
    $[code]
  }`;
  const fun = new Function("obj", withStr);
  return function (obj: any) {
    return fun(obj);
  };
}
// 获取沙盒代码执行结果,可以传入参数覆盖沙盒内上下文
function getSandBoxReturnValue(code: string, args = {}) {
  try {
    return sandBox(code)(args);
  } catch (error) {
    // eslint-disable-next-line no-console
    console.warn(error);
  }
}
// 如果对象是字符串则直接返回,是 {{}} 表达式则执行后返回
function getExpressionResult(code: string, args = {}) {
  if (code.startsWith("{{") && code.endsWith("}}")) {
    // {{}} 内的表达式
    let codeContent = code.slice(2, code.length - 2);
    // 将形如 $deps["id"].props.a.b.c
    // 转换为 get("a.b.c", getProps("id"))
    codeContent = codeContent.replace(
      /\$deps\[[""]([a-zA-Z0-9]*)[""]\]\.props\.([a-zA-Z0-9.]*)/g,
      (str: string, componentId: string, propsKeyPath: string) => {
        return `get("${propsKeyPath}", getProps("${componentId}"))`;
      },
    );
    return getSandBoxReturnValue(`return ${codeContent}`, args);
  }
  return code;
}

其中 with 是沙盒执行时替换代码上下文的关键。

总结

componentMeta.valueRelatescomponentMeta.runtimeProps可以灵活的定义组件联动关系,与更新组件 props,利用这两个声明式 API,甚至可以实现组件联动协议。总结一下,包含以下几个关键点:

depstarget利用 valueRelates转化为组件值关联关系。将联动协议定义的相对关系(比较容易写于容易记)转化为绝对关系(利用 componentId 定位),方便框架处理。利用 with执行表达式上下文。利用 runtimeProps+ selector实现注入组件 props 与响应联动值 relates变化,从而实现按需联动。

讨论地址是:精读《定义联动协议》· Issue #471 · dt-fe/weekly

以上就是前端可视化搭建定义联动协议实现的详细内容,更多关于前端可视化搭建联动协议的资料请关注脚本之家其它相关文章!

上一篇 : 信用卡逾期4个月该如何解决?信用卡最低还款还不上怎么办? 环球信息

下一篇 : 券商股为何大涨?多位选手吃涨停!比赛报名只剩1天,快来角逐大奖!

x
广告
高层声音

敦煌有约 牵手世界——第六届丝绸之路(敦煌)国际文化博览会掠影

2023-09-09

美国无家可归者问题日趋严重

2023-09-09

蒙面唱将韦小力第几期(蒙面唱将韦小力是哪一期)

2023-09-09

lostdir文件怎么在电脑恢复(LOST.DIR是什么文件可以删吗)

2023-09-09

灼灼琉璃夏2官网在哪下载 最新官方下载安装地址

2023-09-09

【动态】奉贤区深化知识产权“专利导航服务”模式,助力企业创新发展

2023-09-09

广州地铁4号线线路图(广州地铁4号线)

2023-09-08

国睿科技今天怎么啦(2023年09月08日国睿科技股份有限公司怎么样)

2023-09-08

主力复盘:超5亿封板中国卫通 3亿流出贵州茅台

2023-09-08

以链黏商 昆山打造千亿级咖啡产业链

2023-09-08

深圳外卖小哥积水中游泳?视频曾被辟谣,发生地非深圳

2023-09-08

广汽集团冯兴亚:埃安正在加速推进IPO

2023-09-08

家的新刚需丨惠达卫浴智能马桶,让生活更精致

2023-09-08

钢筋搭接规范(钢筋笼钢筋搭接规范)

2023-09-08

绍兴新增了这种车道!能驶入吗?最新说明来了

2023-09-08

首个算力产业企业综合传播力指数榜单发布

2023-09-08

中电环保9月1日快速反弹

2023-09-01

保研应该越来越难了

2023-09-01

阿根廷首笔人民币直接投资落地

2023-09-01

俄土外长举行新闻发布会 介绍黑海港口农产品外运协议替代方案协商情况

2023-09-01

月饼热量高吗 盘点月饼热量)

2023-09-01

暑期博物馆“爆满”折射中国传统文化热

2023-08-31

23四川65票面利率为2.5000%

2023-08-31

一心堂:接受东北证券等机构调研

2023-08-31

上海市检察院原党组书记、检察长张本才,受审

2023-08-31

NHTSA要求特斯拉提供Autopilot配置数据

2023-08-31

俄罗斯否决关于延长马里制裁的安理会决议草案

2023-08-31

河北水利水电工程学院官网 河北水利水电学院官网

2023-08-31

零跑首款全球化车型B11 9月4日慕尼黑车展见

2023-08-31

当杭州亚运会遇见中国风

2023-08-31

文字找茬大师女生减肥过关攻略

2023-08-31

博拓生物08月30日获沪股通增持19万股

2023-08-31

永兴材料08月30日获深股通增持8.52万股

2023-08-31

甘肃省庆阳市2023-08-31 05:37发布大雾黄色预警

2023-08-31

花鸟鱼虫市场有卖猫的吗_花鸟鱼虫市场

2023-08-31

m8800(关于m8800的基本详情介绍)

2023-08-30

【石榴花开 籽籽同心】走进多民族社区:延边丹英社区绽放民族团结之花

2023-08-30

QQ飞车红包达人(qq飞车红包)

2023-08-30

中国铁建(01186)发布中期业绩 归母净利润136.49亿元 同比增加1.18%

2023-08-30

2023年安全诚信航运公司名单公示

2023-08-30

泰和科技:8月30日召开董事会会议

2023-08-30

农发行湘潭县支行:创新担保合作模式 助力小微企业发展

2023-08-30

推进再生水利用,解决水资源短缺 全国非常规水源利用量显著提升

2023-08-30

《女囚风暴1995》上映,阿娇周秀娜主演,女子监狱,暴力美学

2023-08-30

莫莱茨·姆贝基(关于莫莱茨·姆贝基简述)

2023-08-30

lookcrazy金庸人物(look crazy)

2023-08-30

江华:选图书 购文具 迎开学

2023-08-30

超BBA!30万以上SUV销量第一 理想L7、L8、L9三车月交付同步破万

2023-08-30

关于宁波公积金查询的一些信息

2023-08-30

阿联正式官宣退役!周琦加盟广东后,内线完成交替,安心离队

2023-08-30

*ST太安股东户数下降4.52%,户均持股2.96万元

2023-08-29

江西上饶信州区:多措并举引育数字经济人才

2023-08-29

怪物vodafonewifi巨大(zooxxx)

2023-08-29

香港证监会联同香港廉署采取行动打击怀疑市场操纵集团

2023-08-29

天津西站到滨海机场多远 天津西到滨海机场

2023-08-29

8月29日国内锌合金市场价格汇总

2023-08-29

恒力石化董秘回复: 公司原油多为进口,暂时没有可供出口的原油

2023-08-29

怎么样才能修复shell32.dll文件错误

2023-08-29

滕州市中心人民医院手术麻醉科党总支举办“无影情暖 医脉相承”研学活动

2023-08-29

安达智能(688125)8月28日主力资金净卖出105.34万元

2023-08-29

一怒为红颜什么意思解释(一怒为红颜什么意思)

2023-08-29

建设工业(002265):8月28日北向资金减持16.56万股

2023-08-29

面板行业底部初现 京东方二季度业绩环比大增

2023-08-28

论文题目怎么定题_论文题目怎么定

2023-08-28

美迪凯:上半年亏损约3104.61万元

2023-08-28

合肥365房产网二手房(合肥房产资讯365

2023-08-28

安徽旌德:梯田水稻迎丰收

2023-08-28

浙商证券:给予银轮股份买入评级

2023-08-28

俄罗斯飞船事故(陈北航:国际空间站一飞船发生泄漏事故)

2023-08-28

女儿的身高计算公式_孩子的身高计算公式

2023-08-28

北京市广播电视局政务服务实现全天候“自助办”

2023-08-28

洋浦5家企业获得近8000万元技改提质奖金

2023-08-28

中级经济师如何认定职称?

2023-08-28

天津体育学院内蒙古录取分数线 天津体育学院内蒙古招生人数多少

2023-08-27

杭州全力打造首届碳中和亚运会

2023-08-27

杭州这群“10后”沉浸式体验国学,直呼:“入学礼终身难忘!”

2023-08-27

14.09-18.09万!捷途旅行者性价比让大众直呼“哇塞”

2023-08-27

隆基电磁(873425):2023年上半年净利润3041.48万元,同比减少22.86%

2023-08-27

海口实验中学高中部怎么样_海口实验中学高中部

2023-08-27

普里戈任座机黑匣子找到了!

2023-08-27

山西博物院四大新展9月开幕

2023-08-27

闽南语歌曲车站原唱 歌曲车站原唱

2023-08-27

像“猪仔”一样被转卖、受尽折磨……云南多地紧急发文!

2023-08-26

小程序可申请社会救助!重庆“救助通”试点区县扩至29个

2023-08-26

《RCEP海运贸易指数报告(2023)》发布 预计2023年RCEP成员国间海运贸易形势将好于全球

2023-08-26

众星抵制日本核污染水排海:郭帆用日漫讽刺,贾乃亮强烈谴责

2023-08-26

简笔画灯笼怎么画(灯笼怎么画)

2023-08-26

多家券商相继降佣 助力资本市场活跃度提升

2023-08-26

邵阳市部、省属及市直机关单位家属院落创文管理工作现场推进会召开

2023-08-26

今年服贸会9月2日在京启幕 18件“湖北服务”展品将亮相

2023-08-26

股票行情快报:宁波富邦(600768)8月25日主力资金净卖出114.87万元

2023-08-26

【晚新闻】河北成功办理首张线上《出生医学证明》;石家庄将打造一城市快速路

2023-08-25

2023年篮球世界杯首场比赛拉开战幕

2023-08-25

孙志新(关于孙志新简述)

2023-08-25

东阿农商银行:强化渠道业务拓展,推动高质量发展

2023-08-25

扬州普通话考试需要提前多久到达考点

2023-08-25

2023长沙英语四六级成绩在哪查?

2023-08-25

最新进展!涉及济南轨道交通4号线、6号线、7号线

2023-08-25

共12条线路!成都市低运量轨道交通线网规划方案请你提建议

2023-08-25

靖安:万亩“秋茶”采摘忙

2023-08-25

嘉楠科技美股跌7.98%

2023-08-25

沙特联精彩1夜!本泽马传射斩首球 菲米助攻凯西绝杀 米林直红

2023-08-25

如何练字最有效硬笔(如何练字最有效)

2023-08-25

净化市容环境,江岸区后湖街道清理违规户外广告

2023-08-24

如何申报农产品加工业市级贷款贴息补助政策?需满足这三个条件

2023-08-24

印度七年来首次禁止食糖出口,或引发世界食品通胀加剧

2023-08-24

2023长沙迎江路道路工程建设进展(持续更新)

2023-08-24

曝特斯拉或在沈阳建厂!特斯拉回应:没有要建厂

2023-08-24

长实亲海駅II周六售最后35伙

2023-08-24

Easter是什么意思 easter是什么意思英语

2023-08-24

普里戈任坠机身亡,10个不容忽视的细节

2023-08-24

《孤注一掷》票房一路飙升 金晨成30亿票房女主

2023-08-24

上海推出29项任务举措,推动临港新片区新一轮发展

2023-08-24

分析:Starknet代币或在11月29日迎来首次解锁,此日期前应完成必要交互以博取空投

2023-08-24

海淀区西北旺镇屯佃村原村委会主任范宝华接受审查调查

2023-08-24

国内成品油价格小幅上调

2023-08-24

天空:格拉纳达在与曼联谈A费的租借事宜,伯恩利也对球员有意

2023-08-23

美国夏威夷毛伊岛大火仍有上千人失联

2023-08-23

直真科技:筹划向特定对象发行股票事项

2023-08-23

华阳国际: 2023年半年度财务报告

2023-08-23

华立股份:终止实施湖北华置立装饰材料厂区项目

2023-08-23

走!和张大千来一场穿越时空的“对话”

2023-08-23

福建省泉州市2023-08-23 13:42发布暴雨黄色预警

2023-08-23

2022东莞汽油今日价格查询

2023-08-23

重庆:车船税电子完税证明线上可开 办理更方便

2023-08-23

英伟达和威睿扩大合作伙伴关系

2023-08-23

三叶草生物-B(02197)首席执行官梁果拟增持不多于200万港元的股份

2023-08-23

这种“身份证”,即将全覆盖

2023-08-23

明泰铝业(601677):8月22日北向资金减持50.92万股

2023-08-23

2023世界显示产业大会将于9月7日在成都举行

2023-08-22

【新机】iQOOZ8来了 跑分现身 搭载天玑8200 性能提升~

2023-08-22

泡泡玛特:H1净利4.7亿与去年全年相当,海外业务净利大增183%

2023-08-22

七夕节服务器崩了?Steam登热搜引热议

2023-08-22

民安社区志愿服务队 关于民安社区志愿服务队介绍

2023-08-22

女生考上中戏,被妈妈偷走录取通知书阻挠入学,她无奈痛哭求助

2023-08-22

绷紧防汛救灾这根弦

2023-08-22

八哥鸟说话你好视频(教八哥鸟说你好的录音)

2023-08-22

集度“改姓”与小米“沉默”

2023-08-22

以色列母子羽球世锦赛晋级 65岁母亲继续刷新纪录

2023-08-22

国金证券给予东方电热买入评级 电加热器龙头 预镀镍0-1迎放量

2023-08-22

商誉减值V财务洗澡 世纪华通沃格光电拓维信息的十字路口(下)

2023-08-22

投资项目竣工决算审计应关注的8大重点

2023-08-22

社保基金二季度持有科创板股名单(附股)

2023-08-22

300余名应征女青年入围体检

2023-08-22

Ale承认自己不如TheShy!却因谈论BP再起风波

2023-08-22

坚固又大气!同安区四座人行天桥完成改造

2023-08-21

『每日篇』P站日榜动漫壁纸分享 _230821档

2023-08-21

降雨助力!济南 “月牙飞瀑”胜景醉人

2023-08-21

自治区交通运输厅原党组书记陈鸿起接受审查调查

2023-08-21

陆地探测四号01星顺利进入工作轨道

2023-08-21

辅警韩靖跳江救人,彰显血性、责任与使命

2023-08-21

收评:沪指跌逾1%失守3100点 环保板块逆市走强

2023-08-21

花花“视”界|《诗经》中的萱草花开啦

2023-08-21

多国出现新变异株!拟命名“Pi”

2023-08-21

国信证券给予唐山港增持评级 受益于渤海湾港口整合 装卸主业有望迎量价齐升

2023-08-21

让口袋公园装满百姓幸福

2023-08-21

经济是否需要悲观?天风宏观:即使不依靠政策,经济也至少有两个方面的乐观因素

2023-08-21

辽宁省锦州市2023-08-21 08:37发布暴雨黄色预警

2023-08-21

铝锅的危害和处理方法?(铝锅的危害)

2023-08-21

科鲁兹天窗保险丝在保险盒什么位置(科鲁兹天窗保险在哪)

2023-08-21

子曰人而不仁如礼何人而不仁如乐何朗读(子曰人而不仁如礼何人而不仁如乐何)

2023-08-20

今日dnf纯净的黄金增幅书和纯净的增幅书(DNF 5周年纯净的黄金增幅书什么作用)

2023-08-20

小铭切瓜丨电影《孤注一掷》火了,常见的电信网络诈骗有哪些套路?会涉及到哪些罪名?

2023-08-20

2连板启迪环境:公司经营情况及内外部经营环境未发生重大变化

2023-08-20

汽车首保什么机油最好(汽车首保使用什么机油)

2023-08-20

为什么你需要开始冷藏你的红葡萄酒以及你应该将瓶子放在冰箱里多长时间

2023-08-20

《黑神话:悟空》试玩报告B面:复归常人

2023-08-20

山姜是毒还是药 山姜是毒还是药

2023-08-20

股票前加xd是好是坏 股票前加XD是什么意思

2023-08-20

纳塞尔汽车制造有限公司向菲律宾出口标致3008

2023-08-19

北方稀土:打造一批世界一流的稀土生产智能制造示范线

2023-08-19

向群众报告 | “美丽乡村行”交通安全巡回宣讲活动走进重庆石柱黄水

2023-08-19

乳腺birads3类可以买重疾险吗?买重疾险的方式有哪些?

2023-08-19

拔智齿,能瘦脸?智齿:想多了!

2023-08-19

俄媒:普京视察顿河畔罗斯托夫特别军事行动指挥部,听取报告

2023-08-19

“恨之入骨 大快人心” !央视街采医药反腐

2023-08-19

注册“高仿”账号贬损他人,法院判决侵犯名誉权

2023-08-19

金徽酒2023年上半年营收增长超24% 归母净利已接近去年全年

2023-08-19

梦幻西游开区表查询 梦幻西游维护到几点

2023-08-19

韩乔生点评沃尔科特:当初被整个英格兰寄予厚望,未完全兑现天赋

2023-08-18

新能源汽车下乡 浙江到2025年建成充电桩230万个以上

2023-08-18

葡桃UNHIP-HOP(关于葡桃UNHIP-HOP简述)

2023-08-18

北京这些博物馆暑期取消周一闭馆

2023-08-18

您现在可以在新奥迪中观看YouTube视频

2023-08-18

青年未就业群体专场招聘会举办 近2000名受灾地区毕业生收到邀请

2023-08-18

郧阳区行政审批局:夏日送清凉 关爱暖人心

2023-08-18

“也不敢卖,就想自己看!”226张淫秽光碟,沪一男子帮人搬家变“扫货”?

2023-08-18

美媒:受各种灾害困扰增多 夏威夷已成美国最危险的州之一

2023-08-18

美债收益率创15年新高 全球资产“风声鹤唳”

2023-08-18

市、区、街道三级合力整改,黄陂青云村荒废淤泥田变生态农业基地

2023-08-18

二手家电在哪儿买(二手家电在哪买)

2023-08-18

汽车车门重新喷漆有什么影响吗(车门喷漆是整个车门漆全磨掉吗)

2023-08-18

177.79亿!暑期档票房新纪录诞生!

2023-08-17

宁波瑞利特电子有限公司(姜素拉骂利特)

2023-08-17

ZPMC助力台湾首座全自动化码头正式启用

2023-08-17

建行深圳市分行原风险总监韩凤林受贿超836万,一审获刑11年

2023-08-17

恒大汽车两年亏掉840亿 恒大高管年薪过千万?官方回应

2023-08-17

*ST园城(600766)8月17日主力资金净卖出134.08万元

2023-08-17

山西泽州:万亩红薯趟出“甜蜜”致富路

2023-08-17

港股异动 | 小鹏汽车-W(09868)现涨超5% 明日发布业绩 机构称全新产品周期即将发力

2023-08-17

返回顶部