中文字幕 日本 在线 高清,久久精品国产99精品国,超碰人人香蕉,一区二区三区无码高清视频

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

去年上線的可視化編輯器 H5-dooring 至今已有一年的時(shí)間,期間有很多熱心的網(wǎng)友和大佬提出了非常多寶貴的建議,我們也在一步步實(shí)現(xiàn)中,以下是幾個(gè)比較典型的低代碼可視化平臺(tái)需求:

  • 出碼能力(即源碼下載功能)
  • 組件交互(即組件支持業(yè)務(wù)中常用的鏈接跳轉(zhuǎn),彈窗交互,自定義事件等)
  • 數(shù)據(jù)源管理(即用戶創(chuàng)建的不同頁(yè)面擁有共享數(shù)據(jù)的能力,不同組件之間也有共享數(shù)據(jù)的能力)
  • 組件商店(即用戶可以自主生產(chǎn)組件,定義組件,接入組件數(shù)據(jù)的能力)
  • 布局能力(即用戶可以選擇不同的布局方案來(lái)設(shè)計(jì)頁(yè)面)
  • 常用功能集成(頁(yè)面截圖,微信分享,debug能力)

上面的這些功需求已經(jīng)在 H5-dooring 陸續(xù)實(shí)現(xiàn)了,在我之前的文章中也有對(duì)應(yīng)的技術(shù)分享。但是為了讓更多的人能低成本的擁有自己的可視化搭建系統(tǒng),我們團(tuán)隊(duì)的大佬花了非常多的時(shí)間研究和沉淀,最近也開(kāi)源了一款可視化搭建框架 dooringx-lib,我們可以基于它輕松制作可視化編輯器,而無(wú)需考慮內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),接下來(lái)我就和大家分享一下這款可視化框架的使用方式和實(shí)現(xiàn)思路,同時(shí)也非常感謝 dooring可視化團(tuán)隊(duì) 各位大佬們的辛勤付出。

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

dooringx

可視化搭建框架基本使用和技術(shù)實(shí)現(xiàn)

為了讓大家更好的理解可視化搭建框架,我這里舉幾個(gè)形象的例子:

  1. antd —— antd-pro

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

我們都知道 antd 是流行的前端組件庫(kù),那么基于它上層封裝的管理后臺(tái) antd-pro 就是它的上層應(yīng)用。

  1. GrapesJS —— craft.js

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

GrapesJS 是一款國(guó)外的頁(yè)面編輯器框架(詳細(xì)介紹可參考我之前的文章 這款國(guó)外開(kāi)源框架, 讓你輕松構(gòu)建自己的頁(yè)面編輯器) ,那么 craft.js 就是它的上層應(yīng)用框架。

  1. dooringx-lib —— dooringx

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

dooringx

dooringx-lib 是一款可視化搭建框架,同理 dooringx 就是基于 dooringx-lib 的可視化編輯器。

之所以要介紹它們的區(qū)別,是因?yàn)橹坝泻芏嗯笥褜?duì)這塊概念理解的不是很清晰,在了解了可視化搭建框架 的 “內(nèi)涵” 之后,我們開(kāi)始今天的核心內(nèi)容。

1.技術(shù)棧

在分享框架實(shí)現(xiàn)思路之前當(dāng)然要自報(bào)家門(mén),框架實(shí)現(xiàn)上我們還是采用熟悉的 React 生態(tài),移動(dòng)端組件庫(kù)采用的眾安團(tuán)隊(duì)的 zarm,編輯器應(yīng)用層采用的 antd,至于其他的比如拖拽參考線,狀態(tài)管理,插件機(jī)制等都是我們團(tuán)隊(duì)大佬自研的方案。如果你是 vue 或者其他技術(shù)棧為主的團(tuán)隊(duì),也可以參考實(shí)現(xiàn)思路,相信也會(huì)對(duì)你有一定的啟發(fā)。

2.基本使用方式

在開(kāi)始深入之前我們先看看如何使用這款框架,我們只需要按照如下方式即可安裝使用:

npm/yarn install dooringx-lib

同時(shí)我們還提供了基礎(chǔ)的使用demo,方便大家在自己的工程中快速上手:

# 克隆項(xiàng)目# cnpmjsgit clone https://github.com.cnpmjs.org/H5-Dooring/dooringx.git# orgit clone https://github.com/H5-Dooring/dooringx.git# 進(jìn)入項(xiàng)目目錄cd dooringx# 安裝依賴yarn install# 啟動(dòng)基礎(chǔ)示例yarn start:example# 啟動(dòng) dooringx-libyarn start# 啟動(dòng) dooringx doc 文檔yarn start:docyarn build

