從Rax+DX到React,一次跨端元件重寫的AI提效探索

阿里妹導讀
本文基於M站首頁重構專案中的一個真實需求,講述如何藉助 AI程式設計工具 Cursor + 結構化 Prompt 設計,完成從 Rax 到 React 的元件遷移、DX 到 React 的跨端重寫,並實現業務邏輯最佳化與工程規範落地的全過程。
一、背景
最近在進行M站(WAP)首頁專案重構時,遇到了一個頗為頭疼的問題:需要將原有的Rax框架工廠推薦瀑布流元件遷移到新的React框架專案中,同時還要把原本用DX框架實現的FactoryCard元件用React重寫。如果按傳統開發方式,這種跨框架、跨端的遷移工作往往要花費大量時間去理解跨端程式碼原有邏輯、適配新框架API、處理樣式相容等問題。
但這次我想試試用AI+Code(基於Cursor開發環境)來加速這個過程。事實證明,這確實是一次有趣的實踐,既有讓人驚喜的提效體驗,也暴露了一些需要人工把控的細節問題。
元件樣式如下:

二、挑戰
這次遷移面臨幾個核心挑戰:
  • 跨框架適配Rax和React雖然語法相似,但在一些細節上存在差異;
  • DX到React的跨端重寫原本的FactoryCard是用內部DX框架寫的,需要轉換為React+CSS實現,本身閱讀理解原有DX程式碼就非常耗時,更不要說將其轉化為React元件了;
  • 業務邏輯最佳化原有的篩選邏輯是兩級結構,這裡因為需要保持同步App的體驗,需要簡化為一級,但還要相容原有資料結構(改動現有服務端成本與副作用過大)。
老元件-二層篩選
新元件-一層篩選

  • 符合新專案規範遷移後的元件也需要滿足新的專案元件規範:例如響應式、RTL、無障礙等等
  • 工程化改造需要將API呼叫邏輯抽離原元件,適配新的工程專案,建立Mock資料體系,確保開發環境的穩定性。
三、AI輔助開發的完整流程
整個遷移過程就像是在拆解一臺複雜的機器,然後用新的零件重新組裝。Agent在這個過程中充當了一個經驗豐富的技師,能夠快速識別零件的對應關係,但具體的精細調校還需要人工來完成。
整體流程如下:

第一步:需求分析——明確遷移目標與約束條件

在專案開始前,我透過Prompt方式和AI首先明確了這次遷移的具體目標和限制條件:
提示詞
核心目標:● 將Rax框架的new-m-site專案中的MultiFloors元件遷移到fy25-m-site專案中去,重構為React框架● 重新命名為FactoryRecommendWaterfall元件,體現業務特性● 將DX原生元件用React+CSS重新實現● 簡化二級篩選為一級篩選,只需要subTab部分技術約束:● 必須保持資料結構的向後相容● 樣式需要從scss+rpx轉換為less+px● API呼叫需要抽離到服務層● 需要建立本地Mock資料系統● 符合fy25-m-site M站元件規範(RTL、響應式、無障礙)業務約束:● 移除點選Tab滾動到頂部的功能(產品要求)● 確保埋點元件MDotElement使用正確最後你先把遷移計劃寫一下給我,調整明確之後再改程式碼
這個階段的關鍵是讓AI完全理解專案背景和限制條件,避免後續的返工。
第二步:現有程式碼與框架分析——充分理解原有元件結構
接下來,我讓Agent提前深入分析與理解原有的程式碼結構和技術體系。這個階段我透過VSCode工作區功能同時打開了兩個專案,讓其能夠直接對比新老專案的模組程式碼進行分析

第三步:方案設計——共同討論與明確遷移技術方案

