亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

輕量級(jí)雙層架構(gòu):用Schema與Renderer解耦表單開發(fā)

輕量級(jí)雙層架構(gòu):用Schema與Renderer解耦表單開發(fā) 1. 雙層架構(gòu)是被需求逼出來的不是設(shè)計(jì)出來的AutoForm 這個(gè)名字最早只是我們內(nèi)部團(tuán)隊(duì)一個(gè)工具倉庫的代號(hào)后來用的人越來越多才慢慢變成了一套可以獨(dú)立維護(hù)的輕量級(jí)雙層架構(gòu)。所謂輕量級(jí)不是指代碼少到只有幾百行而是它不給使用者預(yù)設(shè)一堆必須接受的框架所謂雙層就是我把表單開發(fā)里的幾乎所有問題收攏到兩個(gè)層面Schema 定義層和 Renderer 執(zhí)行層。這篇文章不打算把架構(gòu)吹得多漂亮重點(diǎn)講清楚這兩層各自解決什么問題、中間那條契約長什么樣以及我在真實(shí)項(xiàng)目里踩過的坑。如果你正在維護(hù)后臺(tái)管理系統(tǒng)、做低代碼平臺(tái)或者在糾結(jié)到底該不該選一個(gè)表單引擎這篇內(nèi)容應(yīng)該能給你一個(gè)比較務(wù)實(shí)的參考。1.1 我踩過的兩條老路先說最常見的做法每個(gè)表單頁面單獨(dú)寫 JSX字段、校驗(yàn)、聯(lián)動(dòng)邏輯全部堆在組件里。這種方式的優(yōu)點(diǎn)是直接、沒有魔法缺點(diǎn)是表單一多就失控。一個(gè)五十多個(gè)表單的后臺(tái)系統(tǒng)字段改動(dòng)是高頻需求比如某個(gè)下拉框的選項(xiàng)變了、兩個(gè)字段之間的聯(lián)動(dòng)規(guī)則改了、審核金額超過兩萬時(shí)要出現(xiàn)額外說明框。每一次改動(dòng)都要定位到對(duì)應(yīng)組件改完還得人工驗(yàn)證周邊邏輯。同一份客戶名稱字段的定義會(huì)散落在搜索頁、創(chuàng)建頁、詳情頁、編輯頁改一處漏三處是常態(tài)。另一條路是上低代碼表單引擎可視化拖拽、自動(dòng)生成代碼、內(nèi)置一堆高級(jí)組件。聽起來很美好真用起來卻經(jīng)常被綁架。引擎自帶的表達(dá)式語法要學(xué)數(shù)據(jù)流是引擎自己的規(guī)則組件版本跟著引擎走想嵌入一個(gè)自定義的業(yè)務(wù)組件還得看引擎給你留了多少縫隙。很多團(tuán)隊(duì)花了兩三周接入最后又花了兩三周把表單遷回普通組件因?yàn)榫€上報(bào)問題的速度已經(jīng)趕不上需求變更的速度了。這兩條路的本質(zhì)矛盾是一樣的表單的定義和表單的執(zhí)行被綁死在了一起。要么把定義寫進(jìn)代碼里導(dǎo)致處處復(fù)制要么把執(zhí)行塞進(jìn)引擎里導(dǎo)致處處受限。AutoForm 的雙層架構(gòu)就是為了解開這個(gè)結(jié)。1.2 雙層架構(gòu)的核心分界schema 是數(shù)據(jù)renderer 是代碼AutoForm 的整個(gè)架構(gòu)只有兩個(gè)概念。上層是 schema也就是表單定義。它是一份純數(shù)據(jù)描述有哪些字段、字段類型、布局順序、校驗(yàn)規(guī)則、聯(lián)動(dòng)條件。schema 本身沒有副作用不依賴某個(gè) UI 組件庫也不需要運(yùn)行環(huán)境。它可以放在前端項(xiàng)目里可以從后端接口下發(fā)也可以直接存在數(shù)據(jù)庫里。下層是 renderer也就是表單執(zhí)行器。它是一段代碼負(fù)責(zé)讀取 schema、找到對(duì)應(yīng)組件、管理字段值、觸發(fā)校驗(yàn)、執(zhí)行聯(lián)動(dòng)結(jié)果。renderer 可以有多個(gè)實(shí)現(xiàn)同一個(gè) schema 在表單頁、詳情頁、搜索頁里可以渲染出完全不同的界面。中間連接兩層的是一個(gè)非常簡(jiǎn)單的創(chuàng)建入口傳入 schema指定視圖類型附加運(yùn)行環(huán)境。這個(gè)入口返回一個(gè)表單實(shí)例實(shí)例上只掛幾個(gè)必要的方法。我把這兩層之間的契約控制得很小因?yàn)槠跫s越大使用者需要理解的東西就越多架構(gòu)也就越不容易保持輕量。我經(jīng)常給同事們打一個(gè)比方schema 是圖紙renderer 是施工隊(duì)。圖紙不關(guān)心施工隊(duì)用哪家的磚施工隊(duì)可以根據(jù)同一個(gè)圖紙蓋住宅樓、蓋辦公室、蓋臨時(shí)展廳。AutoForm 做的事情就是讓圖紙和施工隊(duì)保持獨(dú)立同時(shí)約定一張圖紙上每個(gè)符號(hào)的含義。層級(jí)內(nèi)容典型職責(zé)是否可運(yùn)行Schema 層字段、布局、校驗(yàn)、聯(lián)動(dòng)數(shù)據(jù)定義、跨端復(fù)用、后端下發(fā)否Renderer 層組件映射、值管理、事件驅(qū)動(dòng)界面渲染、表單交互、校驗(yàn)執(zhí)行是2. Schema 層只描述“長什么樣、要什么”不描述“怎么實(shí)現(xiàn)”schema 層的設(shè)計(jì)目標(biāo)不是做一個(gè)完整的領(lǐng)域建模語言而是提供一個(gè)夠用的表單描述協(xié)議。這個(gè)協(xié)議必須讓產(chǎn)品經(jīng)理能讀讓后端能生成讓前端能渲染讓測(cè)試能理解。AutoForm 的 schema 內(nèi)部統(tǒng)一用對(duì)象表示最外層固定包含 version 字段這樣以后協(xié)議演進(jìn)時(shí)有據(jù)可查。2.1 字段描述的基本協(xié)議每個(gè)字段由一個(gè)字段對(duì)象描述核心字段如下表。AutoForm 的組件注冊(cè)表里有一個(gè)字符串和組件的映射關(guān)系所以 schema 里只需要寫組件名不需要寫任何導(dǎo)入路徑或者組件對(duì)象。字段屬性類型說明namestring字段名提交時(shí)作為值的 keylabelstring展示給用戶看的標(biāo)簽componentstring組件注冊(cè)名例如 Input、NumberInputpropsobject傳給 UI 組件的額外參數(shù)rulesarray校驗(yàn)規(guī)則列表hiddenboolean初始是否隱藏disabledboolean初始是否禁用descriptionstring字段說明通常在詳情頁展示舉個(gè)例子一個(gè)很常規(guī)的訂單審核表單結(jié)構(gòu)大概長這樣{ version: 1.0, fields: [ { name: orderNo, label: 訂單號(hào), component: Input, props: { placeholder: 請(qǐng)輸入訂單號(hào) }, rules: [ { required: true, message: 訂單號(hào)不能為空 } ] }, { name: amount, label: 審核金額, component: NumberInput, props: { precision: 2 } }, { name: payType, label: 支付方式, component: Select, props: { options: [ { label: 在線支付, value: online }, { label: 線下轉(zhuǎn)賬, value: transfer }, { label: 退款沖抵, value: refund } ] } } ] }這里有個(gè)值得注意的設(shè)計(jì)決策schema 里的label、placeholder這類信息必須是純數(shù)據(jù)不參與任何邏輯判斷。邏輯判斷只圍繞name和value展開這樣 schema 才能被后端安全地解析和生成不會(huì)因?yàn)槟硞€(gè)字段被 UI 文案污染而影響業(yè)務(wù)邏輯。2.2 布局信息用二維數(shù)組表達(dá)很多表單描述協(xié)議會(huì)把布局打成樹形結(jié)構(gòu)比如柵格、分組、卡片層層嵌套。樹形結(jié)構(gòu)表達(dá)能力強(qiáng)但寫起來重處理起來也要遞歸。AutoForm 選擇了一個(gè)更樸素的方案layout 字段是一個(gè)二維數(shù)組。第一層是行第二層是這一行里的字段。{ layout: [ [orderNo], [amount, payType] ] }上面的 layout 表示第一行只有訂單號(hào)第二行是金額和支付方式并排。約定每個(gè)字段名在 layout 里最多出現(xiàn)一次沒出現(xiàn)在 layout 里的字段自動(dòng)按 fields 的聲明順序追加到末尾。這個(gè)設(shè)計(jì)有意犧牲了復(fù)雜嵌套能力換來了三個(gè)好處schema 肉眼可讀、后端生成邏輯簡(jiǎn)單、前端渲染只需要兩層循環(huán)。如果之后確實(shí)需要分組和卡片我在實(shí)踐中建議不要擴(kuò)展 layout 本身而是在 fields 外面加一個(gè)sections數(shù)組section 內(nèi)部再引用字段名。這樣舊的解析邏輯可以保持穩(wěn)定新能力只是增量不會(huì)破壞已有 schema。2.3 聯(lián)動(dòng)規(guī)則走聲明式不走腳本表單聯(lián)動(dòng)是最容易把架構(gòu)搞重的點(diǎn)。我看到不少方案在 schema 里塞 JavaScript 表達(dá)式運(yùn)行的時(shí)候用eval或者一個(gè)自定義解釋器去執(zhí)行。這么做功能很強(qiáng)大但隨之而來的是調(diào)試?yán)щy、安全風(fēng)險(xiǎn)、性能損耗。表達(dá)式的字符串寫在 JSON 里寫的時(shí)候沒語法高亮線上報(bào)錯(cuò)了你也很難定位是哪一段表達(dá)式出了問題。AutoForm 的取舍是只支持非常有限的聯(lián)動(dòng)原語。一個(gè)聯(lián)動(dòng)規(guī)則由三部分組成觸發(fā)源、觸發(fā)條件、動(dòng)作。比如支付方式等于退款沖抵時(shí)隱藏金額字段可以這樣描述{ relations: [ { source: payType, condition: { op: eq, value: refund }, action: { type: setVisibility, target: amount, visible: false } } ] }我最初只定義了三種動(dòng)作setVisibility、setDisabled、setValue。后來業(yè)務(wù)里遇到了需要重置字段值、聯(lián)動(dòng)清空、動(dòng)態(tài)修改選項(xiàng)的場(chǎng)景又增加了resetValue和updateProps。但直到今天AutoForm 的 rules 引擎也不支持任意表達(dá)式。如果你需要A 大于 100 且 B 不等于 x這種條件就拆成兩條 relation或者用一個(gè)自定義的判斷函數(shù)掛進(jìn)去。這個(gè)取舍讓核心包常年保持在小體積也讓 schema 可以安全地交給非前端團(tuán)隊(duì)維護(hù)。2.4 version 字段和 schema 校驗(yàn)schema 既然是數(shù)據(jù)它就會(huì)面臨版本演進(jìn)。AutoForm 在最外層強(qiáng)制要求 version 字段渲染器根據(jù) version 決定用哪個(gè)解析版本。我自己見過太多因?yàn)樽侄味x升級(jí)導(dǎo)致舊數(shù)據(jù)渲染崩潰的事故所以 version 就像數(shù)據(jù)庫表的版本號(hào)一樣必須顯式聲明。校驗(yàn)這部分AutoForm 內(nèi)置了一個(gè)輕量的 schema 校驗(yàn)器主要檢查四類問題字段 name 是否重復(fù)、layout 是否引用了不存在的字段、component 名稱是否有對(duì)應(yīng)注冊(cè)、rules 里的 required 和 pattern 是否合法。這層校驗(yàn)不查業(yè)務(wù)邏輯只查結(jié)構(gòu)健康度。每次從后端拉取 schema 時(shí)先跑一遍校驗(yàn)?zāi)茉阡秩厩熬蛿r截掉 80% 的配置錯(cuò)誤。3. Renderer 層同一份 schema三種渲染方式的復(fù)用實(shí)驗(yàn)如果說 schema 層是 AutoForm 的靜面renderer 層就是動(dòng)面。renderer 負(fù)責(zé)把同一份 schema 變成可交互的界面同時(shí)保持不同場(chǎng)景之間的行為一致。3.1 渲染器注冊(cè)表和創(chuàng)建入口AutoForm 的渲染器采用注冊(cè)表模式。每個(gè) renderer 對(duì)象包含一個(gè) view 標(biāo)識(shí)和一個(gè) render 方法通過AutoForm.register注冊(cè)進(jìn)去。創(chuàng)建表單實(shí)例時(shí)通過AutoForm.create指定 view 類型。這里你可以把 view 理解成使用者希望表單以什么形態(tài)出現(xiàn)的開關(guān)。AutoForm.register({ view: form, render: (schema, context) { return FormRenderer schema{schema} context{context} /; } }); const instance AutoForm.create(schema, { view: form, componentMap, value: initialValue, onChange: (nextValue) console.log(nextValue) });創(chuàng)建入口是兩層的唯一連接點(diǎn)。無論 renderer 內(nèi)部多復(fù)雜對(duì)外暴露的能力都收斂在一組方法上getValue、setValue、validate、reset。業(yè)務(wù)方不需要知道當(dāng)前是哪個(gè) renderer 在干活也不需要知道 schema 是怎么被解析的。3.2 form / detail / search 三種視圖渲染器我實(shí)際用得最多的三個(gè) view 分別是表單、詳情、搜索。表單和詳情兩個(gè) renderer 是同一個(gè)代碼倉庫里最互補(bǔ)的兩個(gè)實(shí)現(xiàn)。表單渲染器會(huì)把 layout 攤開成柵格每個(gè)字段渲染對(duì)應(yīng)的輸入組件同時(shí)掛上校驗(yàn)規(guī)則。詳情渲染器接同一份 schema把字段名映射成 label把字段值交給一個(gè) Format 函數(shù)格式化后輸出。也就是說同一個(gè)訂單號(hào)字段表單里是一個(gè)輸入框詳情里是一行只讀文本。這種一致性不是靠復(fù)制粘貼實(shí)現(xiàn)的而是因?yàn)閮烧吖蚕硗环?schema 定義。搜索渲染器稍微特殊一點(diǎn)。它不會(huì)渲染完整字段而是從 schema 里挑出searchable: true的字段。我在 schema 字段協(xié)議里加了searchable這個(gè)可選標(biāo)記目的是讓搜索條件跟表單字段天然保持同步。訂單號(hào)、客戶名這種高頻搜索條件在 schema 里標(biāo)上searchable搜索表單就自動(dòng)生成不用單獨(dú)維護(hù)另一套搜索字段定義。渲染器輸入組件校驗(yàn)規(guī)則布局支持主要用途form是是二維數(shù)組布局新增、編輯、審核detail否否label 對(duì)齊詳情展示、審批預(yù)覽search部分字段否簡(jiǎn)單橫向排列列表?xiàng)l件篩選3.3 自定義組件的統(tǒng)一接入?yún)f(xié)議AutoForm 不內(nèi)置任何 UI 組件所以組件接入?yún)f(xié)議是 renderer 層能否落地的關(guān)鍵。每個(gè)自定義組件只需要遵循一個(gè)簡(jiǎn)單的 props 契約接收value作為當(dāng)前值調(diào)用onChange傳出新值同時(shí)支持disabled、readOnly這類通用狀態(tài)。至于組件內(nèi)部是用什么 UI 庫實(shí)現(xiàn)的AutoForm 完全不關(guān)心。interface FieldComponentProps { name: string; value: unknown; onChange: (value: unknown) void; disabled?: boolean; readOnly?: boolean; [key: string]: unknown; } const MyAmountInput: React.FCFieldComponentProps ({ value, onChange, disabled, ...restProps }) { return input typetext value{value ?? } disabled{disabled} onChange{(e) onChange(e.target.value)} {...restProps} /; };這個(gè)協(xié)議雖然簡(jiǎn)單但要求組件必須是受控組件也就是值由外部傳入組件內(nèi)部不維護(hù)數(shù)據(jù)副本。我在推廣時(shí)遇到過很多組件天然是內(nèi)部維護(hù)狀態(tài)的改造起來有一定成本。這塊沒有更好的捷徑只能靠統(tǒng)一封裝層去兜底。建議團(tuán)隊(duì)在建組件庫時(shí)就把 value/onChange 契約納入規(guī)范否則后接 AutoForm 時(shí)要返工。4. “輕量級(jí)”是怎么取舍的我砍掉的重概念做架構(gòu)時(shí)最難的往往不是加功能而是決定砍掉什么。AutoForm 被稱為輕量級(jí)不是因?yàn)楣δ苌偎源a量小而是我主動(dòng)砍掉了四個(gè)容易讓架構(gòu)變重的設(shè)計(jì)。4.1 不內(nèi)置 UI 組件庫一開始有人建議直接把 Ant Design 或者 Element 封裝進(jìn) AutoForm這樣開箱即用。我拒絕了這條路線。內(nèi)置 UI 庫看起來方便實(shí)際上意味著 AutoForm 的生命周期被綁定在一個(gè)框架版本鏈路上。今天項(xiàng)目用的 AntD v4明天升級(jí) v5AutoForm 要么跟著升級(jí)要么成為一個(gè)兼容層黑洞。AutoForm 的做法是把組件映射交出來。外界通過 componentMap 傳入一個(gè){ Input, Select, DatePicker }對(duì)象schema 里的 component 字符串在這個(gè)映射表里查找對(duì)應(yīng)組件。組件屬于項(xiàng)目不屬于 AutoFormAutoForm 只提供查找規(guī)則和渲染流程。4.2 不做運(yùn)行時(shí)表達(dá)式引擎表單字段之間的依賴比如金額大于某個(gè)值時(shí)顯示額外字段、多選選中某項(xiàng)時(shí)修改另一項(xiàng)的 options這類需求一旦寫進(jìn)核心就收不住。完整的表達(dá)式引擎要處理語法解析、變量作用域、類型轉(zhuǎn)換、錯(cuò)誤堆棧哪怕只做 JS 的子集復(fù)雜度也會(huì)超過整個(gè)表單渲染流程。所以 AutoForm 選擇了聲明式 relations。條件判斷只支持eq、neq、gt、gte、in這五個(gè)操作符動(dòng)作只支持前文說的那五種。真遇到特別復(fù)雜的聯(lián)動(dòng)判斷我會(huì)建議業(yè)務(wù)方寫一個(gè)自定義 validator 或者自定義computeProps函數(shù)掛到 schema 上。這樣做誠實(shí)且可控核心永遠(yuǎn)不膨脹。4.3 不接管全局狀態(tài)很多表單框架會(huì)把數(shù)據(jù)狀態(tài)管理做進(jìn)內(nèi)核比如內(nèi)部維護(hù)一個(gè) store提供 get/set 方法再和 Redux、Zustand 打通。AutoForm 沒有這么做。值就是普通對(duì)象創(chuàng)建實(shí)例時(shí)傳入 initial value交互過程中由 onChange 把最新值拋回給外界狀態(tài)到底放在組件局部 state 還是全局 store 中由使用方自己決定。這個(gè)決策在很多人看來很偷懶但它幫我避開了大量數(shù)據(jù)同步問題。表單頁面里的值本來就該由頁面控制表單引擎適合做一個(gè)計(jì)算器不適合做賬本。4.4 不做模板編譯和代碼生成還有一種比較重的思路是把 schema 編譯成 React/Vue 代碼然后交付給項(xiàng)目。模板編譯要做代碼生成、語法轉(zhuǎn)換、依賴分析還要處理編譯產(chǎn)物和手寫代碼混合的邊界。AutoForm 只做運(yùn)行時(shí)解析不在構(gòu)建期碰任何代碼。schema 傳進(jìn)來組件直接渲染出來沒有中間產(chǎn)物因此任何環(huán)境都能用包括一些不支持編譯器的低代碼容器。5. 落地復(fù)盤一個(gè)訂單審核頁從 schema 定義到踩坑修復(fù)說了這么多設(shè)計(jì)不落地都是空談。我?guī)Т蠹彝暾咭槐?AutoForm 在實(shí)際項(xiàng)目里做訂單審核頁的過程順便復(fù)盤幾個(gè)我印象很深的坑。5.1 第一步定義訂單審核表單的 schema假設(shè)業(yè)務(wù)方提出的需求是審核員需要查看訂單號(hào)、客戶名稱、支付方式、審核金額、退款原因備注。當(dāng)支付方式選擇退款沖抵時(shí)必須顯示退款原因輸入框?qū)徍私痤~超過 20000 時(shí)備注字段變?yōu)楸靥睢_@份 schema 大概長這樣{ version: 1.0, layout: [ [orderNo, customerName], [payType, amount], [refundReason], [remark] ], fields: [ { name: orderNo, label: 訂單號(hào), component: Input }, { name: customerName, label: 客戶名稱, component: Input }, { name: payType, label: 支付方式, component: Select, props: { options: [ { label: 在線支付, value: online }, { label: 線下轉(zhuǎn)賬, value: transfer }, { label: 退款沖抵, value: refund } ] } }, { name: amount, label: 審核金額, component: NumberInput }, { name: refundReason, label: 退款原因, component: TextArea }, { name: remark, label: 審核備注, component: TextArea } ], relations: [ { source: payType, condition: { op: eq, value: refund }, action: { type: setVisibility, target: refundReason, visible: true } }, { source: amount, condition: { op: gt, value: 20000 }, action: { type: updateProps, target: remark, props: { rules: [ { required: true, message: 大額訂單必須填寫審核備注 } ] } } } ] }這里我特別強(qiáng)調(diào) layout 的作用。如果后端下發(fā)接口時(shí)把 JSON 字段順序做了排序前面的 field 數(shù)組順序變了布局也不會(huì)亂因?yàn)殇秩就耆?layout 為準(zhǔn)。這是一層防御性設(shè)計(jì)我們?cè)趯?shí)際聯(lián)調(diào)時(shí)多次從中受益。5.2 第二步注冊(cè)渲染器和組件表頁面?zhèn)冉尤氪a非常短。組件表里放的是項(xiàng)目自己的封裝組件AutoForm 只做渲染編排。const componentMap { Input: AppInput, Select: AppSelect, NumberInput: AppNumberInput, TextArea: AppTextArea, }; const Page () { const [instance, setInstance] useStateFormInstance | null(null); const [value, setValue] useState({}); useEffect(() { const inst AutoForm.create(orderSchema, { view: form, componentMap, value, onChange: setValue, }); setInstance(inst); }, []); const handleSubmit async () { const result await instance?.validate(); if (result?.pass) { // 提交 value } }; return ( div {instance?.render()} button onClick{handleSubmit}提交審核/button /div ); };這里的 FormInstance 接口是固定的renderer 換掉頁面代碼也不用改。比如同一個(gè)頁面需要做只讀審核預(yù)覽時(shí)不需要新建一頁只用把 view 換成detail再創(chuàng)建一次實(shí)例即可。5.3 現(xiàn)場(chǎng)遇到的三個(gè)坑組件 props 覆蓋、聯(lián)動(dòng)環(huán)、id 漂移第一個(gè)坑是組件 props 覆蓋。自定義組件通常有自己的 className、style、data-testid 這類屬性。最開始 renderer 會(huì)把 schema 里的 props 直接展開傳給組件結(jié)果項(xiàng)目里統(tǒng)一的下劃線樣式被 schema 里的props.style覆蓋了好幾個(gè)頁面樣式突然失真。排查鏈路倒是很清晰頁面樣式問題先看傳給組件的 props打印后發(fā)現(xiàn) schema 里的 props 與項(xiàng)目默認(rèn)屬性沖突。修復(fù)方案是在updateProps動(dòng)作之外加了一條規(guī)則組件協(xié)議里的通用屬性比如disabled、readOnly、hidden由 renderer 統(tǒng)一管理自定義 schema props 只允許放進(jìn)extraProps命名空間。這樣組件自身的約定屬性不會(huì)被外部配置隨意覆蓋。第二個(gè)坑是聯(lián)動(dòng)環(huán)。某個(gè)版本里兩個(gè)字段互相設(shè)置 disabled 狀態(tài)一個(gè)是A 被禁用時(shí) B 不禁用另一個(gè)是B 被禁用時(shí) A 不禁用再加上初始值配置沒做好導(dǎo)致渲染時(shí)聯(lián)動(dòng)反復(fù)觸發(fā)最后棧溢出。排查時(shí)我先在 relations 里打印執(zhí)行記錄發(fā)現(xiàn)一個(gè)問題updateProps動(dòng)作執(zhí)行后又會(huì)觸發(fā) source 字段的 watcher進(jìn)而再次執(zhí)行 relation。修復(fù)方式是兩個(gè)層面同時(shí)做。核心層增加執(zhí)行深度限制單次事件循環(huán)內(nèi)最多處理二十條聯(lián)動(dòng)鏈?zhǔn)褂脤用娼钩霈F(xiàn)兩個(gè)字段互相 setDisabled 這種循環(huán)關(guān)系在 schema 校驗(yàn)器里增加了環(huán)檢測(cè)?,F(xiàn)在 AutoForm 遇到循環(huán)關(guān)系時(shí)會(huì)在創(chuàng)建階段直接報(bào)錯(cuò)而不是等到運(yùn)行期才表現(xiàn)異常。第三個(gè)坑是詳情頁的 id 漂移。detail 渲染器為了實(shí)現(xiàn) label 和值一一對(duì)應(yīng)生成了一組基于字段名的 id。當(dāng)同一頁面有兩個(gè)相同 schema 實(shí)例時(shí)比如左右對(duì)比審核兩邊的 label 和值會(huì)錯(cuò)位。這個(gè)問題的根因是 id 沒有實(shí)例化作用域。后來我在創(chuàng)建入口增加了一個(gè) scopeId 參數(shù)所有內(nèi)部生成的 DOM id 都以 scopeId 為前綴這個(gè)問題才徹底消掉。5.4 排查鏈路回顧這三個(gè)坑讓我總結(jié)出一條經(jīng)驗(yàn)雙層架構(gòu)的問題大多數(shù)發(fā)生在契約邊緣而不是 schema 本身或 renderer 內(nèi)部。所以排查問題時(shí)要先問三個(gè)問題字段名是否存在于 schema組件是否注冊(cè)在 componentMap當(dāng)前 view 是否有對(duì)應(yīng)的 renderer 注冊(cè)把這三條走完一般能找到 80% 的根因。問題表現(xiàn)檢查順序常見根因組件沒渲染schema 字段名 - componentMapcomponent 字符串拼寫錯(cuò)誤樣式錯(cuò)亂組件通用屬性 - extraPropsprops 直接展開覆蓋聯(lián)動(dòng)卡死relation 環(huán)檢測(cè) - 執(zhí)行深度兩個(gè)字段互相設(shè)置狀態(tài)狀態(tài)不更新onChange 是否透?jìng)?- value 是否受控自定義組件內(nèi)部維護(hù)自己的 state值提交缺失字段是否 hidden 且未排除隱藏字段沒配 ignore 策略6. 雙層架構(gòu)的適用邊界以及它和輕量級(jí)工作流的關(guān)系架構(gòu)沒有絕對(duì)好壞只有適用邊界。做完 AutoForm 之后我越來越清楚什么場(chǎng)景該用它什么場(chǎng)景最好不要硬套。6.1 我建議使用 AutoForm 的場(chǎng)景最典型的場(chǎng)景是后臺(tái)管理系統(tǒng)尤其是表單數(shù)量多、字段相似度高、變更頻繁的團(tuán)隊(duì)。把 schema 從代碼里抽出來之后前端可以更快響應(yīng)產(chǎn)品改字段的需求產(chǎn)品經(jīng)理甚至可以直接改一份 JSON 文件發(fā)起 MR測(cè)試同學(xué)也能在提測(cè)前先自行校驗(yàn) schema 結(jié)構(gòu)。我第二個(gè)重點(diǎn)推薦的使用場(chǎng)景是動(dòng)態(tài)表單。比如表單模板由用戶配置或者表單內(nèi)容由后端按業(yè)務(wù)類型下發(fā)這種場(chǎng)景天生就需要 schema 與 renderer 分離。AutoForm 的 schema 是純 JSON后端可以基于權(quán)限、業(yè)務(wù)類型拼裝不同的字段集合前端只需要處理渲染和數(shù)據(jù)回傳不需要跟著每個(gè)業(yè)務(wù)類型寫死組件。跨端渲染也值得提。同一份訂單 schemaPC 后臺(tái)是表格布局移動(dòng)端審批 App 是縱向排列的卡片布局。移動(dòng)端備注欄更寬詳情頁更緊湊。因?yàn)?schema 與 UI 組件庫無關(guān)兩個(gè)端可以各自注冊(cè)自己的組件映射但字段名、校驗(yàn)規(guī)則、提交結(jié)構(gòu)完全一致。6.2 不建議強(qiáng)行上 AutoForm 的場(chǎng)景如果項(xiàng)目里只有三五個(gè)固定表單而且?guī)缀醪粫?huì)變動(dòng)我不建議引入 AutoForm。加一層抽象必然帶來理解成本直接寫組件反而更簡(jiǎn)單。復(fù)雜的動(dòng)態(tài)嵌套表單比如一個(gè)可以無限增加行、每行內(nèi)部又有子表結(jié)構(gòu)的矩陣場(chǎng)景AutoForm 的二維 layout 是撐不住的。這種場(chǎng)景更適合專門的數(shù)據(jù)網(wǎng)格方案。AutoForm 的價(jià)值是通用表單不是萬能編輯器。對(duì)實(shí)時(shí)協(xié)同編輯這類極端場(chǎng)景也有壓力。AutoForm 的 value 是整體對(duì)象多人同時(shí)編輯同一個(gè)表單時(shí)字段級(jí)合并沖突要外界自己處理。如果要做到 OT 或者 CRDT表單引擎本身不應(yīng)該是核心瓶頸而是你整體架構(gòu)里微不足道的一部分沒必要糾結(jié)在渲染層。6.3 雙層架構(gòu)只是輕量級(jí)工作流的底座最后聊一個(gè)讓我自己都覺得驚喜的延伸。AutoForm 最初只是做表單后來團(tuán)隊(duì)做審批流時(shí)發(fā)現(xiàn)一個(gè)簡(jiǎn)單的審核流程本質(zhì)上就是多個(gè) schema 節(jié)點(diǎn)的有序流轉(zhuǎn)。步驟一填申請(qǐng)單步驟二管理員審核步驟三財(cái)務(wù)打款每個(gè)步驟對(duì)應(yīng)一份 schema再加上一個(gè)狀態(tài)機(jī)描述步驟之間的跳躍條件就構(gòu)成了一套非常輕量級(jí)的工作流。輕量級(jí)工作流的關(guān)鍵在于每個(gè)節(jié)點(diǎn)只依賴 schema不依賴特定頁面代碼。工作流引擎只關(guān)心當(dāng)前節(jié)點(diǎn)是誰、下一步是誰、需要校驗(yàn)什么數(shù)據(jù)具體的字段交互全部交給 AutoForm 渲染。這樣審批流的調(diào)整往往只需要改配置和 schema不需要改前端代碼。從雙層架構(gòu)到輕量級(jí)工作流中間隔著的只是規(guī)則的顯式化。我現(xiàn)在的做法是把每一類表單的 schema 集中放在一個(gè)表單倉庫目錄里用 JSON 文件維護(hù)并提供版本變更記錄。當(dāng)需求方說這個(gè)表單需要加一個(gè)字段我改的是 schema 文件跑的是結(jié)構(gòu)校驗(yàn)然后界面自己就跟著變了。這個(gè)流程看起來不夠炫酷但它讓表單開發(fā)真正回歸到了數(shù)據(jù)配置本身我覺得這才是輕量級(jí)里輕字的分量。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲高清欧美总合| 精品天堂| 超碰在线成人电影| 日日日日日| 欧美性色欧美| 久久熟女人| 狠狠爱综合网| 男人的天堂2000| 伊人久久大香线蕉无码| 久久中文字幕人妻熟av女蜜柚| 中文字幕亚韩| 人人操人人肉久久精品| 久久的网站啊啊啊啊啊| 免费一级黄色录像影片| 国产日韩怡红院| AV 少妇 人妻 偷拍| 成人一道本免费视频| 欧美一级做a爰片免费视频| 免费超碰97久久| 大香蕉免费中文| 午夜男女爽爽大片免费观看| 亚洲美女精品九九视频| 青青草一区二区三区四| 青青草国产亚洲精品久久| 操操操五月天婷婷丁香影院| 超碰视97中文| 国产av高清版| 亚洲最大的综合性av| 人妻夜爽夜夜爽| 夜夜高潮夜夜爽| 青青青国产| 人妻中文字幕日韩电影| 黑人嘿嘿嘿超爽免费视频| 婷婷国产精品一区二区| www.人人摸在线视频| 狠狠躁日日躁夜夜躁A| 一区二区三区日韩欧美| 六月色色| 国产精品亚洲无码| 亚洲婷婷丁香在线| 丰满熟女人妻一区二区三五十一路| 人人澡综合涩| 久久极品伊人| 国产超碰国产97| 精品夜夜澡人妻无码| Julia在线播放亚洲久久| 色九月| av一区二区三区不卡| 福利大香蕉| 98超碰日本| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲国产尤物yw在线观看| 男人天堂无码| 亚洲**2021在线观看| aaa亚无码专区| 懂色av一区二区三区天美传媒| 日本亚洲嫩草影院啪啪| 国产一区在线播放| 伊人九九| 麻豆视频国产一区二区| 性做久久久久久免费观看软件| wwwcaobibi| 95自拍视频在线观看| 日韩人妻中文视频| 综合色图亚洲欧美| 精品超碰中文在线| 嫩草影院永久在线制服丝袜| 日韩欧美丝袜诱惑| 欧美视频第二页| 天堂综合| 少妇色欲综合网2| 国产日韩精品suv| 天天做日日做天天欢。| 欧美不卡在线美女| 日韩人人精品| 粉嫩av在线一区二区| 在线 制服丝袜中出 人妻| 美国久久一二三四| 精品人妻一区二区三区在线视频不卡| 人人妻人人澡人人爽久久av| .精品人妻一区二区三| 精品久久人妻成人网| 理论久久婷婷网 8| 东京热大香焦| 久久9久| 欧美大香蕉同搞| 国产乱码久久| 欧美瑟综合| 蜜乳AV.COM| 中国国产精品一区视频| 另类图片五月| 美女AV一区二区| 国产精品国产| 嫩草影院性色| 欧美综合 站| 国产精品点击进入在线影院高清| 国内精品久久人妻性色av| 国产亚洲性生活视频播放| 伊人久久婷婷| 欧美综合网| 三级激情网站| 欧美青青草视频| 三级特黄60分钟播放| 欧美日韩操操操| 青青操在线亚洲视频观看欧美在线 | 99e久久国产精品| 久久东京国产精品视频| 亚洲欧美综合网站| 柠檬AV导航| 久久婷婷一区二| 久久久久久中文| 91成人精品在线播放| 蜜屁Av| a片在线播放| 思思热在线| 国产人妻久久精品一区二区三区| av天堂手机版追回 | 日本黄色精品| 日本高清_区二区三区| 超碰人人草| 成人一二| 婷婷九月国产| 九九人人操| 淫纸中9区| 这里只有精品视频在线| 久久久神马影院| 一二三四视频中文字幕在线看| 大香蕉伊人色偷偷在线| 日韩免费高清大片在线| 亚洲免费日韩在线一区二区| 超碰精品97| 亚洲欧美成人在线| 国产女人视频三四五区| 九色 蝌蚪 熟女自| 久草视频观看视频在线| 天天天操天天天爱| 亚洲国产剧情少妇激情| 亚洲黄网在哪免费看| 亚州,欧美在线| aaaa少妇高潮大片| 欧美亚洲今日在线| 精品人妻一区二区三区视频| 99操| 成人av毛片在线观看| 国产传媒美日韩av| 久久天天摸| 国产美女销魂在线观看不卡| 中出20p| 欧美日韩不卡a片| 亚洲交换| 夜夜爽妓女| 日韩欧无码一区二区三区免费不卡| 亚洲一区深夜| 欧美中字二区| 十八岁啪啪视频免费看| 午夜男人的天堂| 1区2区3区中文字幕日韩| 午夜男人av| 夜夜嗨一区二区三区直播内容| 97天天搞在线| 国产亚洲99久久精品| 亚洲欧美综合| 天天综合-91入口| 中文字幕女同在线| 国产超碰在线一区| 欧美激情一区二区| 久久久噜噜噜久久久| 午夜毛片亚洲精品片国产久久久| 亚洲日韩乱码中文无码蜜桃臀网站| 国产1024在线播放| 天天综合网合集91| 一区 欧美 日韩 麻豆| 成人三级片无码| 91久久久亚洲| 国产区在线| 九一综合网| AV天天综合| 粉嫩绯色AV一区二区在线| 欧美欧美啪啪视频| 亚州男人天堂| 97精品97| 神马久久中文字幕| 人妻天堂综合网| 日韩激情啪啪啪| 色综合一本| 蜜臀久久99精品久久久久久酒店| 日韩一级二级三级免费看完整版国语版| 很很干很很操| 亚洲美女高潮喷水视频| 国产青视频| 后X久久| 日韩欧美亚洲一区二区三区影院| 日本操逼视频导航| 男人午夜天堂| 亚洲综合第一页| 超碰久久.com| 亚洲中字慕不卡| 操老熟女AV| 美熟女逼导航AV操逼| 成人综合网 欧美| 天天综合色电影| 另类在线| 久久亚洲人妻| 超碰97综合网| 日本在线15p| 黑丝制服中文字幕| 俞拍久久国应视频| 亚洲牲交| 亚洲精品久久久久毛片A片拉屎 | 91 国产丝袜在线放观看| 99精品在线观看| 国产超碰人人操| 免费观看性欧美一级| 蜜臀久久99精品久久久久久无删减| 9美女超碰在线免费观看| 正宗无毛一线天嫩逼| 亚洲 中文 欧美 日韩 在线| 一区二区高清视频| 无码精品久久久久久亚洲| 欧美亚洲中文| 日韩成人精品| 破苞ⅩXXX性无码动漫无码| 欧美成人午夜免费福利785| 国产成人www免费人成看片| 国产精品激情久久久久久久| 欧美麻豆成人同性GⅤ在线| 欧美日韩性爱精品| 久久久婷婷| 天天看片麻豆| 后入综合久久| 少妇综合| 久久东京伊人一本到鬼色| 一牛影视成人片免费| 亚洲日韩美女中文字幕乱| 国产97视频免费观看| 一区在线国产播放| 久久国产精品,久久国产| 日韩精品国模| 日韩有码 一区二区三区| 男人天堂黄片| 五月天婷婷小说| 人妻社区男人天堂| 男女国产精品| 韩国黄片aaaa| 91在线页| 久久久成人精品| 99色网| 1024人妻熟女一区二区三区| 欧美狠狠弄| 丰满人妻一区二区中文| 亚洲色图 欧美| 91久久精品中文字幕| 欧美性爱五月天| 性欧美天天| 玖玖超碰熟| 无码不卡亚洲成?人片| 天天操夜夜嗨| 黄日韩| 亚洲欧洲色情高清| 亚洲在饯| 99自拍视频| 夜精品久无码| 亚洲另类欧美精品| 盗摄 精品 另类 一区| 亚洲性图91| PMv在线观看| 欧美九一精品久久久熟妇| 97视频免费播放| www.大香| 色娱乐色呦呦夜夜夜夜av| 美欧色综合| 国产精品免费视频人成| 九七毛片九九毛片| 91伊人久| 国产久久一区二区三区野外在线| 97干在线视频| 婷婷五月天在线观看| 道久久五香丁月婷婷激情综合| 91社区伊人| 麻豆AV一区二区| 国产99久久99热这里只有精品15| 国产熟女无套内射| 久久性爱大全| 国产精品久久久久久久久久久久久久久| 国产9l 大屁股| 免费啪啪av| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 很黄很污的免费网站| 精品久久久久成人码免| www.久久最新地址| 日韩9999| 国产欧美日韩一区二区三区| 亚洲五区熟女| 高清孕妇孕交| 打av高清| 视频一区二区三区精品| 日韩中字av一区| 99精品九九九九九九| 333kkkk·亚洲com久久| 91碰碰| 天天做天天爱天天高潮| 999色欧美中文字幕| 一区二区三区四区免费视频| 99日免费视频中文字幕| 尤物国产一区在线观看| 久久99久久99精品天美传媒棢·纸:.| 日本熟妇人妻中出视频| 怡红院成人视频| 色婷五月天| 亚洲情色 欧美| 亚洲欧美日韩综合在线尤物| 91热热色| 美女啊啊啊啊pc| 少妇熟女1区2区3区| 在线 亚洲 网爆 自拍| 成人性爱免费播放| 人妻五十路在线| 日韩av影片在线观看| 日日躁夜夜躁狠狠躁超爽| 六六久久日韩不卡| 天天激情综合站| 久超碰这里只有精品| 婷婷丁香久久| 亚洲精品一区二区精品| 东北女人性交| 午夜天堂网| 综合操逼| 中文字幕一区二区视频在线观看 | 97精品在线| 五月色网| 日韩操p| 热久久无毒不卡| 天天舔天天 | 九九色影院| 日韩成人私密一级精品av| 96国产污污污丝袜| 97WW精品| 全球成人中文在线| 久久精品人人做人人看| 中文字幕丝袜| 青青草日韩免费观看高清在线| 五月丁香网站| 午夜男人一级A片7777| 亚洲本色精品一区二区久久| 97在线欧| 久久爱超碰网| 一区麻豆 高清中文字幕| 久久五月婷| 日日噜噜夜夜狠狠视频无| 九九九九九精品视频| 嗯嗯啊啊好大好爽| 粘花网06av视频| 婷婷久久久| 偷窥自拍A片| 人人操人人摸人人看人人插| 欧美黑人熟妇精品91| 国产精品粉嫩福利在线| 天美传媒Av在线| 啊啊啊com| 久热九九| 乱色视频中文字幕| 人妻乱仑一区二区三区| 亚洲黄色网址视频| 国产AV精久久| 国产女同视频在线播放| 国产精品久久久久久久久久梁医生| 婷婷丁香人妻 | 黄片www视频免费| 五月天婷精品激情| 日韩亚洲中文字幕在线| 性色av大全| 欧美日韩插逼视频| 98人妻精品一区二区色欲| 91熟女丨91老女人| 精品在线蜜臀| 97国产精品视频| 亚洲在线91| 好湿好紧视频| 婷婷20月天青娱乐| 91狠狠综| 欧美操人视频| 中文字幕日韩电影人妻| 欧美日韩啪啪电影| 91精品久久久| 久久亚洲AV无码专区首页| 国产日韩色综合| 人妻中文字幕精品无码| 国语精品内射在线观看| 人妻熟女av国产网站| 久久香蕉国产线看观看猫咪av| 顶级丝袜熟女一区二区三区| 乱伦3P视频| 熟女六十路| 日韩人妻一区二区精品| 夜夜夜久久| 久久婷婷在线观看视频| 亚洲天堂情色| 中文字幕午夜精品久久久| 久超碰这里只有精品| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | av在线浏览| 久久鲁夜| 欧美黑人168页欧美黑人167| 欧美精品黑人猛交高潮| 亚洲一区在线观看欧洲| 国产操操日韩三级黄| 美女一区二区国产精品| 五月天伊人| 大香蕉 222| 无码137片内射在线影院| 欧美人与动性人交a| 亚洲精品性爱片| 欧美黑人精品一区二区| 青青草原人妻| 精品视频久久区| 少妇大屁屁| 精品欧美不卡在线播放| japan日本高清乱xxxx| 亚洲激情在线| 黑人与人妻| 97久久超碰日韩精品| 国产又粗又大硬免费色网视频| 天天懆天天日| 色色操| 97精品第3页| AV色女综合| AV和黑人在线播放| 蜜臀av一区二区三区免费观看| 97超碰天天爱天天爱| 少妇色欲综合网2| 久久久久久久九九九九九九| 婷色五月| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 99热日| 97在线视频免费| 免费亚洲黄色视频在线观看| 国产日本熟女顶级一区二区三区视频| 无毛精品| 欧亚成人| 97天天做| 操国产高清| 国产成人精品亚洲日本| 智利AV在线网| 大香蕉www.超碰| 狠狠中文字幕| 欧美综合第一页| 俺去俺来也在线www| 美女的肌被草喷水视频| 丁香六月天| 天天操人人操骚逼网站| 1人人看人人摸人人操| 一区二区 韩日AV| 欧美一区二区三熟女剧情| 欧美亚洲第一页| 亚洲情色婷婷五月天| 黄色成年| 色噜噜狠狠色综合日日| 欧洲自拍第一页| 丝袜美腿制服人妻二区中文字幕| 大香蕉色欲AV| 一级aaaaa欧美中文字幕录像片| 自拍盗摄一区| 澳门黄片一香蕉视频| 国产不卡片| 色欲av国内精品久久久久久| 最新AVzaixian| 精品69网| 极品白嫩福利在线| 亚洲欧美国产va在线播放频| 99热精品青草在线| 乱性AV| 日日夜夜青青草母狗| 日韩精品一区二区高清| 九九综合网| 岛国艾薇凹凸视频天堂| 四虎影视 亚洲无码| 日本操BAV| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 成人午夜小视频手机在线看| 视频在线观看青青99国产| 亚洲欧美国产成人综合不卡| 91制服丝袜| 大香蕉宗合网在线| 免费观看成人www精品视频| 色九九九| 99久久e免费热视| 天美传媒精品一区二区三区| 欧日韩不卡视.频| 综合另类| yy少妇精品久久| 亚洲 欧美 手机在线观看| 综合色久欲| 91欧| 在线天堂999| 91九色蝌蚪在线观看| 亚欧美色图| 日韩人妻少妇 一区二区三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 中国少妇啪啪视频| 少妇天堂网络| 国产精品秘 福利姬在线观看| 午夜一区| 91N综合在线| 色99视频| 午夜无遮挡男女啪啪视频| 91美女視頻| 亚洲男人天堂Av| 五月婷婷丁香六月丁香| 久久9免费视频| 九九九网页| 人人摸人人添人人操| 啊啊啊啊好多水| 抽插爽| 另类天堂| 久久肏大逼| 日韩有码 一区二区三区| 亚洲综合 欧美| 麻豆国产av网| 综合五月天| 天天搞在线综合网| 国产免费一区2区3区| 青青草国产一区二区三区| 日韩精彩免费| 婷婷五月天av| 国产综合网站在线播放| 日本孕妇一区二区视频操逼免费看| 色眯眯av| 亚洲精品国产AV天美传媒| 婷婷久久网| 性开放中文AV高清无码免费看| 一区在线精品中文字幕| 91中出在线| 97爱碰| 国产熟妇一区二区| 久久久久9久久久久| 色人久久| 国产成人自拍视频在线| 亚洲va有码在线天堂| 思思热在线视频在线| juliaann欧美丝袜办公室| 青青草无码视频| 亚洲情色在线| 一区麻豆 高清中文字幕| 日本高清电影欧美色图| 久久久久96| 9999九九九久久久| 欧美日韩一干二干| 大香蕉啪啪啪啪在线| 97国产超湿| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 欧美一区二区三区不卡高清视频| 亚洲国产精品无石码久久| 成人夜夜| 色九九久九九| 欧美热图99| 精品人妻少妇| 97chaopengongkai| 亚州综合色| 性综合网| 久久双插| 97精品熟女少妇一区| 国产av强奸美女| 精品人妻中文字幕4399| 操逼不卡中文字幕| 天天干天天狼在线视频| 日本午夜久久电影| 免费精品99| 日本人体九九九九九九| 精彩视频日韩| 蜜桃精品视频一区| 97精品中文字幕| 亚洲性综合11| 国产三级片在线观看| 欧美色宗合| 国产福利电影| 乱欲一区二区| 99视频内射三四| 欧美不卡在线美女| 玖玖综合色| 久干网| 国产乱码久久久| 91性网| 人人妻碰人人免费| 97人妻免费中文字幕| 久久久 国产精品| h在线看免费版在线看| 亚洲色图20p| 黄色十八禁| 一区二区视频在看| 日韩中文字幕国产| www色色com| 97在线视频免费观看| 亚洲 欧美 精品专区 极品| 日韩精品在线观看观看| 亚洲九九夜夜| 性色国产东北露脸精品视频| 久久风骚城市人| 操国产逼| 免費黃色視頻觀看一| 伊人97色天使| 91美女视频。| 欧美一区二区三区四区综合| 精品久久99| 97久久免费| 日韩97P| 中文字幕aⅴ在线视频| 小草三级久久观看| 香蕉国产97| 欧美一区二区三区四区综合| 亚洲午夜免费狠狠干| 亚洲精品白丝| PMv在线观看| 五月丁香综合激情| 毛片麻豆91糖心精品毛情片| 亚洲日韩人妻中文字幕一区| 超碰在线人妻| 韩国毛片一区二区三区| 免费无码婬片AAAA片直播色戒| 天堂8在线新版官网| 久久久久久91香蕉国产| 午夜αv| 激情五月天色色网| 亚洲熟女偷拍在线观看| 国产高清视频无码在线| 区日韩亚洲乱码av电影| 超碰在线日韩一区| 国产强奸超碰AV| 日韩操呦呦影院在线观看| 日本一级特级毛片视频| 婷婷五月色| 97在线播放| 欧美日韩性爱无码| 久久久男人的天堂| 亚洲欧洲综合成人av一区| 超碰97精品在线| 欲香欲色综合天天伊人| 操一区| 超碰偷拍| 久久久夜夜嗨免费视频| 少妇色综合| 操www| 麻豆伊人网| 99re热有精品视频国产| 国产精品久久久777| 韩美日操逼| 欧美日韩电影一区二区| 白丝被操91| 佐山爱中文字幕| 欧美大香蕉久| 牛牛久久国产精品视频一二三| 国产福利电影| 日韩人妻无码精品系列| 欧美亚洲第一页| 国产亚洲精品美女| 国产色精品午夜大片| 亚洲大色鬼| 偷看洗澡一二三区美女| 老熟女天天操| 欧美亚州手机在线| 欧美18老人禁| 2026国产精品视频| JIZZJIZZ国产精品喷水| 校园春色美腿丝袜| 亚洲av在线免费观看| 老司机福利青青草| 色天堂综合| 亚洲最大AV网| 精品黄色电影| 加勒比综合九九99视频在线播放| 无码高清国产AV| 91精品操美女| 啊啊啊啊啊啊在线看| 亚洲啪AⅤ永久无码| 蜜臀久久精品久久久久视频| 成片免费播放| 亚洲一区日韩精品中文字幕| 99精品丰满人妻| 亚洲欧美日韩综合在线尤物 | 操逼操逼逼操操逼91| 91操熟妇| 国产av青草| 口爆吞精在线观看| 熟妇女伦乱视频| 亚洲免费日韩在线一区二区| 亚欧性爱ab| 久久久无码视频| 日韩电影天堂视频一区二区| 大香蕉久| 自怕偷自怕亚洲精品| 夜夜国自区| 日韩紧密久久| 无码抄逼网| 强奸抽插av| 久操电影网| 久久久久久久78| 大香蕉人妻| 人人 操人人 操人人| 日韩内| 欧美乱妇狂野欧美在线视频| 婷婷五月天av| 综合欧美激情网| 超碰97亚洲| 四虎精品一区| 啊啊啊啊啊啊啊好爽不要| **一级毛片国产| 欧美国产精品| 人人模人人看| 日韩熟女精一区二区三区不卡| 怡红院成人av| 伊人青青一区成人视频在线观看区| 无码聚合| 国产精品爽爽v| 一二三区操逼国产91| 欧美激情 亚洲色图| 97精品久久久久中文字幕| 97干com| 超碰av人人人| 日韩精品一区的| 人人人人插| A 在线网址| 自拍偷拍第26| 91欧洲国产成人久久精品网站| 亚州高清AV| 肉丝中文无码高清| 日韩av情韩国爱禁区av一区二区 | 欧美性生活免费网| 国产女s强制榨精视频| 日少妇视频| 91天堂| 欧成人精品一区二区三区| 精品少妇人妻一区二区三区| 60秒免费视频| 天天操天天7| 91爱欧美| 嗯~啊~快点 死我视频免费看网站| 久久嫩草国产成人一区| 日本不卡三级网在线播放| 亚洲中文字幕97久久精品少妇 | 亚洲 欧美综合| 亚洲av资源| 日日摸日日碰夜夜爽视频| 午夜亚洲| 中文乱码字幕观看视频| 91美女小视频| 一级一性爱免费视频| 伊人影院日本| se吧提供91精品国产91久久久久久 | 欧亚成人| 手机看片1024你懂的国产| 色爱三区| 床上啊啊啊一区二区三区| 天天日天天操心| 大鸡巴久久久| 国产乱弄免费在线视频。| 91性高| 好爽要喷了| 久久亚洲一区二区色婷婷| 少妇贴图| 国产精品懂色tv影视免费观看| 国产无码久久高清| 精品日韩人妻视频| 在线v中文字幕一区二区三区| 97超碰精品成| 大香蕉啪啪啪| AV天天在线观看| 麻豆国产原创AV色哟哟| 动漫片子网站3黄| 欧美日韩亚洲天堂网| 大肉棒导航| 国产精品高朝久久久久久久| 肉丝中文无码高清| 久区视频| 一区二区三区免费视频入口| 少妇一区二区三区精选| 国产色精品午夜大片| 色一情一乱一乱一区91Av| 91久久国产综合久久| 欧美久久婷婷| 久久超碰天天| 久久国产在线一区二区| 亚乱色| av大香蕉| 99re99视频在线免费观看| 久久久天堂| www.色吧5.com| 性做久久久久久免费观看软件| 久久草草欧美精品| 大香蕉综合久久| 国内毛片四区| 眼镜人妻101.com| 色香蕉影院| 欧美A√综合网| 亚洲男人天堂2017| 欧美日韩操逼动图| 神马视频久久久久久| 搡老女人老91妇女熟女| 日本操逼视频免费| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美精品人妻视频| 久久华人网| 岛国黄片网站| 色色99| 东北操逼| 蜜臀AV秘一区翔田千里| 99爱精品| 九九人妻| 少妇高潮流水av免费| 五月婷视频| 大屁股熟女一区二区三区| 欧美岛国精品在线观看| 深爱五月婷婷| 在线观看啊啊啊啊啊| 日日噜噜夜夜狠狠视频无| 大鸡巴久久久| 成人性生活高清视频在线播放| 国产亚洲精品av一区| 欧洲射精91| 欧美日韩亚洲天堂| 国产精品成人在线| 后入日本1234| 欧美aaaaaaa| 精品亚洲俞拍视频一区| 欧美激情激情xxxx欧美专区| 激情五月综合网| 夜夜骑日日| 日韩激情啪啪| 97超碰色中文字幕| 国产麻豆福利av在线播放| 日本黄色裸日本黄色裸体 | 精品免费1| 欧美色干| 国产精品色| 欧美se综合| 亚洲操操| 97天天操| 97人肏| 中文字幕在线观看网址| 欧美精品四区| 热99re69精品8在线播放| 深爱激情五月天| 鸥美中出| 久久久久久性爱片| 91免费看一区二区三区| 香一区二区三区| 在线免费观看高清无码视频| 日本一区二区电影网站| 天天看精品动漫视频一区| 伊人97色天使| 成 人片 黄色大片| 色综合99999| 色综合久| 欧美亚洲手机在线| 91人妻视频在线| 亚洲高清无毛一区二区| 啊啊啊不要嗯嗯在线观看| 果冻国产精品麻豆成人av| 日本ZZ高免费A级视频| 激情五月综合网| 一区在线精品中文字幕| 日本一片一区| 九九久久一区二区伦理| 天天综合91入口| 欧美乱色| 日本 色 导航| 四虎在线视频| 99天天超碰| 天天做日日爱夜夜爽| 人人妻人人爽一区二区三区| 毛片视频白嫩| 亚洲日韩美女中文字幕乱| 欧美色综合网| 天天碰操中国年青熟妇| 96久久精品一二三区色欲| 9久久精品| 久久蜜色情在线视频xxx免费观看| 久久精品中文字幕无码l| 久久久久99精品成人片蜜臀 | 精品日韩人妻视频| 九九热午夜欧亚国产视频| 激情文学网伊人| 精品国产丝袜一区二区三区乱码| 午夜亚洲| 日本精品性生活久久久| 天天干天天干天天干| 黄片qw| 殴美性天天| 成人片视频| 最新AVzaixian| AA特级绝黄| 97无码视频在线播放| 欧美色道啊| 91国产大片| 天天爽天天| 日韩国产成人自拍视频| 国产成人欧美精品在线| 欧美在线|亚洲| 亚洲码和欧洲精品激情系列| 亚洲aV无码成人在线观看| 久久国产逼| 美女91AV| 精品免费成人久久| 熟女一区二区三区| 超碰97欧美在线| 欧美日韩中文亚洲v在线综合| 欧美精品久久久久久久丰满| 午夜精品久久久久久久第一页按摩| 97国产天堂岛| 亭亭丁香激情| 992这里有精品| 丰满人妻av一区二区三区| 国内毛片无遮挡国产| 爱爱动态60秒| 超碰色97| 97亚洲自在精品在线观看| 国产精品丝袜久久亚洲不卡| 欧美激情 日韩精品| 亚洲天堂中文字幕无码男同| 日本熟女中文| 1769一区二区| 精品亚洲黄色片 国产精品导航一区二区| 国产在线播放成人免费| 人妻天堂三区| 久久内射| 欧美精品一二三| 97鸡把在线视频| 四虎精品亚洲| 欧美草草高清日韩视频| 骚熟女AV网| 超碰9 7女人| 97操综合| 青青草华人在线欧美在线| 日本免费一区二区不卡| 日韩中文字幕宗合在线| 91精品国久久久久久无码| 国产熟女| 成人热久久精品| 精品一区二区三区四区女| 综合 青草 伊久久 影院 综合| 久无码| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 蜜臀99999| 美日韩在线不卡人妻| 日日夜夜草草草| 久草草一二三四区久久| 成人欧美日超碰| 天天操天天日青青草超碰av| 日韩色图 一区二区| 国产深喉| 亚洲激情视频| 99婷婷一区二区| 中文字幕一区二区三区四区在线视频| 色吧5亚洲| 成在线人在线观看视频| 欧美一区二区三区另类精品| α√在线| 五月丁香六月激情| 九九热免费国产视频婷婷伊人五月| 欧美 中文字幕 一区| 大香蕉在线免| 蜜桃臀一区二区三区久久| 人妻激情视频| 国产一级高清免费观看| 五月丁香六月综合缴清无码| 人妻81p| 色综合色欲色综合色综合色综合| 九九热精品视频在线观看| 精品久久久久9999| 久热大香蕉网站| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 综合网亚洲1| 亚洲熟妇A V黑人| 日韩激情电影中文字幕| 永久免费发布性爱网| 婷婷综合久久| 99青青草国产视频| 久久一二三四五六七八九区| 亚洲综合影院| 人妻日日干| 精品久久久九九九孕妇| 素颜老阿姨乱情色| 96一区二区| av网站在线观看了| 思思热在线观看| 午夜精品久久久久| 中文字幕一区二区三区人妻不卡| 国产综合日韩伦理| 日本精品高清一二区一本到| 精品国产嫩穴视频| 国产成人精品一区| 午夜精品久久一区二区| 大香蕉免费乱伦视频| 国产精品九9| 69久久| 亚洲一区二区三区中文字幕| 久久婷婷五月| 久久九操在线观看| 伊人国产成人av网站| 国产美女高潮叫床视频| 97人人爱人人做人人乐| 久久香蕉国产线看观看亚洲女人| 日韩高清黄片| 青青11操操操操操操操操| 天天天操天天天爱| 国产福利电影| 欧美日不卡| 欧美亚洲清纯| 秋霞成人做爱| 成年男人的天堂| 熟妇色99| 欧美啪啪女女| 欧美日韩亚洲电影| AV乱伦专区| 少妇无码太爽| 日日操夜夜操天天操免费观看麻豆| 国产精品无码av| 东京成人一区| 草草草视频在线免费看| 红杏大香蕉| 日日骚一区二区三区| 五月天婷精品激情| 色偷综合| 思思热在线cao| 久久久久久久久久黄色网| 一区二区三区国产在线播放| 色色色综合网| 97操B| 婷婷综合激情| 久久老熟女| 成人丁香五月| 78精品| 熟妇熟女视频一区二区三区| 夜夜久久久| 亚洲综合色婷婷| 麻豆一区二区AV天美| 亚洲av无码成人精品国产| 熟妇高潮二区三区| 色牛牛AV| 九九九九热只有精品| 大香网伊人久久综合| 亚洲色婷婷综合久久一区二区三区| 亚洲超碰AV| 男人天堂毛片| 天天干天天拍| 亚洲精品97| 亚洲伊人久久精品狠狠在线| 91无码西班牙视频在线| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 欧美性生活综合| 91色宗合| 久久国色天香香蕉| 日韩黄色片子| 久久草视频污视频| 国产激情在线| 精品九区| 五月天伊人| 国产女人与拘做受视频免费| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 欧美日韩青操| 天天干天天狼在线视频| 78精品在线| 天天操女人| 被男人添B超爽视频| 久久偷偷色综合蜜桃| 在线国产探花| 成人线上超碰| 91天射| 9999久久久久| 熟女乱3伦999| 4虎在线视频| 97色色色| 久久受www免费人成| 狠狠爱夜夜干| 中文无码一二三区| 精品中文字幕第一页| 蜜臀99久久精品久久久久久| 青青草密桃在线播放| 国产精品熟女九色九色蜜臀| 夜夜春夜夜操| 中文字幕在线观看AV| 国产精品宅男免费| 欧美成人性活片| 中文字幕AV片| 美女刺激久久国产欧美| ji熟女.com| 国产精品97视频| 白丝少妇一区二区| 久久伊人大香蕉| 成人av福利在线观看| 日韩综合第八区国产精品| yirendaxiangjiashipin| 加勒比久久综合网高清| 91美女在线观看| 97天天在线| 人妻精品4K4K4K4K4| 日本操BAV| 五码视频在线观看| 欧美日韩狠狠爱| 一本久久精品中文字| 东京热激情视频一二三区| 久久久久久国产无码精品| 亲子敌伦对白在线播放| 91热色| 激情终合网| 91久久国产综合久久| 色噜噜人妻丝袜a∨先锋影 | 91青视频| 午夜婷婷| 屁屁影院一区二区三区国产| 三级日本一区二区三区| 精品天堂| 97chaopenrihan| 国产青青美女玩逼视频| 国产人妻精品久久久一区二区三区| 日本国产高清色www视频在线| 日韩成年人性爱视频| 日韩精品啪啪啪| 91国产伊人大香蕉| 亚洲色图国产另类| 性感女人网页在线观看视频| av一区二区三区 中文| 天天操天天干一区二区| 国产自制av蜜乳| 天天做天天爱| 96超碰网| 亚洲图片视频小说| 日本精品九九九| 大香蕉欧美国产日韩高潮| 91色综合激情| 亚洲日本男人天堂网| 欧苏综合色综合| 婷婷综合| 亚洲综合激情五月久久| 国产在线视视频有精品| 青娱乐久久艹| 亚洲中文日韩欧美大香蕉视频| 99久国产精品午夜性色福利| 黑人免费福利视频| 日本影视久久免费| 中文字幕后石码三区四区| 久久一区二区蜜桃| 青青草好吊色| 欧美超碰在线| 97在线视频免费观看| 久久国内| 狠操91,com| 天天情欲宗合网| 人妻喷水| 玖玖资源视频一区二区三区| 污电影在线观看| 玖玖爱伊人玖玖爱| 精品二区三四区五电影 | 青青草日韩免费观看高清在线| 欧日韩在线观看| 亚洲青青草| 国产精品一二三| 亚洲精品欧洲色| 蜜臀久久99精品久久久久| 日本一级真人黄色性爱视频| 手机看片91人妻| 嫩草美女久久|