demogithub 項(xiàng)目如下:

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

github地址: https://github.com/H5-Dooring/dooringx

在了解完使用方式之后,我們來(lái)看看基本架構(gòu)和實(shí)現(xiàn)思路。

3.dooringx-lib基礎(chǔ)架構(gòu)和工作機(jī)制

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

上圖就是我根據(jù)目前 dooringx-lib 的項(xiàng)目架構(gòu)梳理的架構(gòu)圖,基本包含了搭建化編輯框架的大部分必備模塊。為了保證框架的靈活性,我們還可以按需安裝對(duì)應(yīng)的功能組件,開(kāi)發(fā)自定義的組件等。如下是一個(gè)基本的導(dǎo)入案例:

import { RightConfig, Container, useStoreState, innerContainerDragUp, LeftConfig, ContainerWrapper, Control,} from 'dooringx-lib';

我們將整個(gè)框架拆分成了不同的模塊,這些模塊既相互獨(dú)立又可以相互關(guān)聯(lián)。完整的工作流程如下:

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

由上圖可以看出,我們只需要擁有基礎(chǔ)的業(yè)務(wù)研發(fā)能力,就可以借助 dooringx-lib 構(gòu)建一個(gè)屬于自己的搭建平臺(tái),就好比任何程序的本質(zhì): 數(shù)據(jù)邏輯

4.dooringx-lib插件開(kāi)發(fā)

接下來(lái)我會(huì)和大家分享 dooringx-lib 的插件開(kāi)發(fā)方式和具體實(shí)現(xiàn)(如何導(dǎo)入插件,如何編寫(xiě)組件,如何注冊(cè)函數(shù)等),如果大家感興趣的話也可以跟著下面的方式實(shí)踐一下。

4.1 如何導(dǎo)入組件

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

我們?cè)谏蠄D可以看到左側(cè)是我們的組件物料區(qū),分為基礎(chǔ)組件,媒體組件,可視化組件,它們的添加會(huì)統(tǒng)一放在 LeftRegistMap 數(shù)組中來(lái)管理,其基本結(jié)構(gòu)如下:

const LeftRegistMap: LeftRegistComponentMapItem[] = [ { type: 'basic', // 組件類別 component: 'button', // 組件名稱 img: 'icon-anniu', // 組件icon displayName: '按鈕', // 組件中文名 urlFn: () => import('./registComponents/button'), // 注冊(cè)回調(diào) },];

左側(cè)組件支持同步導(dǎo)入或者異步導(dǎo)入。

如果需要異步導(dǎo)入組件,則需要填寫(xiě) urlFn,需要一個(gè)返回 promise 的函數(shù)。也可以支持遠(yuǎn)程載入組件,只要 webpack 配上即可。

如果需要同步導(dǎo)入組件,則需要將組件放入配置項(xiàng)的 initComponentCache 中,這樣在載入時(shí)便會(huì)注冊(cè)進(jìn) componentRegister 里。

initComponentCache: { modalMask: { component: MmodalMask }, },

4.2 如何定制左側(cè)面板

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

左側(cè)面板傳入 leftRenderListCategory 即可。

leftRenderListCategory: [ {type: 'basic',icon: <HighlightOutlined />,displayName: '基礎(chǔ)組件', }, {type: 'xxc',icon: <ContainerOutlined />,custom: true,customRender: <div>我是自定義渲染</div>, },],

type 是分類,左側(cè)組件顯示在哪個(gè)分類由該字段決定。icon 則是左側(cè)分類小圖標(biāo)(如上圖所示)。當(dāng) customtrue 時(shí),可以使用 customRender 自定義渲染。

4.3 開(kāi)發(fā)一個(gè)自定義的可視化組件

組件需要導(dǎo)出一個(gè)由 ComponentItemFactory 生成的對(duì)象:

const MButton = new ComponentItemFactory( 'button', '按鈕', {style: [ createPannelOptions<FormMap, 'input'>('input', { receive: 'text', label: '文字', }),],animate: [createPannelOptions<FormMap, 'animateControl'>('animateControl', {})],actions: [createPannelOptions<FormMap, 'actionButton'>('actionButton', {})], }, {props: { ... text:'x.dooring'// input配置項(xiàng)組件接收的初始值}, }, (data, context, store, config) => {return <ButtonTemp data={data} store={store} context={context} config={config}></ButtonTemp>; }, true);export default MButton;

其中第一個(gè)參數(shù)為組件注冊(cè)名,第二個(gè)參數(shù)用來(lái)展示使用。

第三個(gè)參數(shù)用來(lái)配置右側(cè)面板的配置項(xiàng)組件。其中鍵為右側(cè)面板的分類,值為配置項(xiàng)組件數(shù)組。

第四個(gè)參數(shù)會(huì)配置組件的初始值,特別注意的是,制作組件必須要有初始寬度高度(非由內(nèi)容撐開(kāi)),否則會(huì)在適配時(shí)全選時(shí)產(chǎn)生問(wèn)題。

這個(gè)初始值里有很多有用的屬性,比如fixed代表使用固定定位,可以結(jié)合配置項(xiàng)更改該值,使得組件可以fixed定位。

還有 canDrag 類似于鎖定命令,鎖定的元素不可拖拽。

初始值里的 rotate 需要個(gè)對(duì)象,value 代表旋轉(zhuǎn)角度,canRotate 代表是否可以操作旋轉(zhuǎn)。(0.7.0版本開(kāi)始支持)

第五個(gè)參數(shù)是個(gè)函數(shù),你將獲得配置項(xiàng)中的 receive 屬性(暫且都默認(rèn)該配置為receive)傳來(lái)的配置,比如上例中 receive 的是 text,則該函數(shù)中 data 里會(huì)收到該字段。

context 一般只有 previewedit,用來(lái)進(jìn)行環(huán)境判斷。

config 可以拿到所有數(shù)據(jù),用來(lái)制作事件時(shí)使用。

第六個(gè)參數(shù) resize 是為了判斷是否能進(jìn)行縮放,當(dāng)為 false 時(shí),無(wú)法進(jìn)行縮放。

第七個(gè)參數(shù) needPosition,某些組件移入畫(huà)布后會(huì)默認(rèn)采取拖拽的落點(diǎn),該配置項(xiàng)默認(rèn)為 true, 就是需要拖拽的位置,為 false 時(shí)將使用組件自身 topleft 定位來(lái)放置。

4.4 事件注冊(cè)

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

  1. 注冊(cè)時(shí)機(jī)

事件可以細(xì)分為 注冊(cè)時(shí)機(jī)函數(shù),組件內(nèi)可以通過(guò) hook 的方式來(lái)實(shí)現(xiàn)注冊(cè)時(shí)機(jī):

useDynamicAddEventCenter(pr, `${pr.data.id}-init`, '初始渲染時(shí)機(jī)'); //注冊(cè)名必須帶id 約定!useDynamicAddEventCenter(pr, `${pr.data.id}-click`, '點(diǎn)擊執(zhí)行時(shí)機(jī)');

useDynamicAddEventCenter 第一個(gè)參數(shù)是 render 的四個(gè)參數(shù)組成的對(duì)象。第二個(gè)參數(shù)是注冊(cè)的時(shí)機(jī)名,必須跟 id 相關(guān),這是約定,否則多個(gè)組件可能會(huì)導(dǎo)致名稱沖突,并且方便查找該時(shí)機(jī)。

注冊(cè)完時(shí)機(jī)后,我們需要將時(shí)機(jī)放入對(duì)應(yīng)的觸發(fā)位置上,比如這個(gè) button 的點(diǎn)擊執(zhí)行時(shí)機(jī)就放到 onclick 中:

<Button onClick={() => {eventCenter.runEventQueue(`${pr.data.id}-click`, pr.config); }}> x.dooring</Button>

其中第一個(gè)參數(shù)則為注冊(cè)的時(shí)機(jī)名,第二個(gè)為 render 函數(shù)中最后一個(gè)參數(shù) config

  1. 函數(shù)注冊(cè)

函數(shù)由組件拋出,可以加載到事件鏈上。比如,注冊(cè)個(gè)改變文本函數(shù),那么我可以在任意組件的時(shí)機(jī)中去調(diào)用該函數(shù),從而觸發(fā)該組件改變文本。

函數(shù)注冊(cè)需要放入 useEffect 中,在組件卸載時(shí)需要卸載函數(shù)!否則會(huì)導(dǎo)致函數(shù)越來(lái)越多。

useEffect(() => {const functionCenter = eventCenter.getFunctionCenter();const unregist = functionCenter.register( `${pr.data.id} 改變文本函數(shù)`, async (ctx, next, config, args, _eventList, iname) => { const userSelect = iname.data; const ctxVal = changeUserValue( userSelect['改變文本數(shù)據(jù)源'], args, '_changeval', config, ctx ); const text = ctxVal[0]; setText(text); next(); }, [ { name: '改變文本數(shù)據(jù)源', data: ['ctx', 'input', 'dataSource'], options: { receive: '_changeval', multi: false, }, }, ]);return () => { unregist();};}, []);

函數(shù)中參數(shù)與配置見(jiàn)后面的函數(shù)開(kāi)發(fā)。

4.5 右側(cè)面板開(kāi)發(fā)

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

為了開(kāi)發(fā)自定義的右側(cè)屬性面板,我們只要將開(kāi)發(fā)的組件配成一個(gè)對(duì)象放入 initFormComponents 即可。為了良好的開(kāi)發(fā)體驗(yàn),需要定義個(gè) formMap 類型:

export interface FormBaseType { receive?: string;}export interface FormInputType extends FormBaseType { label: string;}export interface FormActionButtonType {}export interface FormAnimateControlType {}export interface FormMap { input: FormInputType; actionButton: FormActionButtonType; animateControl: FormAnimateControlType;}

formMap 的鍵名就是 initFormComponents 鍵名,formMap 的值對(duì)應(yīng)組件需要收到的值。

input 組件為例,FormInputType 此時(shí)有2個(gè)屬性: label, receive

那么在開(kāi)發(fā)該組件時(shí),props 會(huì)收到:

interface MInputProps { data: CreateOptionsRes<FormMap, 'input'>; current: IBlockType; config: UserConfig;}

也就是 dataformMap 類型,而 current 是當(dāng)前點(diǎn)擊的組件,config 就不用說(shuō)了。

還記得在左側(cè)組件開(kāi)發(fā)中的第三個(gè)參數(shù)嗎?這樣就都關(guān)聯(lián)起來(lái)了:

style: [ createPannelOptions<FormMap, 'input'>('input', { receive: 'text', label: '文字' })],

createPannelOptions 這個(gè)函數(shù)的泛型里填入對(duì)應(yīng)的組件,將會(huì)給收到的配置項(xiàng)良好的提示。

在配置項(xiàng)組件里所要做的就是接收組件傳來(lái)的配置項(xiàng),然后去修改 current 的屬性:

function MInput(props: MInputProps) { const option = useMemo(() => {return props.data?.option || {}; }, [props.data]); return (<Row style={{ padding: '10px 20px' }}> <Col span={6} style={{ lineHeight: '30px' }}> {(option as any)?.label || '文字'}: </Col> <Col span={18}> <Input value={props.current.props[(option as any).receive] || ''} onChange={(e) => { const receive = (option as any).receive; const clonedata = deepCopy(store.getData()); const newblock = clonedata.block.map((v: IBlockType) => { if (v.id === props.current.id) { v.props[receive] = e.target.value; } return v; }); store.setData({ ...clonedata, block: [...newblock] }); }} ></Input> </Col></Row> );}

由于可以很輕松的拿到 store,所以可以在任意地方進(jìn)行修改數(shù)據(jù)。

將組件的 value 關(guān)聯(lián) current 的屬性,onChange 去修改 store,這樣就完成了個(gè)雙向綁定。

注意:如果你的右側(cè)組件需要用到 block 以外的屬性,可能需要去判斷是否處于彈窗模式。

4.6 自定義右鍵菜單

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

右鍵菜單可以進(jìn)行自定義:

// 自定義右鍵const contextMenuState = config.getContextMenuState();const unmountContextMenu = contextMenuState.unmountContextMenu;const commander = config.getCommanderRegister();const ContextMenu = () => { const handleclick = () => {unmountContextMenu(); }; const forceUpdate = useState(0)[1]; contextMenuState.forceUpdate = () => {forceUpdate((pre) => pre 1); }; return (<div style={{ left: contextMenuState.left, top: contextMenuState.top, position: 'fixed', background: 'rgb(24, 23, 23)', }}> <div style={{ width: '100%' }} onClick={() => { commander.exec('redo'); handleclick(); }} > <Button>自定義</Button> </div></div> );};contextMenuState.contextMenu = <ContextMenu></ContextMenu>;

先拿到 contextMenuState,contextMenuState 上有個(gè) unmountContextMenu 是關(guān)閉右鍵菜單方法。所以在點(diǎn)擊后需要調(diào)用關(guān)閉。同時(shí)上面的 lefttop 是右鍵的位置。另外,我們還需要在組件內(nèi)增加強(qiáng)刷,賦值給 forceUpdate,用于在組件移動(dòng)時(shí)進(jìn)行跟隨。

4.7 表單驗(yàn)證提交思路

前端:從零開(kāi)發(fā)一款可視化搭建框架(前端可視化框架有哪些)

表單驗(yàn)證提交有非常多的做法,因?yàn)閿?shù)據(jù)全部是聯(lián)通的,或者直接寫(xiě)個(gè)表單組件也可以。在不使用表單組件時(shí),簡(jiǎn)單的做法是為每個(gè)輸入組件做個(gè)驗(yàn)證函數(shù)與提交函數(shù)。這樣是否驗(yàn)證就取決于用戶的選取,而拋出的輸入可以讓用戶選擇放到哪,并由用戶去命名變量。

在點(diǎn)擊提交按鈕時(shí),調(diào)用所有組件的驗(yàn)證函數(shù)與提交函數(shù),使其拋給上下文,再通過(guò)上下文聚合函數(shù)聚合成對(duì)象,最后可以通過(guò)發(fā)送函數(shù)發(fā)送給對(duì)應(yīng)后端,從而完成整個(gè)流程。我們可以在 dooringx 中試下這個(gè)demo。

另一種方式是可以專門(mén)寫(xiě)個(gè)提交按鈕,固定了參數(shù),以及部分規(guī)則,比如規(guī)定在頁(yè)面中的所有表單都會(huì)被收集提交。

那么我們可以利用數(shù)據(jù)源,將所有表單輸出內(nèi)容自動(dòng)提交給數(shù)據(jù)源,最后的提交按鈕按數(shù)據(jù)源規(guī)定格式的key 提取,發(fā)送給后端。

后期規(guī)劃

后期我們還會(huì)在產(chǎn)品功能方面持續(xù)迭代優(yōu)化,如果大家有好的建議, 也可以隨時(shí)和我們交流, 也歡迎在 github 上積極提 issue

如果大家對(duì)可視化搭建或者低代碼/零代碼感興趣,也可以參考我往期的文章或者在評(píng)論區(qū)交流你的想法和心得,歡迎一起探索前端真正的技術(shù)。

github: dooringx | 快速高效搭建可視化拖拽平臺(tái)
團(tuán)隊(duì):Dooring可視化團(tuán)隊(duì)

更多推薦

  • 如何設(shè)計(jì)可視化搭建平臺(tái)的組件商店?
  • 從零設(shè)計(jì)可視化大屏搭建引擎
  • 從零使用electron搭建桌面端可視化編輯器Dooring
  • (低代碼)可視化搭建平臺(tái)數(shù)據(jù)源設(shè)計(jì)剖析
  • 從零搭建一款PC頁(yè)面編輯器PC-Dooring
  • 如何搭積木式的快速開(kāi)發(fā)H5頁(yè)面?

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2024年7月5日 下午7:39
下一篇 2024年7月5日 下午7:50

相關(guān)推薦

  • 有沒(méi)有好用的低代碼平臺(tái),支持本地私有化部署的?看這里(如何使用低代碼平臺(tái))

    文章開(kāi)頭,首先和大家簡(jiǎn)單分享一下:本地部署是個(gè)啥,以及為什么我們需要本地部署?希望對(duì)大家有所幫助! 一、何為本地部署? 簡(jiǎn)單而言,本地部署就是:將服務(wù)器部署在企業(yè)內(nèi)部,公司數(shù)據(jù)儲(chǔ)存…

    科研百科 2024年5月13日
    64
  • 中國(guó)科研項(xiàng)目結(jié)題報(bào)告

    中國(guó)科研項(xiàng)目結(jié)題報(bào)告 近年來(lái),中國(guó)在科技創(chuàng)新領(lǐng)域取得了令人矚目的成就。在人工智能、5G、新能源等領(lǐng)域,中國(guó)已經(jīng)成為全球最大的創(chuàng)新中心之一。在這些領(lǐng)域中,許多中國(guó)科研項(xiàng)目都取得了重要…

    科研百科 2025年3月31日
    2
  • 黨員發(fā)展流程繁瑣的原因

    黨員發(fā)展流程繁瑣的原因 黨員發(fā)展流程繁瑣的原因,是由于歷史和文化背景的影響,以及政治、經(jīng)濟(jì)、社會(huì)等方面的復(fù)雜關(guān)系所致。在傳統(tǒng)的黨員發(fā)展模式中,往往是由黨員的上級(jí)組織(通常是黨組織)…

    科研百科 2024年10月5日
    7
  • 小挑算不算科研項(xiàng)目

    小挑算不算科研項(xiàng)目? 小挑,也稱為小挑實(shí)驗(yàn),是一種常見(jiàn)的科研項(xiàng)目。它的目的是通過(guò)測(cè)試學(xué)生的智力,幫助他們更好地理解數(shù)學(xué)和科學(xué)概念。小挑實(shí)驗(yàn)通常由學(xué)?;蚪逃龣C(jī)構(gòu)組織進(jìn)行,并通常要求學(xué)…

    科研百科 2025年4月5日
    2
  • 培訓(xùn)項(xiàng)目管理中內(nèi)部營(yíng)銷(xiāo)和品牌建設(shè)的作用——以FT汽車(chē)公司為例-3

    2.2 內(nèi)部營(yíng)銷(xiāo)和品牌建設(shè)的理論概述 2.2.1 內(nèi)部營(yíng)銷(xiāo)概述 (1)內(nèi)部營(yíng)銷(xiāo)的定義 內(nèi)部營(yíng)銷(xiāo)理論誕生于19世紀(jì)(70s)末,至今已經(jīng)有30多年的發(fā)展史,該理論的產(chǎn)生,在學(xué)術(shù)界和管…

    2022年5月23日
    561
  • 科研項(xiàng)目預(yù)期社會(huì)經(jīng)濟(jì)效益

    科研項(xiàng)目預(yù)期社會(huì)經(jīng)濟(jì)效益 隨著科技的不斷發(fā)展,科研項(xiàng)目對(duì)社會(huì)經(jīng)濟(jì)的促進(jìn)作用也越來(lái)越顯著。一些科研項(xiàng)目不僅能夠幫助提高生產(chǎn)效率,還能夠創(chuàng)造大量的就業(yè)機(jī)會(huì),促進(jìn)經(jīng)濟(jì)發(fā)展。本文將介紹一些…

    科研百科 2024年10月21日
    8
  • 日喀則地區(qū)科研項(xiàng)目名單

    日喀則地區(qū)科研項(xiàng)目名單 日喀則地區(qū)位于中國(guó)西藏自治區(qū)的南部,是一個(gè)富有自然和文化資源的地區(qū)。近年來(lái),該地區(qū)一直致力于推動(dòng)科學(xué)研究和發(fā)展,因此有許多科研項(xiàng)目在該地區(qū)進(jìn)行。 以下是一些…

    科研百科 2025年4月8日
    2
  • 進(jìn)銷(xiāo)存管理軟件排名(進(jìn)銷(xiāo)存 管理 軟件)

    進(jìn)銷(xiāo)存管理軟件:幫助企業(yè)實(shí)現(xiàn)高效管理 隨著市場(chǎng)經(jīng)濟(jì)的不斷發(fā)展,企業(yè)的運(yùn)營(yíng)效率和管理水平越來(lái)越高,進(jìn)銷(xiāo)存管理成為了企業(yè)日常運(yùn)營(yíng)中不可或缺的一部分。進(jìn)銷(xiāo)存管理軟件的出現(xiàn),為企業(yè)提供了更…

    科研百科 2024年9月1日
    3
  • 廣州美院科研項(xiàng)目

    廣州美術(shù)學(xué)院科研項(xiàng)目 廣州美術(shù)學(xué)院一直注重科研項(xiàng)目的開(kāi)展,近年來(lái)更是推出了一系列備受關(guān)注的科研項(xiàng)目。這些項(xiàng)目旨在探索藝術(shù)新技術(shù)、新形式,提高學(xué)校的藝術(shù)水平,同時(shí)也為藝術(shù)家提供更多的…

    科研百科 2025年2月24日
    3
  • 項(xiàng)目管理工具箱第二版pdf

    項(xiàng)目管理工具箱第二版pdf 項(xiàng)目管理工具箱是一款非常重要的項(xiàng)目管理工具,可以幫助項(xiàng)目管理人員更好地管理項(xiàng)目進(jìn)度,資源,風(fēng)險(xiǎn)等。第二版項(xiàng)目管理工具箱是最新的版本,它提供了更多的功能和…

    科研百科 2024年11月16日
    6