基於上述方案要求與專案程式碼分析,我協同Agent共同制定了詳細的遷移技術方案,這裡的方案設計尤其重要的,還是需要我們仔細的校驗與完善,好的規劃與設計會大大提高Agent最後生成的元件程式碼準確性和完整性
Agent設計的計劃
## MultiFloors 元件遷移計劃### 📋 **遷移概況**-**源元件**`new-m-site/src/components/MultiFloors` (Rax框架)-**目標元件**`fy25-m-site/src/components/FactoryRecommendWaterfall` (React框架)-**主要變更**: Rax → React,介面呼叫抽離,保持邏輯和樣式一致### 🏗️ **目錄結構規劃**```fy25-m-site/src/components/FactoryRecommendWaterfall/├── index.tsx                    # 主元件檔案├── index.scss                   # 樣式檔案 (遷移自原元件)├── Tab/                         # Tab子元件目錄│   ├── index.tsx               # Tab元件 (只保留subTab部分)│   └── index.scss              # Tab樣式└── types.ts                    # TypeScript型別定義```### 🔄 **核心改動清單**#### 1. **框架遷移 (Rax → React)**- ✅ `View` → `div`- ✅ `Text` → `span` 或合適的HTML標籤- ✅ `createElement` → React的 `createElement`- ✅ Rax hooks → React hooks (已經是相同的)#### 2. **介面呼叫抽離**- ✅ 將以下介面呼叫遷移到 `services/api.ts`:  - `initTabs()` → `getMultiFloorsTabs()`  - `getResultList()` → `getMultiFloorsData(dataParams)`- ✅ 使用 `gatewayRequest` 替代直接的 `axios` 呼叫- ✅ 保持相同的請求引數和資料結構#### 3. **元件入參最佳化**- ✅ 新增 `tabId` 作為必需的入參- ✅ 支援外部傳入初始tab配置- ✅ 元件介面定義:```typescriptinterface FactoryRecommendWaterfallProps {  tabId: string;           // 必需引數  className?: string;      // 可選樣式類名  onTabChange?: (tabItem: any, currentSub?: string) => void; // 可選回撥}```#### 4. **Tab元件簡化**- ✅ 只保留 `subTab` 部分的功能- ✅ 移除多層級tab,只支援一層篩選- ✅ 遷移相關樣式到React元件#### 5. **DxRender處理**- ✅ 將 `<DxRender />` 呼叫註釋掉- ✅ 添加註釋說明需要替換為React元件- ✅ 保留資料結構供後續React元件使用#### 6. **樣式遷移**- ✅ 保持原有樣式不變- ✅ 調整Rax特有的樣式類名 (如 `.rax-text-v2`)- ✅ 確保響應式佈局正常工作#### 7. **Hooks和邏輯保持**- ✅ `useOnScreen` hook保持不變- ✅ 滾動載入邏輯保持不變- ✅ 分頁和篩選邏輯保持不變- ✅ 粘性tab定位邏輯保持不變### 📝 **介面遷移詳情**#### **新增API方法** (在 `services/api.ts` 中)```typescript// 獲取多樓層tabs配置exportconst getMultiFloorsTabs = async () => {  return await gatewayRequest({    query: { modelId: '10161' }  });};// 獲取多樓層資料列表exportconst getMultiFloorsData = async (params: DataParams) => {  return await gatewayRequest({    query: {      modelId: '10162',      ...params,      pageSize: 10,      endpoint: 'wap',    }  });};```### 🎯 **驗收標準**1. ✅ 元件能夠正常渲染和互動2. ✅ Tab切換功能正常,支援一層篩選3. ✅ 滾動載入功能正常4. ✅ 樣式與原元件保持一致5. ✅ 介面呼叫正常,資料展示正確6. ✅ DxRender部分已註釋,不影響元件執行7. ✅ 元件接受 `tabId` 引數並正常工作### ⚠️ **注意事項**- DxRender元件呼叫將被註釋,需要後續替換為React元件- 保持原有的模板處理邏輯,供React元件後續使用- Tab元件簡化為單層,如需要多層可後續擴充套件- 樣式單位使用rpx,確保移動端適配正常---**請確認此遷移計劃是否符合您的要求,我將根據您的反饋調整後開始實施程式碼遷移。**

第四步:分步驟實施

按照上述既定技術方案,允許Agent開始著手進行具體的遷移實施工作,以下都是擷取的部分Agent生成的具有代表性的程式碼片段:

4.1 基礎框架轉換——從Rax到React

