日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

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

t3code實(shí)戰(zhàn):從模板驅(qū)動(dòng)到團(tuán)隊(duì)基建的代碼生成器指南

t3code實(shí)戰(zhàn):從模板驅(qū)動(dòng)到團(tuán)隊(duì)基建的代碼生成器指南 寫樣板代碼這種事干過(guò)幾年后端的人多少都有點(diǎn)PTSD。新建一個(gè)服務(wù)先手搓目錄結(jié)構(gòu)再寫實(shí)體類、Mapper、Service、Controller聯(lián)調(diào)完發(fā)現(xiàn)字段名拼錯(cuò)從頭再來(lái)。我從最開(kāi)始復(fù)制粘貼舊項(xiàng)目到后來(lái)用各種腳手架再到自己寫生成器折騰過(guò)不少方案最后留下來(lái)長(zhǎng)期在用的這套東西就是t3code。t3code是一個(gè)面向開(kāi)發(fā)者的代碼腳手架生成工具核心思路是用一個(gè)聲明式配置加模板引擎把“項(xiàng)目骨架生成”這件事標(biāo)準(zhǔn)化。它不限制你用什么技術(shù)棧Java、Go、Node、前端項(xiàng)目都能管本質(zhì)是“模板驅(qū)動(dòng) 類型安全 團(tuán)隊(duì)友好”三件套。適合被重復(fù)建項(xiàng)目折磨的工程師也適合團(tuán)隊(duì)里負(fù)責(zé)基建的人拿來(lái)搭建統(tǒng)一規(guī)范的項(xiàng)目模板讓新成員不再靠口頭傳文檔理解項(xiàng)目結(jié)構(gòu)。這篇文章不會(huì)講什么高深理論我會(huì)直接把項(xiàng)目定位、核心架構(gòu)、完整實(shí)操流程、配置項(xiàng)細(xì)節(jié)和踩坑記錄攤開(kāi)聊所有內(nèi)容都是我實(shí)際用過(guò)之后沉淀下來(lái)的。1. 項(xiàng)目定位解碼t3code到底解決什么問(wèn)題1.1 先說(shuō)清楚它是什么不是什么很多人在第一次接觸t3code時(shí)會(huì)把它和低代碼平臺(tái)搞混。低代碼平臺(tái)通常是給你一個(gè)在線編輯器拖拖拽拽生成業(yè)務(wù)系統(tǒng)t3code的定位完全不同它是個(gè)離線的、基于本地文件系統(tǒng)的代碼生成器。你給我一份描述項(xiàng)目結(jié)構(gòu)的數(shù)據(jù)我給你吐出完整的工程代碼生成完之后它就不再參與你的開(kāi)發(fā)流程了你不欠它任何運(yùn)行時(shí)依賴。也有人會(huì)問(wèn)它和GitHub上的模板倉(cāng)庫(kù)有什么區(qū)別。模板倉(cāng)庫(kù)的本質(zhì)是“一次性復(fù)制”你fork一份然后開(kāi)始手動(dòng)改改完的成果很難再反饋回模板本身。t3code把“模板”和“變量”分離模板是固定的骨架變量是每次傳入的配置同一個(gè)模板傳入不同參數(shù)可以生成出不同名字、不同字段、不同模塊的多個(gè)項(xiàng)目。這種設(shè)計(jì)解決了真實(shí)研發(fā)環(huán)境里一個(gè)非常具體的問(wèn)題團(tuán)隊(duì)里每個(gè)人建項(xiàng)目的姿勢(shì)都不一樣。有人喜歡Domain在前有人喜歡Controller在前有人目錄用單數(shù)有人用復(fù)數(shù)等到代碼評(píng)審的時(shí)候光統(tǒng)一結(jié)構(gòu)就能吵上半天。t3code把結(jié)構(gòu)鎖進(jìn)模板所有人生成出來(lái)的代碼都一樣這個(gè)內(nèi)耗就被消掉了。1.2 名字里的三個(gè)T代表什么t3code這個(gè)名字不是隨手起的它有明確的三層含義分別是Template-driven模板驅(qū)動(dòng)、Type-safe類型安全和Team-ready團(tuán)隊(duì)友好。第一層模板驅(qū)動(dòng)指的是它的核心執(zhí)行模型。整個(gè)工具的輸入有兩個(gè)一個(gè)是模板文件集合一個(gè)是配置數(shù)據(jù)。配置數(shù)據(jù)經(jīng)過(guò)預(yù)處理之后注入模板渲染引擎把模板和數(shù)據(jù)進(jìn)行合并最終寫出文件。這跟以往腳手架里“邏輯里寫死目錄結(jié)構(gòu)”的做法截然不同t3code的每個(gè)目錄、每個(gè)文件都可以根據(jù)配置動(dòng)態(tài)決定要不要生成。第二層類型安全說(shuō)的是配置數(shù)據(jù)這一端。t3code的配置文件是TypeScript文件也就是說(shuō)你在定義項(xiàng)目結(jié)構(gòu)的時(shí)候有完整的類型提示和編譯檢查。一個(gè)字段拼錯(cuò)了、一個(gè)布爾值寫錯(cuò)了類型在跑生成命令之前就能發(fā)現(xiàn)。這一點(diǎn)體驗(yàn)差異非常大我之前用YAML配置生成器的時(shí)候經(jīng)常因?yàn)榭s進(jìn)或者類型問(wèn)題在運(yùn)行時(shí)才報(bào)錯(cuò)改成TS配置之后這類問(wèn)題幾乎絕跡了。第三層團(tuán)隊(duì)友好更偏向工程管理維度。t3code支持把模板拆分成可復(fù)用的插件包團(tuán)隊(duì)里可以維護(hù)一個(gè)內(nèi)部模板倉(cāng)庫(kù)通過(guò)版本號(hào)管理模板的迭代。新人入職之后執(zhí)行一條命令就能生成一個(gè)完全符合團(tuán)隊(duì)規(guī)范的新工程不需要去讀十幾頁(yè)的Wiki文檔。2. 核心架構(gòu)與渲染原理拆解2.1 三層結(jié)構(gòu)模板層、規(guī)則層、渲染層t3code的源碼架構(gòu)可以理解成三個(gè)清晰的層次。模板層存儲(chǔ)所有模板文件規(guī)則層存放配置定義和校驗(yàn)邏輯渲染層負(fù)責(zé)把前兩者組合起來(lái)輸出結(jié)果。模板層不是簡(jiǎn)單的文本文件它支持多級(jí)目錄嵌套并且目錄本身也可以作為模板變量。比如你要生成services/UserService.java目錄services和文件名UserService.java都可以用Mustache語(yǔ)法寫成{{feature}}/{{domain}}Service.java這樣當(dāng)你配置不同的業(yè)務(wù)域時(shí)目錄和類名會(huì)自動(dòng)變化。單就這個(gè)能力已經(jīng)比大多數(shù)腳手架靈活了。規(guī)則層的核心是一個(gè)配置Schema它會(huì)聲明所有配置項(xiàng)的類型、默認(rèn)值、校驗(yàn)規(guī)則。這個(gè)Schema同時(shí)驅(qū)動(dòng)兩件事校驗(yàn)用戶輸入的配置數(shù)據(jù)以及生成配置文件的代碼提示。t3code復(fù)用了TypeScript的類型推導(dǎo)能力你用defineConfig函數(shù)包裹配置對(duì)象之后編輯器就能自動(dòng)提示每個(gè)字段的合法值和含義。渲染層相對(duì)普通就是遍歷模板目錄對(duì)每個(gè)文件執(zhí)行模板引擎渲染再根據(jù)配置決定目標(biāo)路徑最后寫入磁盤。但有幾個(gè)細(xì)節(jié)值得注意。它會(huì)把.t3ignore后綴的文件原樣復(fù)制不做渲染方便放一些不希望被模板語(yǔ)法干擾的靜態(tài)內(nèi)容。它還會(huì)對(duì)比目標(biāo)路徑下已存在的文件如果有同名文件且內(nèi)容不同會(huì)提示你選擇覆蓋、跳過(guò)還是備份后面我會(huì)專門講到這個(gè)交互邏輯。2.2 模板語(yǔ)法與內(nèi)聯(lián)表達(dá)式t3code的模板語(yǔ)法兼容Handlebars同時(shí)也加了自己的一套快捷表達(dá)式?;A(chǔ)變量用雙大括號(hào)比如{{ projectName }}如果需要大寫開(kāi)頭的駝峰形式寫在文件名里可以寫成{{ pascalCase domain }}它會(huì)自動(dòng)把user_profile轉(zhuǎn)成UserProfile。這套內(nèi)聯(lián)表達(dá)式的設(shè)計(jì)是我非常喜歡的地方。我記得最早用Plop的時(shí)候文件名要做格式轉(zhuǎn)換就得寫一堆Helper函數(shù)每次都要在配置文件里單獨(dú)聲明。t3code把這些最常用的轉(zhuǎn)換內(nèi)置了camelCase、pascalCase、snakeCase、kebabCase、upperCase、lowerCase隨用隨取模板里直接寫就行。條件判斷方面{{#if}}和{{#each}}都能直接在模板文件里操作。比如后端模板里根據(jù)配置決定要不要生成Controller層{{#if withController}} public class {{pascalCase domain}}Controller { private final {{pascalCase domain}}Service {{camelCase domain}}Service; } {{/if}}這是一個(gè)純Java文本的模板文件但它中間夾雜著一層邏輯控制。t3code渲染完之后才會(huì)寫到磁盤所以你可以直接在模板里干類似的事情毫無(wú)違和感。2.3 為什么選Handlebars而不是EJS或其他引擎我在設(shè)計(jì)t3code的第一版時(shí)其實(shí)用過(guò)EJS做渲染引擎當(dāng)時(shí)覺(jué)得EJS的% %萬(wàn)能能寫任意JavaScript邏輯很自由。后來(lái)在真實(shí)項(xiàng)目里用了幾次陸續(xù)發(fā)現(xiàn)幾個(gè)問(wèn)題。EJS模板在編輯器里默認(rèn)不具備高亮支持后端工程師打開(kāi)一個(gè).ejs文件看到里面滿屏的% if (...) { %第一反應(yīng)是抗拒。Handlebars的語(yǔ)法則更加貼近純文本{{ }}符號(hào)在任何語(yǔ)言文件里都不會(huì)和原有語(yǔ)法沖突代碼高亮基本不受影響。另一個(gè)更重要的原因是Handlebars的渲染是“數(shù)據(jù)驅(qū)動(dòng)”的它強(qiáng)制你在渲染前把邏輯整理成數(shù)據(jù)字段。在EJS里你可以隨手寫循環(huán)和函數(shù)調(diào)用時(shí)間一長(zhǎng)模板會(huì)變得非常難以維護(hù)。Handlebars提倡的做法是需要什么邏輯就定義Helper模板里只做最簡(jiǎn)單的事。這個(gè)約束讓t3code的模板庫(kù)即使經(jīng)歷了多個(gè)團(tuán)隊(duì)迭代依然能保持整潔。2.4 安全機(jī)制目錄覆蓋保護(hù)與Dry Run模式代碼生成器最容易出事的地方在于覆蓋文件。t3code默認(rèn)開(kāi)啟安全模式目標(biāo)路徑下如果存在同名文件且內(nèi)容和本次渲染結(jié)果不完全一致它不會(huì)直接覆蓋而是進(jìn)入一個(gè)交互菜單讓你選Skip、Overwrite、Backup、Diff。這個(gè)設(shè)計(jì)曾經(jīng)在很多極限情況下救過(guò)我最典型的一次是有一個(gè)模板路徑配置寫串了差點(diǎn)把另一個(gè)服務(wù)的配置目錄生成出來(lái)的東西覆蓋掉因?yàn)樵趥浞蔹c(diǎn)停住了最后只損失了幾分鐘排查時(shí)間。除了交互模式t3code還支持--dry-run參數(shù)。加了這個(gè)參數(shù)之后它只計(jì)算“將要寫出哪些文件到哪些路徑”在終端打印出一份清單不真正落盤。這個(gè)是上線模板庫(kù)之前必跑的一步。我現(xiàn)在的習(xí)慣是每個(gè)新模板合并到主分支之前都用dry-run跑一遍全量樣例看清單里有沒(méi)有奇怪的路徑出現(xiàn)。3. 完整實(shí)操流程從零生成一個(gè)可運(yùn)行的工程3.1 安裝與環(huán)境要求t3code是一個(gè)Node.js命令行工具安裝之前需要確認(rèn)開(kāi)發(fā)環(huán)境里有Node.js 18或更高版本。Node中間版本的差異坑過(guò)我好幾次低版本會(huì)有一些比較新的API不可用所以升級(jí)完之后建議跑一下node -v確認(rèn)版本。全局安裝npm install -g t3code安裝完執(zhí)行t3code --version能輸出版本號(hào)就說(shuō)明裝好了。我不太建議用yarn全局裝這種工具因?yàn)閥arn的全局路徑在升級(jí)時(shí)會(huì)殘留多個(gè)版本容易在執(zhí)行時(shí)調(diào)到一個(gè)舊版本。npm在這一點(diǎn)上做得相對(duì)穩(wěn)一些。如果你不想全局裝也可以每次用npx調(diào)用npx t3code init onlinestore但全局安裝還是更方便因?yàn)閠3code的常用命令很多每次前面掛個(gè)npx敲起來(lái)視覺(jué)上很累。3.2 初始化配置文件在你要生成項(xiàng)目的目錄下運(yùn)行t3code init它會(huì)在當(dāng)前目錄創(chuàng)建一個(gè)t3.config.ts文件。這個(gè)文件就是整個(gè)生成的唯一入口配置文件。我建議把它提交到代碼倉(cāng)庫(kù)因?yàn)樗琼?xiàng)目的“結(jié)構(gòu)說(shuō)明書”后續(xù)所有改動(dòng)的依據(jù)都在這。一個(gè)典型的配置長(zhǎng)這樣import { defineConfig } from t3code; export default defineConfig({ project: { name: online-store, description: Online retail backend service, packageName: com.example.store, language: java, buildTool: maven, javaVersion: 17, }, modules: [ { domain: user, features: [crud, validation], withController: true, withService: true, withRepository: true, }, { domain: order, features: [crud], withController: true, withService: true, withRepository: true, }, ], output: ./generated, });這里modules可以定義多個(gè)領(lǐng)域模塊每個(gè)模塊會(huì)生成一套獨(dú)立的Controller、Service、Repository等文件。一次配置批量生成多個(gè)域非常適合用來(lái)搭建微服務(wù)里邊聚合業(yè)務(wù)。配置寫完之后運(yùn)行下面命令t3code generate3.3 用模型定義批量生成CRUD接口如果你要生成的系統(tǒng)有完整的數(shù)據(jù)模型t3code的generate命令可以接受模型定義參數(shù)直接生成一套完整的CRUD接口代碼。t3code generate --model User --fields id:Long:pk,name:String:required,email:String:unique,status:Integer:default1 --pkg com.example.user這個(gè)命令背后的邏輯是t3code內(nèi)置的模型解析器。它會(huì)把你傳的字段列表拆成類型映射生成數(shù)據(jù)庫(kù)建表語(yǔ)句、實(shí)體類、Mapper接口、Service接口和實(shí)現(xiàn)類、Controller、DTO、異常處理類。如果你用的是Java技術(shù)棧生成出來(lái)的代碼是Spring Boot風(fēng)格如果傳--lang go則生成Gin風(fēng)格的代碼。我之前在一個(gè)內(nèi)部工具的迭代中使用過(guò)這個(gè)功能當(dāng)時(shí)需要在極短時(shí)間內(nèi)把兩個(gè)遺留系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)整理成新服務(wù)的接口。我只需要把老庫(kù)的表結(jié)構(gòu)寫成字段描述工具生成的代碼修正成本極低整體效率比從零寫快了很多倍。注意自動(dòng)生成的代碼不會(huì)完全貼合業(yè)務(wù)異常邏輯但作為一版初始骨架它解決“從一個(gè)空項(xiàng)目起步”的恐懼感效果立竿見(jiàn)影。3.4 生成后的目錄結(jié)構(gòu)與代碼解讀執(zhí)行完生成命令后在./generated目錄下會(huì)有如下結(jié)構(gòu)generated/ └── online-store/ ├── pom.xml ├── src/main/java/com/example/store/ │ ├── StoreApplication.java │ ├── config/ │ │ ├── SecurityConfig.java │ │ └── MybatisPlusConfig.java │ ├── controller/ │ │ ├── UserController.java │ │ └── OrderController.java │ ├── service/ │ │ ├── UserService.java │ │ └── UserServiceImpl.java │ ├── mapper/ │ │ ├── UserMapper.java │ │ └── OrderMapper.java │ ├── entity/ │ │ ├── User.java │ │ └── Order.java │ └── common/ │ ├── Result.java │ └── GlobalExceptionHandler.java ├── src/main/resources/ │ ├── application.yml │ └── mapper/ │ ├── UserMapper.xml │ └── OrderMapper.xml └── README.md需要理解的是這個(gè)結(jié)構(gòu)并不是“寫死在工具里”的。它來(lái)自你當(dāng)前選用的那個(gè)模板插件如果你換成別的技術(shù)棧模板輸出會(huì)是完全不同的結(jié)構(gòu)。t3code只負(fù)責(zé)執(zhí)行內(nèi)容由模板決定。這一點(diǎn)想明白后續(xù)要定制模板的時(shí)候你就知道該改哪里。4. 關(guān)鍵配置項(xiàng)與自定義能力詳解4.1 配置字段速查表上面那個(gè)配置示例用到了不少字段但項(xiàng)目用到深處之后你會(huì)發(fā)現(xiàn)可配項(xiàng)遠(yuǎn)不止這些。我整理了一份常用字段的速查表方便你邊查邊用。字段類型默認(rèn)值說(shuō)明project.namestring必填項(xiàng)目名會(huì)作為根目錄名和包名基礎(chǔ)project.descriptionstring項(xiàng)目描述寫入READMEproject.packageNamestring必填代碼包名如com.example.appproject.languageenumjava可選java、go、node、pythonproject.buildToolenummaven可選maven、gradle、go-mod、npmproject.javaVersionint17僅Java模板生效project.nodePackageManagerenumnpm僅Node模板生效project.ormenummybatis-plus可選mybatis-plus、spring-data-jpamodules[].domainstring必填域名如user、ordermodules[].fieldsarray[]字段描述驅(qū)動(dòng)實(shí)體類生成modules[].withControllerbooleantrue是否生成Controller層modules[].withServicebooleantrue是否生成Service層modules[].withRepositorybooleantrue是否生成數(shù)據(jù)訪問(wèn)層outputstring./generated輸出根目錄我在團(tuán)隊(duì)落地的時(shí)候會(huì)把這份表打印出來(lái)貼在工位上因?yàn)槊慨?dāng)新增一個(gè)模塊需要調(diào)整生成策略翻一下這個(gè)表基本能定位到問(wèn)題不用去讀源碼。4.2 自定義Helper函數(shù)內(nèi)置的字符串轉(zhuǎn)換Helper有時(shí)候不夠用比如你要在模板里對(duì)某個(gè)字段類型做Java和數(shù)據(jù)庫(kù)類型的映射。t3code允許在配置文件中注冊(cè)自定義Helpers。import { defineConfig } from t3code; export default defineConfig({ helpers: { jdbcType(fieldType: string): string { const map: Recordstring, string { Integer: INTEGER, Long: BIGINT, String: VARCHAR(255), LocalDate: DATE, }; return map[fieldType] || VARCHAR(255); }, }, });注冊(cè)之后可以在模板中這樣使用{{jdbcType field.type}}這里的設(shè)計(jì)考量在于模板文件的職責(zé)是展示復(fù)雜的數(shù)據(jù)加工必須放在配置里。自定義Helper在配置里定義也方便統(tǒng)一維護(hù)團(tuán)隊(duì)后來(lái)要做類型映射調(diào)整改配置一處就夠了。4.3 模板鉤子beforeRender與afterRender有一些需求純靠模板自身表達(dá)不出來(lái)比如生成完代碼之后要對(duì)某個(gè)文件內(nèi)容做統(tǒng)一替換、對(duì)生成的目錄做壓縮備份、甚至跑一段腳本做包名批量替換。t3code為此設(shè)計(jì)了鉤子函數(shù)機(jī)制。配置寫法如下export default defineConfig({ async afterRender(context) { const { outputDir, renderedFiles } context; // 可以在這里執(zhí)行一些后處理邏輯 await runPostProcess(outputDir, renderedFiles); }, });鉤子按執(zhí)行時(shí)機(jī)分為前置和后置。前置鉤子常見(jiàn)用途是拉取遠(yuǎn)程配置、動(dòng)態(tài)設(shè)置環(huán)境變量后置鉤子常見(jiàn)用途是調(diào)用格式化工具、執(zhí)行測(cè)試、清理臨時(shí)文件。我第一次把t3code接入一個(gè)含有API網(wǎng)關(guān)的項(xiàng)目時(shí)每次生成完都要手動(dòng)去改網(wǎng)關(guān)的注冊(cè)配置文件后來(lái)寫了一個(gè)后置鉤子腳本自動(dòng)完成徹底解脫了。4.4 多模塊與單體模式的切換t3code支持兩種輸出模式單體多模塊和獨(dú)立多目錄。單體多模塊就是在一個(gè)項(xiàng)目里同時(shí)生成多個(gè)業(yè)務(wù)模塊共享同一套common工程獨(dú)立多目錄則是每個(gè)業(yè)務(wù)域生成一個(gè)完整項(xiàng)目目錄。這個(gè)選擇在配置里是通過(guò)project.projectType字段控制的可選single-module或multi-project。如果你要搭建微服務(wù)拆分前的單體應(yīng)用推薦用single-module依賴關(guān)系清晰如果你在搭建一套多服務(wù)倉(cāng)庫(kù)推薦multi-project每個(gè)模塊獨(dú)立pom或go.mod后續(xù)拆庫(kù)會(huì)很省事。我當(dāng)時(shí)在兩個(gè)模式的實(shí)現(xiàn)上做過(guò)多次版本調(diào)整核心難點(diǎn)在于路徑算法的分支處理。單模塊下路徑是src/main/java/com/.../controller多項(xiàng)目下路徑是user-service/src/main/java/.../controller模板取根路徑的時(shí)候如果少算一層輸出的目錄就會(huì)亂。后來(lái)在配置里用了一個(gè)內(nèi)部變量moduleRoot把這兩種情況統(tǒng)一成了模板里的一層引用模板編寫者在寫路徑時(shí)完全不用關(guān)注是哪種模式。5. 踩坑實(shí)錄我用t3code踩過(guò)的那些坑5.1 模板轉(zhuǎn)義問(wèn)題雙括號(hào)被吃掉在做前端模板的時(shí)候我踩過(guò)最離譜的一個(gè)坑是生成Vue文件時(shí)模板里原本要保留的{{ }}被t3code當(dāng)成了變量處理。Vue的模板語(yǔ)法也是雙大括號(hào)和Handlebars天然沖突結(jié)果生成出來(lái)的.vue文件里插值表達(dá)式全部變成了空字符串。這個(gè)問(wèn)題的解決辦法是使用t3code提供的原始?jí)K語(yǔ)法{{{{raw}}}} const message {{ message }} from ${user.name}; {{{{/raw}}}}raw塊內(nèi)的內(nèi)容會(huì)原樣輸出不參與渲染。這個(gè)坑直接影響了一個(gè)前端項(xiàng)目模板的提效后來(lái)我在內(nèi)部模板規(guī)范里加了一條強(qiáng)制約定所有生成*.vue或者*.tsx文件時(shí)只要涉及原生雙括號(hào)的代碼片段一律包在raw塊里。后來(lái)的執(zhí)行中就再也沒(méi)出現(xiàn)過(guò)類似情況。5.2 Windows下的路徑分隔符問(wèn)題另一件鬧心的事情是Windows環(huán)境下的路徑分隔符。t3code在規(guī)劃目標(biāo)路徑時(shí)使用Node的基本路徑處理在Linux上生成都是正常的/分隔但到了Windows上某些模板用硬編碼的/會(huì)導(dǎo)致路徑拼接錯(cuò)亂輸出目錄里會(huì)出現(xiàn)帶反斜杠混合的文件夾。排查發(fā)現(xiàn)是模板里寫死了相對(duì)路徑{{output}}/src/{{language}}/com/example在Windows上頂層變量帶的是反斜杠兩層一拼接就會(huì)出generated/src\main/java這種混亂路徑。解決的方案是在配置渲染前將所有路徑統(tǒng)一規(guī)范化用path.join然后再拉平為/前綴。模板編寫規(guī)范也更新了一條模板中的路徑統(tǒng)一使用{{path.join var src main}}這種寫法避免字符串拼接。這個(gè)坑如果不實(shí)際在Windows上跑一遍是不容易暴露的因?yàn)榇蠖鄶?shù)后端開(kāi)發(fā)主力機(jī)是Mac或Linux。但凡團(tuán)隊(duì)里有幾個(gè)Windows用戶這個(gè)問(wèn)題必然會(huì)遇到。寫模板時(shí)務(wù)必把路徑處理交給工具內(nèi)置的Helper。5.3 覆蓋保護(hù)誤觸導(dǎo)致的生成中斷聽(tīng)過(guò)一些用戶反饋過(guò)更新模板版本后跑生成命令中途卡在某個(gè)文件確認(rèn)覆蓋的交互處沒(méi)注意到就直接退出了。我后來(lái)給團(tuán)隊(duì)的命令腳本統(tǒng)一加了--yes參數(shù)在模板更新、重跑生成的場(chǎng)景下使用跳過(guò)交互直接按照安全策略自動(dòng)處理。但這里有個(gè)微妙的平衡生產(chǎn)環(huán)境生成新項(xiàng)目時(shí)要用交互模式因?yàn)槟悴恢滥0邃秩窘Y(jié)果是否符合預(yù)期盲選覆蓋有風(fēng)險(xiǎn)而在日常迭代中--yes更順手因?yàn)槟憧催^(guò)dry-run的輸出確認(rèn)沒(méi)有意外才真正生成。我的習(xí)慣配兩個(gè)aliast3gen-safe交互模式和t3gen-fastdry-run yes不同場(chǎng)景用不同命令基本不會(huì)混淆。5.4 團(tuán)隊(duì)協(xié)作時(shí)模板規(guī)范缺失最后一個(gè)人為的坑是團(tuán)隊(duì)協(xié)作時(shí)模板風(fēng)格不統(tǒng)一。t3code允許你定義多個(gè)來(lái)源的模板庫(kù)但如果沒(méi)有約定模板命名和放置目錄很快就會(huì)變成一團(tuán)亂麻。有的人習(xí)慣把模板放在templates/service下有的人放在service.t3下路徑一旦散落后續(xù)維護(hù)難度呈指數(shù)上升。我現(xiàn)在在項(xiàng)目中強(qiáng)制使用一個(gè)約定模板倉(cāng)庫(kù)根目錄固定為blueprint/模塊目錄名和最終輸出的模塊名保持一致。每一個(gè)模板文件的前幾行要用注釋標(biāo)明適用場(chǎng)景和依賴的配置項(xiàng)。聽(tīng)起來(lái)很樸素但真的能救命。因?yàn)槟0鍘?kù)會(huì)不斷演化沒(méi)有注釋的模板在三個(gè)月后沒(méi)人能看懂當(dāng)初為什么這么寫。6. 常見(jiàn)問(wèn)題速查表我在長(zhǎng)期使用過(guò)程中積累了一些高頻問(wèn)題這里統(tǒng)一整理成表格方便大家快速定位。問(wèn)題現(xiàn)象原因解決辦法生成的文件內(nèi)容為空模板中變量名拼錯(cuò)模板{{name}}和配置module.name不匹配檢查變量名大小寫用編輯器搜索模板中的大括號(hào)目錄結(jié)構(gòu)不符合預(yù)期多了一層無(wú)意義目錄配置了output后模板又拼接了項(xiàng)目名檢查輸出路徑中是否重復(fù)出現(xiàn)項(xiàng)目名Windows路徑錯(cuò)亂生成后目錄帶有反斜杠模板硬編碼了路徑分隔符統(tǒng)一使用工具提供的路徑Helper模板雙括號(hào)被渲染Vue/React模板語(yǔ)法被吞原生雙大括號(hào)被Handlebars解析用{{{{raw}}}}塊包圍覆蓋確認(rèn)煩人每次生成都交互詢問(wèn)安全策略默認(rèn)值過(guò)于保守使用--yes參數(shù)跳過(guò)交互自定義Helper不生效模板渲染時(shí)找不到函數(shù)配置中未正確注冊(cè)Helper檢查helpers配置對(duì)象是否導(dǎo)出生成的代碼編譯報(bào)錯(cuò)某些文件缺失withController設(shè)置為false但Controller模板仍在引用檢查模板條件判斷是否正確Node版本過(guò)低運(yùn)行時(shí)報(bào)語(yǔ)法錯(cuò)誤t3code新語(yǔ)法不支持舊版本升級(jí)Node到187. 進(jìn)階玩法分享從單機(jī)工具到團(tuán)隊(duì)基建7.1 搭建團(tuán)隊(duì)內(nèi)部模板庫(kù)單一項(xiàng)目使用t3code只是戰(zhàn)術(shù)層面的提效真正能放大收益的是把這個(gè)工具變成團(tuán)隊(duì)基建。第一步是搭建一個(gè)內(nèi)部模板倉(cāng)庫(kù)把團(tuán)隊(duì)當(dāng)前的技術(shù)棧、分層架構(gòu)、安全檢查、測(cè)試框架全部沉淀進(jìn)模板。這個(gè)模板倉(cāng)庫(kù)要有版本概念。t3code支持在配置里聲明依賴的模板包版本號(hào)export default defineConfig({ templatePackages: [ { name: internal/backend-java, version: 2.1.0 }, ], });當(dāng)Java基礎(chǔ)框架升級(jí)時(shí)你只需要修改模板倉(cāng)庫(kù)的版本號(hào)然后讓團(tuán)隊(duì)成員重新運(yùn)行一次生成命令就能得到一份與舊版本不同但結(jié)構(gòu)一致的新項(xiàng)目。能做到這一點(diǎn)其實(shí)是在把原本不可控的“新建項(xiàng)目”動(dòng)作納入標(biāo)準(zhǔn)化的版本管理。7.2 與CI流水線結(jié)合實(shí)現(xiàn)自動(dòng)化檢查t3code的dry-run模式非常適合嵌入CI流水線。我們團(tuán)隊(duì)在每次推送模板庫(kù)變更時(shí)CI會(huì)執(zhí)行一次用樣例配置的dry-run生成然后用diff工具對(duì)比輸出和基線版本。如果模板改動(dòng)導(dǎo)致輸出內(nèi)容和預(yù)期不符CI會(huì)自動(dòng)失敗阻斷合并。這個(gè)機(jī)制讓我們敢持續(xù)迭代模板庫(kù)而不擔(dān)心發(fā)版事故。你想想以往模板一旦有變更都是靠個(gè)人去新建一個(gè)項(xiàng)目來(lái)驗(yàn)證很多時(shí)候模板已經(jīng)破壞了原有結(jié)構(gòu)卻不自知等到別人下一個(gè)項(xiàng)目才開(kāi)始暴露問(wèn)題?,F(xiàn)在有了CI自動(dòng)Dry-Run校驗(yàn)這類問(wèn)題被扼殺在代碼評(píng)審前。7.3 把t3code嵌入編輯器的快捷鍵如果你像我一樣頻繁生成代碼可以把t3code generate配置成VS Code的任務(wù)命令。綁定一個(gè)快捷鍵比如CtrlShiftT在項(xiàng)目里直接觸發(fā)重新生成。這個(gè)操作很爽的一點(diǎn)是改配置存盤按快捷鍵生成的代碼立刻更新編輯器的錯(cuò)誤提示瞬間消失。配置方式很簡(jiǎn)單在.vscode/tasks.json里寫一個(gè)任務(wù)定義把命令指向當(dāng)前工程的t3code generate --yes然后在keybindings里綁定任務(wù)快捷鍵。這樣省去來(lái)回切換終端的流程實(shí)際體驗(yàn)提升非常明顯。7.4 給生成代碼打上“自動(dòng)生成”標(biāo)記最后一個(gè)小技巧雖然在t3code里默認(rèn)不開(kāi)啟但強(qiáng)烈建議在團(tuán)隊(duì)的模板中增加一個(gè)統(tǒng)一注釋頭// This file is generated by t3code. DO NOT EDIT MANUALLY. // Source template: {{sourceTemplate}}加了這行注釋之后開(kāi)發(fā)者在代碼評(píng)審中看到生成文件會(huì)自動(dòng)跳過(guò)不會(huì)花時(shí)間去做代碼審查。團(tuán)隊(duì)成員也清楚哪里是生成代碼、哪里是手寫業(yè)務(wù)邏輯避免誤改覆蓋。我試著在模板里增加這個(gè)標(biāo)記之后團(tuán)隊(duì)溝通中經(jīng)常出現(xiàn)的“這個(gè)文件怎么改不了”的疑惑少了很多。我個(gè)人在實(shí)際使用中的體會(huì)是t3code真正提升效率的不是“從零到一千行代碼”那一瞬間而是把“項(xiàng)目結(jié)構(gòu)一致性”從口頭約定變成了可驗(yàn)證的自動(dòng)機(jī)制。代碼生成器很容易被誤解成銀彈它不是但它能解決很多光靠自覺(jué)解決不了的問(wèn)題。如果你也被重復(fù)建項(xiàng)目折磨過(guò)建議先用它跑通一個(gè)小項(xiàng)目再?zèng)Q定要怎么消化這套思路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产又黄又粗又猛大片 | 蜜臀久久久国产| 久久av无码| 国产美女口爆吞精视频| 欧美图片校园春色| 亚洲第一综合| 久久久久夜夜夜夜| 狠狠色婷婷| 综合一区二区影视| 国产刺激视频| 久久久96| 色制服丝袜夫妻av一区| 中出20p| 青草伊人网| 成人AV超碰免费在线| 日韩欧美视频青青| 26uuu国产成人综合| 国产有码一区| Blackedraw视频一区二区| 91色图片| 操91| 91精品国久久久久久无码| 操逼逼中文字幕| 啊啊啊啊啊啊啊啊要喷了| 最新中文字幕精品在线| 色臀AV| 久久99999| 国产这里只有精品| 92午夜免费福利视频| 97国产精品一区| 97se综合网| 亚洲导航深夜福利| 超碰免费人妻人人| 人妻天堂三区| 日本色日夜干| 欧美另类天堂| 青草影院内射高潮| 97在线视频免费看| 爆操无码| 亚一综合久久久久久久久久| 亚洲日韩国产精品| 国产人妖的免费的视频| 婷婷午夜成人色中色| 国产亚洲精品美女久久久| 99性爱视频| 日本免费中文一区二区三区四区| 欧美日韩国产电影| 青青草在线视频播放器| 91精品人| AV一区观看| 影音先锋少妇| 97精品熟女少妇一区| 免费观看的黄色的网站| 亚洲久热| 日韩精品电影| 超碰97COm中文| 黄色免费网| 入口操逼网站| 精品国产一区二区三区久久久蜜臀| 久久久久久久久久久久久久9999| 色麻豆AV| 欧美亚洲自拍另类人妻| 激情av| 天操老女人| 国产美女自拍视频| 久久欧美性爱视频| 色眯眯射| 少妇综合| 337p大胆噜噜噜噜噜91Av| av优播| 激情文学小说一区二区 | 色官网在线| 亚洲图片色图欧美另类| 亚洲精品成人动漫在线| 中国少妇XXXX做受| 在线一道啪| 91久久青青草原精品| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 国产 日韩 欧美一区| 久久有码视频| 麻豆成人AV| 亚洲另类色综合网站| 人人噜夜夜操| 亚洲熟女乱色一区二区三区久久久| 久久久久久亚洲精品中文字幕人妻| 18禁超污无遮挡无码免费网| 一级性爱视频免费观看 | 91黄射| 欧美第二页| 久久精品无码不卡| 操曰本熟女| 中文字幕人妻色偷偷久久皮 | 日韩人妻播放| 内射老妇BBWX0C0CK| 呦呦影院| 日本人人操人人操| 热久久无毒不卡| 偷拍片久久| 亚洲人妻熟妇三十三区| 久久偷偷色综合蜜桃| 色原狠狠天天天| 麻豆久久久久久久久丝袜| 中文啪啪视频| 婷婷色婷婷| 插入综合网| 强奸乱伦麻豆| 激情综合二| 午夜久久无码1000合集| 美女啊啊啊啊啊啊啊| 操穴国产| 亚洲影视综合| 五月婷婷五月天| 超碰在线综合97| 久久久精品中文字幕爱豆| 日本道久久综合色色| 狼人综合婷婷激情四射 | 久久综合激情| 91亚洲黄色网| 综合久久中文字幕综合日韩精品| 加勒比伊人综合| 欧美传媒| 欧美国产婷婷久久| 国产精品成人无码av无码免费| 熟妇在线视频一区二区| 97超级久久| 播播亚洲小说亚洲| 综合五月天| 久久婷婷色| 亚州精品人妻一二三区| 国模精品娜娜一二三区| 婷婷人妻激情| www.狠狠干.coom| 日韩日韩日韩-国产乱码精品一区二区| 久久精品国产99精品亚洲蜜...| 亚洲男人天堂Av| 日韩熟女操逼| 久久久熟女一区| 婷婷丁香久久| 中韩中文字幕在线观看| 精品久久久久久亚洲| 天天伊人| 色大香蕉97N| 在线看片国产精品每日更新| 天天亚洲| 天天干1区2区在线| 久久做97| 欧美 亚洲 综合 制服| 日本三级一区二区 在线| 欧美亚洲清纯| 日韩不卡码| 97人人干| 97任你吞精| 人妻精品视频一区二区| 97日韩欧美亚洲| 五月天婷婷欧美三区| 欧美92| 久久精精区一区二区一蜜桃一区二区| 无码日韩人妻av一| 国产中出内射一区二区| 四虎在线视频| 美女91网址 | 超碰久超碰久| 久久精品无码不卡| 久久久国产精品亚洲精品| caopeng97| a级成人毛片免费视频高清| 丰满少妇精品一区二区| 操人妻逼91| 九九激情网| 日韩欧美成人午夜福利| 一个国产在线综合网站| 亚洲成人无码影院| 欧美刺激色黄片免费看| 人妻少妇一区二区| 久无码| 成人日韩中文字幕| 操逼999| 国产大片精久久久久久| 久久这里都是精品| 天天摸天天插天天日| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 蜜臀操逼黄色视频操的好爽| 国产精品色片一区二区| 黄色视频特级毛片| 婷婷精品| 后入内射蜜桃臀| 欧美日本天堂| 亚洲精品 欧美97色色| 密臀成人视频久久久| 伊人91| 最新av网站在线观看| 国产成人无码高清| 欧美熟妇操操视频| 色香欲综合| 黄片qw| 青青草啪啪网| 激情五月天社区| 天天综合网在线| 亚洲视频精选| 97九色人妻| 密臀在线一区尤物| 五月丁香激情啪啪| 51一区二区三区| 中文字幕日韩人妻视频一区二区三区| 亚洲美女AV无码| 免費黃色視頻觀看一| 丰满精品人妻少妇久久字幕| 欧美18 在线观看| 97色插| 久久久一区二区三区四区五区| 女人爽到高潮潮喷18禁网站| 日韩本不卡视频在线观看 | 精品久久久久久无码| 欧美78p| 国产精品ww久久| 花野真衣| 国产一区自拍欧美日韩| 日本欧美m v精品网站加| 国产精品激情久久久久久久| 欧美性五月| 亚洲欧美一区二区网址| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚洲一区二区久久久久| 国产丁香精品露脸视频| 大香蕉碰碰| 大香蕉乱级| 久久深夜无码| 蜜桃av综合网发布| 大色综合| 天美传媒av在线| 亚洲精品第一| 加勒比综合88| 91九九九小逼| 日韩999| 亚洲色图 欧美| 啊啊啊好湿久久| 狠狠操官网| 色乱二区| 中国熟妇| 黑人粗大V S日韩女优视频| 性爱乱伦一区| 91精品91久久久中77777| 99国产精品人妻人伦| 青青操网| 91老熟女视频| 午夜精品久久999热蜜桃介男人用| 夜嗨影院| a片自拍直播视频| 婷婷九月国产| 精品久久在线区一区| AAAA欧美日韩| 久久久久久九九九| 成人久久久精品| 婷婷中文字幕| 国产一区二区三区白丝| 偷拍精品一区二区三区| 我想要啊 啊 啊| www.av在线观看| 天天综合91| 精品一区二区三区蜜桃臀www| 射 色综合| 激情国产乱伦Av| 女性喷水高潮在线观看| 精品久久久一本一道| 麻豆福利视频导航| 国产激情久久久| 九色精品视频导航1| 欧美色图 色综合图| 97久久精品亚洲| 欧美强奸一区二区诱惑| 收看日本人日bb| 亚洲精品97| 无码高清专| 88xx成人精品视频| 日本伦乱九九九综合| 精品女同一区二区三区| 精品熟妇视频一区二区| 日韩欧美天天爽爽爽天天爽爽| 色婷婷激情| 超碰人人超在线观看| 超碰97人妻免费在线| 久久久久夜夜夜夜| 91高潮| 99日视频在线免费| 色香网| 蜜臀th| 九区国产| 亚州国产成人精品女人久久| 男人把坤坤插入女人的下体 | 一级二级三级黑人无码| 国产精品福利资源在线尤物| 亚洲在线欧美| 中文字幕激情小说| 91精品丝袜久久久久久| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 91狠| 日韩人妻少妇 一区二区三区| 黄片com.| 久久亚洲av成人无码国产| 91爆操视频| 2018天天干在线视频| 无码高清少妇久久| 无码在线亚洲| 99性爱视频| 99色视频| 国产毛片毛片4p懂色| 欧美少妇色图| 国产在线视频午夜精华在| 在线视频免费观看午夜| 八戒无码国产午夜福利| 国产精品自在线发布| 久久久久久久国产视频| 狼人久草| 黄色乱论网站| 欧洲与亚洲欧美精品中文字幕| 亚洲色图欧美色图制服丝袜| 青青草白白色| 日产123区精品免费观看| 亚洲超碰综合网| 亚洲欧洲日韩中文字幕一区| 亚洲自拍97| 91性色| 操逼视频国产无套| 99热99在线播放激情| 去干网最新版| 日本不卡高清免v欧美日韩在线观看| 亚洲乱色视频一区、二区在线| 色五月69夫妻| 青青草导航在线视频| 亚洲成成熟女人综合一区二区| 97在线免费看视频| 欧美Aⅴ| 探花熟女,姿勢到位,體驗感也到位| 日本操逼视频导航| 丁香六月激情综合| 99青青草国产视频| 日本ZZ高免费A级视频| 丰满人妻-区二区三区| 日韩欧无码一区二区三区免费不卡| 国产伊人精品在线| 伊人一级免费黄片| 免费在线观看国内色片网站网址 | 99999久久久久9国产精品| 大香蕉手机在线视频| 97超级欧美| 国产午夜精品一区二区三区牛牛| 在线视频97| 乱伦图一区| 中文字幕五区| 亚洲极品| 大香蕉黄色一级片免费看| 99久久综合网| 日日A∨| 蜜臀久久99精品久久久久久无删减 | 综合干干干av久久久综合网| 夜夜爽夜夜摸夜夜操免费视频| 99re98| 激情五月天插| 伊人国产av| 撸无码不卡免费视频| 久久久久亚洲熟妇熟女| 精品色色| 青青草原成人| 欧美 日韩 亚洲 春色| 免费黄色A片| 天天综合有色网| 亚洲九九视频| 久草免费福利在线播放| 欧美日韩理论一区| 激情在线青青操| www.99中文字幕| 综精品久久久aaaa| 乱人乱色一区二区三区免费| 国产精品一区午夜福利| 亚洲瓯美色图| 富女玩鸭子一级毛片| 小情侣高清国产在线视频| 在线啊啊啊啊| 中文字幕啊啊啊在线观看视频| 和协影院中文字幕三区| 试看日韩黄片| 九九热精品免费视频| 黄页网站成人免费| 黄片aaaaa一区| 六月丁操逼| 久久久91| 五月综合久久| 日日骚一区二区三区| 亚洲高清无码在线桃色| 中文字幕女同在线| 插穴性爱视频在线观看| 亚洲精品国产精品乱码不卡| 日韩成人高清一区二区| 91色碰| 99久久99久久免费精品蜜臀| 欧美日不卡| 日本媚薬中文字幕在线| 麻豆久久视频在线地址| 狠狠超| 日韩人妻大香蕉| 97资源站日韩| 夜夜嗨一区二区| 97色综合中文网| 嗯嗯嗯好爽| 国语少妇精| 久久久一区二区三区四曲免费听| 亚洲自拍97| 性吧在线视频| 国产一级内射高清视频| 手机不卡视频不卡在线一二三区| 日韩免费簧片| 久草男人天堂| 干婷婷综合网| 国产嫩草精品A88AV| 大胆91| 亚洲国产丝袜熟女av| 久久男人的天堂国产| 国产女大学生AV| 99re不伦| 国产成人手机视频激情| 欧美精品,四区。五区| 日韩精品视频在线观看一卡二卡| 熟女熟妇一区二区三四区| 五月丁香六月| 在线播放免费av福利片| 日韩av影片在线观看| 自拍第一页| 骚逼高潮久久精品| 亚洲精品国产无码高清| 天天爱综合网| 日韩精品.久久精品.AV女优.天美传媒| 国产偷人伦激情在线观看| 亚洲色图欧美色图制服丝袜| 欧美一区二区日韩三区| 九草九九九| 色色色欧美| 午夜成人爽爽爽爽A片李冰冰| 神马久久网| 美国一区二区免费视频| 中文乱码字幕观看| 蜜臀AV成人精品蜜臀| 国产伦乱91| 玖玖综合视频| 午夜福利区| 超碰人人干| 张柏芝国产一区在线观看| 欧美亚洲日韩16色| 色婷婷小说| 欧美区亚洲区偷拍区| 青青草原香蕉日本Ap| 99re6国产精品99re在线| 中文字幕精品一区欧美| 曰韩少妇无码| 蜜臀久久99精品久久久久免费观| 97国产高清视频在线观看| 91色拍| 东方亚洲在线操逼天堂| 欧美性爱一内片一区二区三区| 久久久久免费看少妇A片特黄| 91少妇高潮| 性爱欧美五月| 五月天综合在线| 视频黄色国产一级| 乱操9999| 最新av在线| 1769精品一区二区三区| 国产成人无码a| 黑操B| 日逼国产| 成人aⅴ一区二区三区| 天天澡天天爽日日AV| 丰满欧美放荡少妇在线| AV在线资源| 国产按摩一区二区三区| 精品久久久亚洲AV成人网站| 日韩色| 免费日韩黄片| 91av熟女人妻| 91人人| 99re99在线视频| 精品一区二区三区四区外站| 久久一二三级一一一| 亚洲黑丝在线| 成人片在线播放| 永久免费发布性爱网| 秋霞免费无码视频日韩A片| 麻豆成人影音在线| 久久东京热久久| 蜜桃臀AV在线| 午夜福利 成人 91| 国产精品农村妇女精品| www.久久超碰| 亚洲九九视频| 人妻在线大香蕉| 欧美香蕉视xxx| 热久久91婷婷| 婷婷综合在线观看| 亚洲综合在线高清| 99九九久久| 台湾肥佬网一区二区三区| 亚洲综合另类欧美久久久| 高清国产av无码| 一级啊性爱在线视频| 中文操嬖片。| 欧美特大黄一级片片免费| www国产天美久久久| 一本一道vs波多野结衣| 欧美在线播放aaaa| 这里有精品| 亚殴在线| 9国产超碰| 丰满美女一级毛片在线播放| 日韩人妻一二三区视频| 日本性爱网址| 欧美日韩91| 日韩精品 资源| 国产日本熟女顶级一区二区三区视频| 不卡九肏| 麻豆 亚洲 97| 日本天堂在线播放| 91精品老女人| 在线观看高清AV| 女同性恋久久| 国产AV超爽| 开心五月深爱五月| 欧美色997| 精品无码一区二区| 97精品久久久久中文字幕| 九九九九97| 破处bbq| 搡老女人老熟女91| 不卡一区二区日本视频| 99自拍视频在线| 性感女人网页在线观看视频| 国产亚卅97| 色哟哟精品1精品2| 欧美一二三| 免费亚洲黄色视频在线观看| 久久综合99| 91伊人大香蕉| 久久粉色| 日韩亚洲精品一区二区| 日韩性爱电影一区| 青青色综合| 欧美九一精品久久久熟妇| 九九亚洲| 91精品人妻电影| 最新一二三区视频| 欧亚韩国999| 水多多映视AV| 操逼视频免费日韩无码| 欧美激情综合| 久久久久久久久久久久欧美日| 91中出视频| 免费看片黄| 色一情一乱一乱一区91Av| 欧美自拍偷拍综合图片| 婷婷色网| 国产风韵犹存熟妇三区| 日韩电影在线观看网址| 久9热| 中国小夫妻勾搭露脸淫荡对白| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 欧美人妻久久精品二区三区| 97二区四区| 天天躁日日躁狠狠狠躁| 色官网色综合| 老熟女区| 国产精品爆乳懂色蜜乳| 精品超碰中文在线| 亚洲精品国产拍免费91在线| 93人人操人人| 亚州色图欧美| 久久亚州精品成人Av无| 天天做天天爱天天爽AV| 秋霞 色色| www五月| 青青久草| 色爱国产| 黑丝制服中文字幕 | 97色综合中文网| 欧美强奸乱| 人妻丝袜肏逼| 久久香蕉综合一本到3atv| 丝袜av一区二区三区| 欧美精品庄| 丁香六月激情综合| 竹菊一区二区三区AV线| 四虎影院成年人片| 欧美淫乱视频| 999国产精品999| 2019亚洲男人天堂| 久久久国产av美女私房| 国产传媒日本欧美专区| 久久产精品一区二区三区电影| 天天日天天插| 国产丝袜高跟美女av免费观看| 精品久久久久久中文| 夜夜高潮夜夜爽高清视频一 | 在线不欧美| 91黑丝在线播放| 天天操妹子| 99日免费视频中文字幕| 国产av又色又爽又黄| 品亲网欧美品亲网| 亚洲乱码尤物193YW| 国产熟女| 欧美麻豆成人同性GⅤ在线| 国产诱惑| 99综合视频一体| 啊啊啊操死我| 亚洲天堂自拍| 日韩无码黄色片| 久久机热| 26uuu欧美| 日韩兔费看黄片| 欧美情色男人的天堂| 91操熟女| 久久久久78| 国产高清精品福利| 国产97亚洲| 超碰在线974| 国产传媒操逼视频| 99精品无码| 国产日本熟女顶级一区二区三区视频 | 欧亚性爱视频免费看| 大香蕉2017| 丝袜美腿欧美| 萌白酱自拍视频| 亚洲在线综合| 好爽,再快点啊哈嗯嗯嗯嗯| 亚洲色图欧美色图日韩色图| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 国产后入清纯| 亚洲精品一区中文字幕乱码| 97综合网| 台湾佬中文娱乐网久久久久久久久久com | www.色操逼| 国产精品香蕉| 精品一国2| 久久久久久久国产视频| 另类图片天天影视| 白丝AV网站| 无遮挡猛进视频免费无限观看| 欧美色狠| 热久久无毒不卡| 天天干天天拍| 国产精品无码在线| 人人操,人人液| 北条麻妃性愛视频| 蜜臀久久99精品久久久老,,| 操逼无码一区| 97色碰| 97超碰亚洲| 夜夜爽77777| 欧美国产伊人久久久久| 97色综合中文网| 中国国产精品一区视频| 丝袜AV一区二区三区| 青青草视频在线观看一区二区| 免费A V在线| 国内精品a| 久久色网| 内射中国少妇高清视频免费视频| 秋霞午夜视频一区二区| 成人在线视频二区| 大香蕉久操| 国产小黄片在线免费观看| 久热精品在线| 亚州Av天美传媒| 人妻在线大香蕉| 欧美日韩资源在线| 国产女人高潮视频| 97超碰免费人人性爱| 色悠久| 亚洲少妇色| 91天天| 九九九久千久久激情蜜桃在线看 | 久婷婷一区| 野狼激情网| 日韩人妻一区二区精品| 偷拍三区| 97chaopengongkai| 欧美97日韩精品| 欧美少妇第一页| 色青青久久影视| 啊啊啊啊网站| 风间由美日韩欧美久久| 人澡逼| 乱伦AVxx| 国产免费一区| 日韩电影天堂视频一区二区| 97天天综合网| 亚洲精品国产AV天美传媒| 97超碰国产亚洲精品资源| AV九九| www.狠狠操| 丁香五月天啪啪| 亚州精人品大香蕉| 国模吧 一区二区三区| 人妻色偷色噜| 眼镜人妻101.com| 澳门黄片一香蕉视频| 插入逼91| 成人av影院在线观看| 亚洲图片另类| 欧美欧美啪啪视频| 上特色A在线| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 日韩欧美视频青青| 夜夜嗨AV一区天天| 嗯……啊…嗯嗯…啊…好舒服| 91色综| 后入内射蜜桃臀| 欧美白嫩在线放| 久久久久9999精品九九九| 超碰一区二区| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 搡老女人老91二区| 亚州综合色| 国产精品一区二区手机看片| 日韩精品一区二区日韩| 日韩一区二区三区四区五区| 91久久久久久| 动漫片子网站3黄| 新视频sss国产| 天天看片麻豆| 日韩本不卡视频在线观看| 玖玖爱影院| 久久AV无码AV| 久久一级无码精品毛片6| 99热这里只有精品地址| 中文字幕老熟妇黄色视频| 美女97超碰| 中文字幕一二三av| 日韩啊V| www网站黄| 91丝袜美女| 蜜桃精品一区二区三区久在线| 男人天堂2019| 草草影院最新网址| 99这里只有精品| 国产精品一二三免费网站| 久久99精品九九久久久婷婷| 男人的天堂视频精品乱在线| 天天草夜夜草高潮片| 五月天激情四射| 欧美72网页| 97在线视频网站| 精品国产一区二区三区四区在线看| 天天色播亚洲综合网站| 中文字幕丝袜人妻| 久热伊人| 亚乱色| 国产怡红院| 欧美在线天堂| 欧美精品1区2区3区| 婷婷香网站| 思思热一热婷婷热一热| 天天操天天射青青草| 91成人亚洲色图| 日韩无码操逼片| 蜜桃成人1区2区3区| 亚洲天堂电影网99999| 99老司机精品视频在线观看 | 99久久久无码国产精品性啊聊| 国产精品一区二区黄片| 狠狠躁天天躁日日躁| 欧美色人| 六月婷婷综合| 91色人| 欧美黑人精品在线播放| 最近的最新的中文字幕视频| 青青伊人加勒比海| 97资源视频| 久久9精品视频| 深夜国产福利| 99热日本| 使劲用力艹少妇视频一区二区| 加勒比综合网| 操逼网站视频漫画国产| 天天天天天超碰| 欧美激情性久久久久久| 日韩av三四区| 九九综合九九综合| 91超碰人人| 啊啊啊啊啊啊在线观看| 99免费视频| 欧美日韩欧美| 狠狠色综合网| 熟妇激情| 五月丁香婷婷啪啪| 欧美色老汉| 日韩另类| 中文字幕激情小说| 99热精品在线| 国产女人视频三四五区| 精品视频日日夜夜| 电家庭影院午夜69久久夜色精品国产69乱| 天美av在线观看| 久久大黄片| 色九九九综合| 大香网站| 久久少妇视频| 欧美日韩操逼动图| 精品久久艹| 熟女这里只有精品6| 97人肏| 国内毛片欧美香蕉精品| 人妻无码后入| 狠狠久久手机视频精品| 91九久| heyZO天然素人无码AⅤ专区| 九九色逼| 91精品网站| 五月天春色激情网| 少妇人妻好深太紧了vr91| 禁十八久久| 国产免a费看黄片在线| 九99久久| 五月天婷婷欧美三区| 久久久久久久强迫| 亚洲 无码 有码 中文字幕| 欧美亚洲高清| 一区二区三区四区五区高清无码永久视频| 久久精品日韩| 青青操97| 日本免费人成视频播放120秒| 97bbn| 热九九精品| 无码高清操逼| 国产91精品久久久久久久网曝门| 尤物黄色在线观看网站| 欧美草草| 天天看天天综合成人网| 欧美 日韩 亚洲 春色| 97操综合| 国产精品久久9| 91人妻中文| 国产熟女无套内射| 69AV女优男人的天堂| 凹凸久久人人| 天天干人妻视频| 激情五月天综合网| 精…码一二三区| 97爱b| 久久91精品国产9丨久久分亭| 久操免费电影| 亚洲欧洲无码97久久精品| 久久久久成人亚洲国产| AV天堂因数| 嗯嗯啊啊视频一区二区三区| 国内毛片无码一级毛片| 五月天我淫我色av| 精品人妻少妇| 精品网站9999| 亚洲啪啪性视频| 国产精品午夜福利亚洲综合网| 午夜精品久久久99热蜜桃的功能特点| 久久熟女人| 欧美麻豆成人同性GⅤ在线| 日韩精品中文字幕人妻| 亚洲第一页色网| 日韩 欧美 校园一区| 久久精品国产精品亚洲艾通辽熟妇 | 久久午夜鲁丝片| 麻豆91熟妇人妻中文字幕茄子| 超碰中文字幕人妻草一区| 亚洲国男人的天堂| 偷看洗澡一二三区美女| 国产精品爱欲| 中文字幕青青草| 2017天天透天天通天天擦| 五月婷婷六月丁香| 国内自拍 日韩激情 99| 国产亚洲精品玖玖玖在线观看| 天天看天天干| 20cm女自慰在线日韩欧美| 四虎精品一区| 超碰午夜| 亚欧美天堂在线| 婷婷六月天| 亚洲国产精品9999在线观看| 97Ai亚洲| 快播久久人人aV| A男人的天堂| 伊人色综合超碰| 欧美日韩人人精品| 91人人看| 日韩在线女优天天干| 东京热亚洲一区二区| 日本岛国黄色网址| 人、人、摸,人、人、草| 中文字幕一区二区免费在线| 欧美性爱精品七区| 91久久久亚洲| 屁股久久久久久| 综合色好色| 免费国产视频| 69一区二区三区 | 国产精品无码av| 乱伦强奸区日韩| 蜜臀网址在线| 亚洲天天自拍| 男人的天堂com| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 大白逼三四级| 亚洲精品国产拍免费91在线| 精品人妻一区二区蜜桃视频| 一本色道久久综合精品婷婷| AV色女综合| 好吊色综合| 操国产高清| 亚洲精品蜜桃久久久| 狠狠躁日日躁夜夜躁A| 96精品久久久| 全国男人天堂网| 亚洲美女精品九九视频| 97这里只有精品| 大屁股人妻女教师撅着屁股| 亚洲欧美综合| 999精品国产高清一区二区| 欧美丝袜制服久久| 91性高潮久久久久久久久| 熟妇熟女视频一区二区三区| ,国产乱人伦精品一区二区三区| 先锋精品av色鲁| 久九九九九九九热| 欧美大片一区二区三区| AV在线播放网址| 熟妇人妻精品一区二区| 人妻少妇久久中文字幕一区二区 麻豆 | 囯产精品久久久久久久久久二区三区| 亚洲中文字幕av| 久久一区二区三区四区五区| 日韩成年人性爱视频| 国产家庭乱伦性爱视频| 色婷婷99| 久久九九一区二区三区成人| 亚洲鸥美色图| 60秒不遮不挡| 国产精品爱欲| 国产精品99久久久www| 欧美黄页在线| 久久视频少妇美女| 91社区伊人| 最新av中文字幕高清| 丰满人妻av一区二区三区| 欧美日不卡| 亚洲国产青青| 国产精品久久久| 精品国产人成在线| AV 少妇 人妻 偷拍| 日日骚 av| 成人青青草原伊人| 欧美日韩另类在线播放| 精品一区二区3区| 欧美色日| 思思视频免费看网站| 婷婷五月天伊人| oumeizonghese,www| 亚洲性网| 日韩中文字幕在线视频观看| 日韩伦理久 久久 清纯| 久久亚洲熟妇在线视频| 亚洲风情在线观看| 精品v日韩欧美国产| 伊人五月天青青草婷婷| 亚洲人综合| www.99色| 嗯嗯嗯啊啊啊操的我好爽| 四虎影视国产精品| 巨爆乳一区二区爆乳区| 色色色色电影网| 人妻少妇色综合| 东京热一区二区中文字幕| 精品超碰国产| 玖玖资源中文字幕制服丝袜| 男女一进一出视频久久| 欧美丰满少妇xx高潮| 青青国产精品在线| 激情四射婷婷六月天| 92性色国产午夜福利在线661 | 4虎在线视频| 成人小说视频在线精品欧美| 熟女丰满人妻一区| 91中文字幕制服丝袜免费视频| 青青免费在线视频一区| 人人色97| 亚洲综合在线91| 熟女色综合久久| 91色综合色| 天天看天天在线精品| 欧美 青青草| 欧美人黑A片无码免视费| 骚逼高潮久久精品| 男人的天堂com| 中文字幕av乱伦| 十八禁电影伊人网| xxx0国产在线播放| 18精品一区| 超碰97人妻在线| 欧美日韩理论一区| 亚洲精品久久久久毛片A片拉屎 | 丁香五月激情综合| 久久精品无码一区二区三区| 国产精品视频精品一二| 综合网亚洲在线| 欧美日韩国产色图在线| 蜜桃狠狠色伊人亚洲综合 | 99re99在线视频| 免费观看啪视频| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 9国产超碰| 嗯啊啊啊轻点视频 | 久久亚洲熟妇在线视频| 又大又长又粗又爽又黄| 97爱b| 强奸乱伦资源| 国产精品色约约| 欧美日韩第一页| 久久超碰天天| 五月激情影院| 丝袜美腿av女优在线| 久久久久国产亚洲一区欧美色图日韩 | 91综合在线| 天堂资源欧美| 日韩黄片视频试看| 亚洲影视第一页| 九九伊人网| 少妇久久久久久久久| 亚洲国产精品久久久男人的天堂| 高清无码一区二区三区| 日本黄色天堂| 国语av最新自产拍在线观看| 亚洲天堂加勒比| 久久久久久久九九九九九九| 国模私拍一区二区三区神乳| 天天干1区2区在线| 激情开心五月天| 啪啪啪精品| 99这里只有精品| www鬼畜国产男人的天堂| 377p欧洲日本亚洲大胆| 欧美第五页| 天天影视网综合少妇| 中文字幕国产| 是还免费视频1727我| 无码少妇精品一区二区60岁老人| 欧美性性性| 偷拍亚洲高清图片| 亚洲乱码国产乱码精网站| 日韩97在线| 久久精9| 夜夜草网站| 欧差乱伦二三| 18精品一二区| 丰满人妻-区二区三区免费| 天天射天天| 熟女高潮精品一区二区| 99热色精品| 国产午夜精品理论片一二三区区| 东京热AV男人的天堂| 日本一二三高清| 日本不卡一二区| 在线综合 亚洲 欧美中文字幕| 色综合 加勒比| 欧美A√综合网| 五月激情综合网| 国产无马视频| 亚洲欧美91√| 久久一二三四不卡| 人人人人人人少妇| 操逼逼中文字幕| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 青青草在线视频人人想人人上| 26uuu国产日韩综合在线观看| 97色综合中文网| 国产精品久久发布| av资源在线观看少妇| 蜜乳AV一区| 天天久久| 综合天天。| 精品一区二区三区四区外站| 国产视频一区二区三区久久亚洲天堂| 一级A片女人高潮叫床| 成全在线观看免费观看| 中文乱码字幕观看视频| 另类成人首页一区| 伊人网在线观看| 日韩av女优在线免费一区| 久草免费在线一区二区| 中文AV制服乱伦| 98久久超碰| 亚洲涩图欧美| 青青青操| 色色色999| 日va操| 精品无码久久久久久久久果冻糖心| 69久久| 欧美天天谢综合网| 玖玖97综合| 丁香五月色| 翔田千里一区二区三区奶水| 国产精品午夜AV完会免费| 91色欧美| 国产精品一区二区麻豆| 欧美在线 亚洲| 蜜桃色院一区久久 | 欧美日韩亚洲一区二区在线观看| 色吧 综合| 色综合一本| 国产99999| 亚洲日韩电影| 日韩欧美亚洲自拍偷拍| 一区二区三区高清| 91精品人妻一品二品三品| 97在线播放| 美女上床网站| 91美女片在线| 久久有码视频| 欧美人妖内射| 亚洲色人阁| 美女诱惑久久| 麻豆91熟妇人妻中文字幕茄子| 97超碰色情| 色婷婷五月天| 天堂av2019| 天天综合网在线| 亚洲激情色片| 色网在线| 色九九久九九| 色约约一区=区三区| 欧美92| 欧美一区二区三区不卡高清视频| 2024黄色视频| 奇米狠999| 欧美专区日本专区| 久久这里只精品99re66图| 亚洲高潮少妇| 精品国产自在在线99| 人人操天天爽| 日韩精品影视| 亚洲国产97| 欧美性性性| 91一区二区三区蜜桃| 国产精品制服丝袜清纯唯美| 五月综合婷婷久久网站| 99热精品在线播放| 91亚洲影院综合| 国产乱码精品久久久久久| 欧美在线干| 私人尤物在线精品不卡| 日本性交操一区二区不卡系列| 日韩综合成人免费视频| 性色av婷婷久久一区二区点复制| 日本熟妇一区二区三区| 91久久国产精品| 国产三级中文字幕粉嫩| AND人妻系列|