// Rax版本核心結構import { createElement, useEffect, useState, useRef } from'rax';importViewfrom'rax-view';constMultiFloors = () => {return (<ViewclassName="Grid-cell u-full"><ViewclassName="sticky-tab"><Tabtabs={tabs}onChange={onTabChange} /></View>      {dxData.moduleList?.map((item) => (<DxRenderkey={item.data.action}data={item.data}templateDTO={templateDTO} />      ))}</View>  );};// React版本轉換結果importReact, { useEffect, useState } from'react';constFactoryRecommendWaterfallReact.FC<FactoryRecommendWaterfallProps> = (props) => {return (<divclassName="factory-recommend-waterfall"><divclassName="sticky-tab"><Tabtabs={tabs}onChange={handleTabChange} /></div>      {dxData.moduleList?.map((item, index) => (<FactoryCardkey={item?.data?.action}data={item?.data}index={index} />      ))}</div>  );};
這一步驟完成後,其實整體瀑布流的容器佈局已經基本搞定了(確實有點出乎意料的順利),剩下來就是將原先DX渲染的FactoryCard部分搞定(即圖中的佔位部分):

4.2 跨端元件重寫——從DX到React

這部分工作其實也是我想象中對AI最大的挑戰,也是工作量最為集中的部分,需要將DX框架程式碼轉換為React元件程式碼,這裡我嘗試藉助之前首頁雙端程式碼生成的DX知識庫來讓Agent學習後進行轉換:
指導AI生成轉換方案
下面我需要生成最核心的FactoryCard來把替換臨時渲染佔位內容。這裡的轉換邏輯是這樣的:1. 原來的Card是DX框架寫的,這裡你需要參考“@DX-generate-guide.md”這篇文件獲取DX框架知識2. 我給你DX程式碼,你將其逆向轉化為React的Card元件,生成對應tsx和less3. 轉換方案先給我看一下這是對應FactoryCard的DX程式碼:<LinearLayoutwidth="match_parent"height="match_content"orientation="vertical"backgroundColor="#ffffff"paddingBottom="16"direction="@triple{@isRTL{}, 'RTL', 'LTR'}"><!--頭部資訊--><LinearLayoutwidth="match_parent"height="match_content"orientation="horizontal"paddingLeft="20"paddingRight="20"paddingTop="8"backgroundColor="#ffffff"onTap="@link{@data{}}"onBindData="@onBindData{@data{}}"direction="@triple{@isRTL{}, 'RTL', 'LTR'}"    ><!-- 公司Icon --><FrameLayoutwidth="46"height="43"        ><FrameLayoutwidth="42"height="42"cornerRadius="8"clipsToBounds="true"            ><ImageViewwidth="match_parent"height="match_parent"scaleType="fitCenter"cornerRadius="8"gravity="center"clipsToBounds="true"imageUrl="@triple{@data{companyLogo}, @data{companyLogo}, 'https://sc01.alicdn.com/kf/H59bcea42cbb74830829df99a64f0ed6a2.png'}"                /><Viewwidth="match_parent"height="match_parent"cornerRadius="8"borderColor="#DDDDDD"borderWidth="1"clipsToBounds="true"                /></FrameLayout><!--直播標需要右移4px--><ImageViewwidth="17"height="match_content"gravity="rightBottom"scaleType="fitCenter"imageUrl="@data{businessLogo}"visibility="@triple{@data{businessLogo},'visible','gone'}"            /></FrameLayout><LinearLayoutwidth="match_parent"height="match_content"marginLeft="8"orientation="vertical"        ><!-- 公司名 --><LinearLayoutwidth="match_parent"height="match_content"orientation="horizontal"            ><ListLayoutwidth="match_content"height="match_content"orientation="horizontal"listData="@data{nameIconList}"gravity="center"                ><ImageViewwidth="30"height="12"marginRight="4"scaleType="fitCenter"imageUrl="@subdata{}"                    /></ListLayout><TextViewwidth="match_parent"height="22"text="@data{companyName}"textColor="#222222"textSize="16"isBold="true"maxLines="1"lineBreakMode="end"weight="1"                /><Viewwidth="8"height="2"backgroundColor="#FFFFFF"gravity="center"                /><!--Ad--><TextViewwidth="25"height="16"text="Ad"textGravity="center"textSize="13"textColor="#888888"backgroundColor="#05000000"gravity="center"cornerRadius="4"visibility="@triple{@data{isP4P},'visible','gone'}"                /></LinearLayout><!-- 公司簡介第一行 --><LinearLayoutwidth="match_parent"height="match_content"marginTop="6"orientation="horizontal"            ><ListLayoutwidth="match_content"height="match_content"orientation="horizontal"listData="@data{detailIconList}"                ><ImageViewwidth="match_content"height="14"marginRight="4"scaleType="fitCenter"imageUrl="@subdata{}"                    /></ListLayout><ListLayoutwidth="match_content"height="14"orientation="horizontal"listData="@data{subtitleList}"                ><TextViewwidth="match_content"height="14"text="@subdata{}"textColor="#222222"textSize="11"maxLines="1"lineBreakMode="end"                    /></ListLayout></LinearLayout><!-- 公司簡介第二行 --><LinearLayoutwidth="match_parent"height="match_content"marginTop="8"orientation="horizontal"            ><TextViewwidth="match_content"height="14"text="@data{industryAuthTag[0]}"textColor="#222222"textSize="11"maxLines="1"lineBreakMode="end"visibility="@triple{@data{industryAuthTag[0]}, 'visible', 'gone'}"                /><TextViewwidth="match_content"height="14"text=" • "textColor="#222222"textSize="11"visibility="@triple{@data{industryAuthTag[1]}, 'visible', 'gone'}"                /><TextViewwidth="match_content"height="14"text="@data{industryAuthTag[1]}"textColor="#222222"textSize="11"maxLines="1"lineBreakMode="end"visibility="@triple{@data{industryAuthTag[1]}, 'visible', 'gone'}"                /></LinearLayout></LinearLayout></LinearLayout><FrameLayoutheight="12"width="match_parent"    /><ScrollerLayoutwidth="match_parent"height="match_content"orientation="horizontal"showIndicator="false"    ><LinearLayoutwidth="match_content"height="match_content"orientation="horizontal"paddingLeft="20"paddingRight="8"listData="@data{productList}"        ><LinearLayoutwidth="156"height="match_content"orientation="vertical"onBindData="@onBindData{@subdata{}}"onTap="@link{@subdata{}}"            ><FrameLayoutwidth="144"height="144"cornerRadius="8"                ><ImageViewwidth="match_parent"height="match_parent"imageUrl="@subdata{image}"                    /><ImageViewwidth="match_parent"height="match_parent"imageUrl="https://sc01.alicdn.com/kf/H0b5abe3843d3493cb57ccb7d20217320D.png"                    /></FrameLayout><Viewheight="8"width="match_parent"                /><TextViewtext="@subdata{minPrice}"textSize="16"height="20"width="match_content"textColor="#222222"isBold="true"gravity="center"visibility="@triple{@subdata{minPrice}, 'visible', 'gone'}"                /><Viewheight="8"width="match_parent"visibility="@triple{@subdata{minPrice}, 'visible', 'gone'}"                /></LinearLayout></LinearLayout></ScrollerLayout></LinearLayout>
緊接著AI會給出他的轉換方案:

人工check後還是有一些細節問題,這裡透過二次對話完善:
二次對話完善方案
1. TextView用div,ImageView用div + img2. types放到父元件下面3. 存在onBindData的節點可以用MDotElement元件包裹下進行打點配置,onTap就是跳轉url4. 給你一個Mock測試資料:{"companyLogo""https://sc02.alicdn.com/kf/HTB1mWiVnkfb_uJjSsrb7626bVXaX.png","companyName""Shenzhen Quanyaohui Technology Co., Ltd.","businessLogo":"https://gw.alicdn.com/imgextra/i3/O1CN011u0HZD1lVRNPKwzTq_!!6000000004824-1-tps-48-48.gif","subtitleList": ["3 yrs"," • ","40+ 名員工"," • ","3,600+ ㎡"," • ","US$700,000+"        ],"action""...","eurl""product_1","pid""607_0000_8917","nameIconList": ["https://gw.alicdn.com/imgextra/i3/O1CN01sog9Zi1Ha4vsMZzkW_!!6000000000773-2-tps-90-36.png"        ],"detailIconList": ["https://gw.alicdn.com/imgextra/i4/O1CN01oR5RHV1sorSuIbjiH_!!6000000005814-2-tps-123-42.png"        ],"productList": [            {"image""https://s.alicdn.com/@sc04/kf/H385f60b975f94623aaaf44b7f9f1fb47y.jpg_220x220.jpg","productId""1600438021206","traceInfo": {"activityTraceId""homepageId:0$homepageType:factory$zoneId:0_$zoneType:home_factory_just4u$zoneIndex:0$moduleId:247802646$moduleType:manufacture$moduleIndex:0$elementId:1600438021206$elementType:product$elementIndex:0","clickParam""click_cid-3852#click_senseid-26426_500#pvid-8bd14d4b-d1c3-454a-9d5c-eaea2ebdd15e#realPos-0_0#id-1600438021206#pos-0#matchType-6#fatherId-null#isCurrentControl-baseline#cateId-127684037#cardId-247802646#isAIRefresh-false#triggerId-CN#rankScore-0.3845406174659729#score-0.95757860274634#","spm""a271p.page_home.just4u.0_0_0","name""home_factory_just4u"                },"minPrice""US$1.70","action""enalibaba://detail?id=1600438021206","p4p"true,"eurl""product_1","pid""607_0000_8917"            },           {...}        ]    }
最後AI進行了這次工作的總結,這裡也需要人為校驗下:

最終DX模組直接轉化為FactoryCard子元件並嵌入到上一步的父容器中:

然後這裡樣式問題透過對話讓AI進行最佳化,不過試了三輪都沒改對最後還是自己下場debug最佳化好了樣式,這一點還是略有失望~但整體瑕不掩瑜:

4.3 API層重構與Mock資料建設

// 服務層抽離exportconstgetFactoryRecommendWaterfallTabs = async () => {if (window.location.hostname === 'localhost') {const { mockTabs } = awaitimport('@/components/FactoryRecommendWaterfall/mock');return { tabs: mockTabs };  }// 生產環境API呼叫...};

4.4 業務邏輯最佳化

將原有的二級篩選簡化為一級,同時保持資料結構相容:
// Tab元件簡化處理constallSubsTabItem[] = [];tabs.forEach(tab => {if (tab.children && tab.children.length > 0) {    allSubs.push(...tab.children); // 將子標籤提升為主導航  }});setAllSubTabs(allSubs);

第五步:問題發現與修復

在實施過程中,遇到了一些典型問題,可以透過多輪對話嘗試讓AI協助進行了針對性修復:
樣式細節問題
// 問題:產品列表滾動邊界處理不當.factory-product-list {display: flex;padding-right12px;gap4px;  // 解決方案:用偽元素處理末尾間距(雖然不完美,但是也能解決問題)  &::after {content'';width12px;flex-shrink0;  }}
文字截斷問題
// 問題:多行文字截斷不生效.company-detail-row {.subtitle-list {flex1;min-width0.subtitle-text {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;    }  }}
CORS跨域問題
透過環境檢測自動切換Mock資料,徹底解決開發階段的跨域問題。
Tab互動體驗
移除滾動到頂部功能,避免使用者在瀏覽過程中的突兀體驗。
不過這裡其實樣式方面細節問題還不少,透過2-3輪對話AI也沒辦法完全改對,最後還是透過人工方式debug後修復,這部分可以說是不太順的一個地方吧,其他方面尤其是元件規範、命名、互動功能都還是挺滿意的

第六步:遷移完成總結

最後,Agent也會對此次的遷移過程進行總結,方便人為進行審查與最佳化:
總結
## ✅ 遷移完成總結我已經成功完成了 **MultiFloors** 元件從 `new-m-site` (Rax框架) 到 `fy25-m-site` (React框架) 的遷移,元件重新命名為 **FactoryRecommendWaterfall**### 🎯 **遷移成果**#### **1. 目錄結構**```fy25-m-site/src/components/FactoryRecommendWaterfall/├── index.tsx                    # 主元件(React版本)├── index.less                   # 主樣式檔案├── Tab/                         # Tab子元件│   ├── index.tsx               # Tab元件(簡化版,只保留subTab)│   └── index.less              # Tab樣式└── types.ts                    # TypeScript型別定義```#### **2. 核心變更完成**- ✅ **框架遷移**: Rax → React (View→div, Text→span)- ✅ **介面抽離**: 新增 `getFactoryRecommendWaterfallTabs()` 和 `getFactoryRecommendWaterfallData()`- ✅ **樣式遷移**: SCSS → Less,保持原有樣式效果- ✅ **Tab元件簡化**: 只保留subTab部分,支援單層篩選- ✅ **DxRender註釋**: 已註釋並新增佔位內容- ✅ **入參最佳化**: 支援必需的 `tabId` 引數#### **3. 新增檔案**-**useOnScreen Hook**`src/hooks/useOnScreen.ts` (React版本)-**API介面**: 在 `services/api.ts` 中新增FactoryRecommendWaterfall相關介面-**型別定義**: 完整的 TypeScript 介面定義#### **4. 元件使用示例**```tsximport FactoryRecommendWaterfall from '@/components/FactoryRecommendWaterfall';// 基礎使用<FactoryRecommendWaterfall tabId="your-tab-id" />  // 帶回調使用  <FactoryRecommendWaterfall   tabId="your-tab-id"  className="custom-class"  onTabChange={(tabItem, currentSub) => {    console.log('Tab changed:', tabItem, currentSub);  }}/>```### 🚀 **下一步工作**1.**DxRender替換**: 將註釋的 `DxRender` 元件替換為對應的React元件2.**測試驗證**: 在實際專案中測試元件功能3.**樣式調優**: 根據實際效果進行樣式微調元件現在已經可以正常使用,具備完整的tab切換、滾動載入、資料篩選功能,只需要後續替換DxRender元件即可完全投入使用!
四、AI提效分析:優勢與侷限並存
顯著優勢
1.模式識別能力強在本地DX知識庫加持下,能夠快速理解DX元件的佈局結構,並生成對應的Web實現方案。
2.工程化思維主動建議API抽離、Mock資料設計等工程化實踐。
3.持續學習與改進在迭代過程中,AI能夠記住之前的修改要求,後續的調整越來越精準。
4.多專案對比分析能力透過VSCode工作區(Workspace)功能,可以同時開啟新老專案,AI能夠直接對比分析兩個專案的程式碼結構,快速識別差異點和轉換規律。特別是針對我這種新老專案遷移重構的case來說,讓AI的上下文理解能力得到最大化利用,減少了反覆解釋專案背景的時間成本。
現實侷限
1.樣式細節把控不足特別是在文字截斷、佈局邊界、響應式適配等方面,經常需要人工調優。
2.業務邏輯理解深度有限對於一些隱含的業務規則,比如什麼情況下顯示AD標籤、如何處理資料異常等,理解不夠深入。
3.跨平臺差異感知不敏感在DX到Web的轉換中,對於一些平臺特性差異(如滾動行為、點選反饋等)考慮不夠周全。
五、可複用的遷移正規化
透過這次實踐,我總結出一套可複用的AI輔助元件遷移正規化:
標準化流程模板
1.預分析階段
  • 梳理源元件的功能邊界
  • 識別跨框架的關鍵差異點
  • 制定分步驟的遷移計劃
2.架構設計階段
  • API層抽離與設計
  • 資料流重構
  • 元件拆分策略
3.逐步實施階段
  • 基礎框架轉換
  • 樣式系統遷移
  • 業務邏輯適配
4.精細化調優階段
  • 樣式細節調整
  • 效能最佳化
  • 相容性測試
還有一些AICode實踐建議:

六、總結與展望
這次AI輔助的元件遷移實踐,讓我對AI+Code的開發模式有了更深的認識。AI就像一個高效的初級開發者,能夠快速完成基礎的編碼工作,但在業務理解、細節把控、效能最佳化等方面還需要資深開發者的指導。
從效率角度來看,這種協作模式確實帶來了顯著的提升:
  • 原本需要2-3天的遷移工作,壓縮到1天內完成;
  • 減少了80%的重複性編碼工作,人工編碼只涉及到了Prompt與樣式邏輯調優;
  • 提升了工程化實踐的規範性;
但更重要的是,這種模式改變了我們的工作方式。開發者的角色從"編碼者"更多地轉向了"架構師"和"審查者",我們需要:
  • 更好地定義需求和約束;
  • 更敏銳地識別和修正AI的偏差;
  • 更深入地思考系統的整體設計;
展望未來,隨著AI能力的不斷提升,我相信這種協作模式會越來越成熟。但技術的本質不會改變——好的軟體依然需要深入的業務理解、精細的技術把控和持續的最佳化迭代。
對於團隊而言,建議在類似的遷移專案中:
1.建立AI輔助開發的標準流程
2.積累常見問題的解決方案庫
3.培養開發者的AI協作能力
4.持續最佳化人機協作的工作模式
畢竟,最好的工具不是替代人的工具,而是能夠放大人的能力的工具。
全面安全保障:等保 2.0 解決方案
阿里雲安全整合雲平臺等保測評經驗和雲安全產品優勢,聯合等保諮詢、等保測評機構等合作資源,提供一站式等保測評服務,覆蓋等保定級、備案、建設整改及測評階段,助您快速透過等保測評。
點選閱讀原文檢視詳情。

相關文章