色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
一牛影视久久久一区二区三区| 岛国激情视频软件| 国产精品一区人妻精品阁在线| 超清福利精品视频在线| 久久久久久人| 这里都是精品| 久久久久921| 天堂九九九九九九九九九| 欧美熟妇色| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 久久黄色视频一区二区三区 | 亚洲91大片| 大香蕉九九| 激情黄色片在线观看| 夜夜精品视频一区二区| 口爆欧美91| 婷婷97| 国产成人无码啪| 超碰97伊人| 亚洲吊色| 精爱久久| www老逼91| 九九综合久久| 啪啪啪精品视频| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲男人的天堂一区二区| 天天天天天干夜夜夜夜夜操| 日韩色欲久久一二三四区| 国产自制av蜜乳| 亚洲深夜福利| 日韩日韩日韩-国产乱码精品一区二区| 国产乱弄免费在线视频。| 99热婷婷| 亚洲天堂,男人| 91精品网站| 亚洲欧洲色情高清| 亚洲 综合 第一页| 超碰97久久| 日本性爱网址| 最新一二三区视频| 99re视频这里只有精品| 欧美性爱系列| 亚洲第91页| AV中亚| 成年人一级黄色毛片大全在线观看| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 国产久久一区二区午夜| 国产亚洲精品激情| 精品国产网站| 亚洲精品一二牛牛| 97超碰人操| 99久久婷婷国产综合精品草原| 天天综合91入口| 男人天堂站| jizzjizz欧美| 另类TS人妖一区二区三区| 色偷综合| 免费9 1久久| 综合av社区| 色欲久久99国产精品久久久久久| 九99久久| 欧美日韩不卡传媒| 97干在线视频| 国产91乱伦| 欧美97在线观看| 18禁免费视频| 91中文字幕| 伊人一区二区三区| 国产精品一区二区亚洲人成毛片| 91久热| 玖玖爱一区在线| 香蕉久久国产AV一区二区| 2017,超碰| 亚洲熟女乱综合一区二区三区| 亚洲情色电影网| 色人久久| 噜噜吧,噜噜色,噜噜| 欧美日韩国产黄色片| 国内精品嫩模A∨私拍小视频| 国产久久免费精品视频| 欧美性生活免费网| 国产在线精品偷| JULIA一区二区三区在线播放| 亚洲 欧美综合| 久久久久久九九九九| 久艹日日日| 日本性交操一区二区不卡系列| 欧美激情激情xxxx欧美专区| 国产高清免费不卡av| 日本欧美国内在线| 99re99视频在线免费观看| 日本九九久久99| 国产女人高潮视频| 亚洲青色欧美| 99热这里都是精品| 久久超碰97| 亚洲人成在线放东京热| 色哟哟AⅤ| 国产精品99精品视频网站| 亚洲欧美日韩制服另类| 六月色色| 色婷婷99| 樱花草社区www中国| 国产后入清纯| 日韩78m视频| 欧美激情亚洲| 天天综合网一91网| 青青草在线视频播放器| 91丨熟女丨丰满熟女| 伊人五月天青青草婷婷| 国产性爱欧美性爱在线| 久久精品28| 午夜a成v人电影| 96久久精品一二三区色欲| 国产精品麻豆成人AV艾秋| 加勒比久久av| 大香网伊人久久综合| 亚洲综合射| 免费少妇一区二区| 91久久伊人婷婷青青草| 国产精品美女久久久久久网站| 国产又大又粗又长视频在线| 欧洲亚洲天堂精品 | 人人做,人人操,人人摸| 欧美一区二区在线资源| 国产一级不卡在线观看| 色97综合中文字幕| 1000部熟女视频在线观看| 九色精品视频导航1| 操香逼| 亚洲 日本 国产 综合| 亚洲视频小说| 日韩精品中文字幕二区| 男人天堂网手机版婷婷| 欧美一级黄片视频在线| 国产精品久久久久久久免牛肉蒲团 | 强奸乱伦AV一天堂网| 国偷自 一区| 黄色小视频日本txt| 中亚黄色三级大片| 国产精品岛国片在线观看| 大香蕉www.超碰| 亚洲国产剧情少妇激情| 日韩精品人妻一区二区| 大香蕉 222| 97在线观看播放视频| 人妻天天爽夜夜爽2| 日韩偷拍色图| 日本午夜久久电影| 亚洲欧洲无码bt精品合集| 亚洲熟妇熟在线电影视频| 在线有码中文字幕| 亚欧成人一级片在线播放| 国产青视频| 探花熟女,姿勢到位,體驗感也到位| 1024亚洲中文字幕久在线看片你懂的 | 曰本熟女视频| 亚洲图片偷拍视频区| 夜夜夜夜久久久久| 亚洲日产专区婷婷| 欧美老妇女内射网址| 蜜臀久久99精品久久久老,,| 激情综合五月丁香| 欧美中出1| 黄片qw| 九九九九九精品| av大香蕉| 黑人精品成人一区二区三区| 九九综合久久| 黑丝少妇在线观看| 北约熟女超碰| 性夜影院爽黄A爽免费动漫| 亚洲黄色网址| 中文字幕一区二区三四五区日日骚| 美女啊啊啊啊pc| 色色色99| 欧美一级做a爰片免费视频| 国产精品久久天天干| 精品人妻一区二区三区四区石在线 | 国产精品永久免费10000| 大香蕉免| 国产人妻一区二区三区欧美毛片| 日韩久草| 亚洲色图亚洲无码强奸乱伦| 久久,精品一二三| 台欧久久精品视频| 极品后入免费视频| 超碰九九| 婷婷激情五月天小说网| 五月丁香色综合| 中文字幕片| 97一区二区蜜臀| 色噜噜综合网| 亚洲乱色视频一区、二区在线| 日本狠狠干| 九九色热| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 婷婷六月天| 欧美男人一区| 另类 综合 日韩 欧美 亚洲| 欧美精品激情| 中文字幕中文字幕一区二区| 欧美天天谢综合网| 日韩电影免费网站麻豆视频| 78m啪啪啪| 久久久久久久久久久久色网| 欧美性爱日韩高清| 无码99| 91熟女视频网| 综合伊人激情| 8x福利精品第一福利视频导航| 天堂中文日本在线观看| 天天爽天天| 色 亚洲 91| 国内伊人久久久久久网站视频| 色综合久久av| 国内操逼视频二区| 欧美gv在线观看| 骚妻少妇精品性色无码四色A V| 人人摸人人干人人拍97| 国产AV中文| 99热国产精品| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 婷婷影院入口| aaaa少妇高潮大片| 亚洲激情av| 啊视频在线| 超碰在线人妻| 熟女一区二区| 色眯眯av| 麻豆色约约| 日韩美女高潮喷水视频| 天堂综合| 东京热精品97综合网| 人妻在线大香蕉| 精品国产72| 国产精品情侣啪啪| 日日日骚女人精品| 91激情国产| 骚日日av| 99热| 超碰国产精品久| 欧美一区二区三区入口| 亚洲欧美一区二区三区在钱蜜桃| 超碰成人国产| 蜜桃成人1区2区3区| 少妇被玩视频二三区| 久久久久久夜夜夜夜夜| 国产suv精品一区二区四| 四虎AV无码| 色男人色天堂东京热| 激情五月天色播| 日韩女优在线| 中文无线日韩一区| 久艹日日日| 国产精品久久久久久久AV大片 | 琪琪精品免费一区二区三区| 五月丁香综合| 97AV爱| 亚洲天堂东京热| 超碰av人人人| 久久精品72| 久久色AV线| 操东北女人| 一区二区影院| 欧美日韩国产中文超碰| 爱妻综合网| 97超碰超碰| 日本色色色视频| 花野真衣| 欧美草草高清日韩视频| www亚洲免费| 99久久婷婷国产综合精品草原| 蜜臀精品1区2区| 国产精品高朝久久久久久久| 97色欧洲| 久久久精品成人国产| 国产伦精品一区二区三区视频女| 九七人妻在线| 国产9 9在线 | 亚洲| 性爱av在线免费观看| 九九伊人网| 亚洲91网。| 美女丝袜激情小说| 天天看精品动漫视频一区| 亚洲精品视频在线播放| 色欧洲97| 亚洲小电影免费涩涩成人在线高清| 日本www操操操| 青青草视频导航官网| 久久久人妻| 性做久久久久久免费观看软件| 青青草视频久久久久| 国产精品粉嫩福利在线| 精品久久久久av影院| 久久久久久性爱视频| 九九九九九九精品| 综合一区中亚洲国产成人综合精品| 91在线丝袜视频| 91综合色噜噜| 亚洲情色一区三区| 被男人吃奶很爽的毛片| 日本精品成人无码| 国产精选视频| 久久精品性| 久久久少妇诱惑精品视频| 亚洲精品白浆高清久久久久久| 亚洲天天艹| 大香蕉手机视频| 97综合久第一页| 久久亚洲精品成人av| 伊人991| 超碰91在线| 熟女丰满人妻一区| 欧美日韩色综合网| 色亚州人久干视频在线观看免费版| 97人人夜夜精品视频| 欧美老妇综合网| 国产亚洲精品激情| 伊人午夜福利视频| 国产精品老师| 欧美精品精品一区二区| 亚洲操人| 欧美色图99| 无码99| 久久老女人| 大香蕉综合| 乱性AV| 熟女啪啪视频| 亚洲中文国际强奸字幕| 天综合网欧美| 亚洲无码99| 午夜视频久久久| 色婷婷网| 女欧美一区二三区| 亚洲天天影视综合网| 国产精品免费日韩| 97伦乱| 99色视频| 91狠狠综合网| 加勒比av网| 国产女人与拘做受视频免费| 婷婷精品久久av影视| 亚洲一级性爱视频免费看| 舔人妻中文免费视频| 婷婷爱五月| yw尤物av无码点击进入麻豆| 玖玖爱伊人玖玖爱| 少妇无码太爽| 午夜福利激情在线视频| 婷婷性网| 超碰中文字幕人妻草一区| 欧美很很操视频| 极品销魂美女一区二区| 黄久在线| 天美传媒AV国产在线| 久热九九| 亚洲 欧美 偷拍 唯美| 999国产精品999久久久久久| 亭亭丁香激情| 色五月婷婷中文字幕| 蜜臀99久久精品久久久久久| 翘臀vidoes| 操逼操逼逼操操逼91 | 97超碰欧美精品| 免费网站观看www在线观| 日本精品高清一二区一本到| 九九草| 很狠操| 亚州色图狠狠干| 成人乱码一区二区三少妇| 日韩兔费看黄片| 久久青娱乐| 老女人碰碰在线碰碰视频| 先锋精品av色鲁| 囯产操逼片| 涩涩这里只有精品视频| 狠狠干91| 国产精品久久久久久久久久久久久久吹 | 国产白领连续中出在线观看| 亚洲另类综合欧美| 亚洲男人天堂Av| 日本性爱网址| 日韩不卡a级视频专区| 精品久久无码午夜福利| av亚欧| 色综合1991| 粉嫩久久久久| 国产60区。| 亚洲综合精品国产一区| 小情侣高清国产在线视频| 无遮挡又黄又刺激的视频| 91欧| 色爱亚洲| 青青草好吊色| 97亚洲精品| 大香蕉手机在线| 啊啊啊啊啊啊啊在线| 怡红院成人av| 亚州色国| 人妻天天爽夜夜爽2| 色狠人在线99| 91天天爱| 欧美亚洲清纯| 91bbbbbb| 四虎在线视频| 欧美熟妇精品黑人巨大91| 天堂av最新电影网| 伊人91| 国产视频人人网| 草草草视频在线免费看| 亚洲毛片基地专区| 国产精品懂色tv影视免费观看| 中文字幕欧美日韩三级| 欧美日韩另类在线播放| 黄在线| 欧美日韩第一页| 青青操狠狠撩| 欧美日韩高潮喷水91| 少妇免费视频| 色踪合AV| 91亚洲人| 草草电影院| 色综合久久av| 欧美操人| 中文啪啪视频| 超碰天天操你比| 97 国产精品| 欧美爱爱97| 熟妇xxxxx性春色| 亚洲熟女av日韩熟女| 精品成人av一区二区三区在线| 色婷婷五月天| 久悠悠av| 欧美综合第一| 国产成人五月天丁香花| 尤物视频一区| 人妻少妇精品一区二区三区| 欧美一级专区免费大片| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 在线天堂999| 亚洲蜜臀视频精品久久| 成人国产视频在线观看| 温婉少妇玩3p| 91在线|亚| 香蕉大久久久| 婷婷爽人人婷婷爽视频| 欧美午夜一区二区三区| 欧美久久久15P| 日本三级韩国三级美三级91| 亚洲中文字幕在现观看| www.久久99| 深夜啪啪啪视频免费| 精品久久九| 91亚洲欧美| 国产无马av| 99久久com免费视频′| 亚洲国产中文字幕| 久久精品国产AV一区二区三区| 久久性爱城| 久久久久国产| 成人无码在线视频网站| 成人贴图日韩欧美| av东京热男人的天堂| 天天肏天天干| 色婷婷丁香五月| 蜜臀无码一区二区| 麻花豆传媒剧国产MV出差| 人妻久热在线| 啊啊啊啊操死我| 天天躁日日躁xxxxx| 国模精品娜娜一二三区| 操逼精品视频| 综合亚洲欧美精品日韩?v| 亚洲国产成人精品无码专区| 男人的天堂2000| 日韩无码精品综合久久| 歐美一級亂黃99在綫精品| 国产传媒一区二区三区| av在线免费一区二区| 亚洲综合99999| 玖玖久久久| 99精彩视频| 亚洲黄色AV电影| 大香网站| 本道在线| 91 刺激在线| 男同专区一区二区三区在线| 大香蕉操久久| 精品国产Av无码久久久伦古装| 嗯嗯啊中文字幕| 蜜臀久久99精品久久久久久酒店| 欧美日韩m| 日本人妻最新在线中| 人妻天天爽夜夜爽精品2| 91肉丝| 久久欧美1卡2卡3| 9I1性色影院| 激情婷婷丁香| 亚洲欧洲日本精品中文a∨| 午夜一区| 蜜臀AV一区二区三区| 青青草日韩无码| 老熟女91| 久久精品国产99国产精品亚洲| 国产精品蜜臀久久久久无码AV| 四虎视频在线观看| 欧美一级做a爰片免费视频| 亚洲激情天堂网| 国产精品亚洲色婷婷久久久| 毛片17S| 污污汅18禁网站在线永久免费观看 | 日韩性爱一级片| 手机久操欧美综合色码| 26uuu国产免费观看| 女优大全 - 91n| 欧美精品偷拍| 无码高清专| 欧美姓爱综合网| 少妇与黑人高潮在线| 人妻人人做人人澡人人爽欧美一区| 欧美天天在线| 亚洲日韩av一区二区三区百合| 一级片在线观看高清无码| 9999九九九久久久| 欧美精品成人亚洲| 狠狠色噜噜狠狠狠狠狠色综合久久| 欧美操逼录像国产黄色国产| 玖玖爱一区在线| 日韩成人大片在线观看| 国产精品视频在线观看| 狠操91,com| 婷婷香蕉欧美在线一区二区三区 | 精品人妻一区二区三区在线视频不卡| 禁十八久久| 国产精品久久久久久久久久梁医生| 婷婷啪啪| 亚洲图片欧洲图片aⅴ| AV中亚| 男人天堂网手机版婷婷| 亚洲五月丁香花狠狠干一区二区三区| 一区二区三区探花在线观看| 蜜臀在线视频| 综合亚洲欧美| 青青草日本中文字幕| 国产超碰在线| 国产亚洲精品自在线亚洲情侣| 男人的天堂午夜av| 日日干夜夜操视频h| 玖玖久久久| 婷婷久久久精品| 婷婷五月天无码| 黄页大片在线观看| 九九99久久| 操逼操网| 操操逼操操逼操操逼逼| 亚洲情欲| 蜜臀久久99精品久久久久久无删减 | 国产黄色在线播放观看| 黄站在线免费观看| 国产噜噜噜噜噜久久久久久久久| 日本不卡码黄色| 亚洲欧洲偷拍一区| 九九成人视频| 亚洲精品视频在线播放| 新久久AV| 久久久亚洲| 超碰在线一区二区三区| 在线中文AV| 国产天天看| 日本99一区二区| 看日韩美女二区三区免费操逼视频| 老司机福利青青草| rion磁力链接| 久久超碰97| 999综合网| 亚洲欧洲成人在线电影| 欧美色www亚洲国产阿娇要播| 国产精品96| 97精品久久久久中文字幕| 蜜桃久久久久久| 超碰午夜在线| 久久久久久久少妇| 69人妻精品丰满熟女区| 久久大线蕉一区| 东京热亚洲一区二区| 亚洲欧洲综合视频在线| 一区二区三区欧美激情| 大香蕉一线视频| 日韩黄色成人性爱| 人妻激情偷乱视频一区二区三区 | 懂色av中文字幕一区二区三区天美 | 物业黑人 AV一区| 久久超碰97中文字幕| 北京美女一区二区| 欧美狠狠弄| 有码免费观看| 亚洲色悠悠久久88| 欧美亚州色的图| 婷婷丁香人妻| 国内偷拍精品一区二区| 97超碰日韩| 日韩熟女操逼| 蜜乳AV一区二区三区四| 五月丁香| 久久麻豆一区二区| 人妻人妻天天碰| 国产农村妇女毛片精品久久| 小说区 图片区色 综合区| 亚洲成人性| 99热亚洲| 大香蕉之青青草原| 一区二区三| 久久久久久亚洲中文| 女人爽到高潮潮喷18禁网站| 日本天天色| 欧美大香蕉97| 激情婷婷黑人91| 日韩av性爱在线播放| 天天色播亚洲综合网站| 91老熟女逼| 黑人精品欧美一区二区蜜桃| 美女爽到高潮91| 人人摸.人人色| 大香蕉人妻| 欧美人妻二区三区| 欧美在线中M| 日本一级特级毛片视频| 探花一区在线| 久久久久久91香蕉国产| 日日骚网站| 欧美色性爱| 欧美另类自拍| 久草在线| 欧美日本中字另类在线| 一区,二区,三区网站| 亚洲天堂电影网99999| 国产日韩精品无码去免费专区国产| 开心五月激情网| 碰超人人在线一区二区三区| 国产欧美日本亚洲精品| 素人播放一区| 97国产|免费| 插日本熟女视频| 日韩欧美被操黄免费观看| 亚洲精品97| 亚洲欧美精品一区天堂久久 | 丁香婷婷色五月| 亚洲少妇激情视频| 欧洲黄色网| 中文伊人大香蕉视频| 97视频900| 欧美探花网| 欧美精品双插| 第四色奇米影视777| 色老汉色| 欧美91精彩| 六十路日本| 一级啊性爱在线视频| 超碰成人人人爽人人爽| 黄片aaaaa一区| 欧美精品欧美精品系列 | 在线洲亚线| 91新在线欧美| 日日躁夜夜躁狠狠躁超爽| 亚洲日韩在线a不卡99精品| 色色色色电影网| 超碰地址97| 欧美视频一| 日韩乱码Av| 青草精品视频一日本久久久久网站| 精品综合久久久久久五月天| 精品熟女呻吟久久91| 大香蕉综合网| 中文字幕天天天天天| 东京热毛片调教| 久久综合激情| 亚洲无码一区成人免费午夜| 大香蕉色十月| 99久久亚洲精品无码毛片潘甜甜| 一道本东京热加勒比一区二区三区| TS人妖另类精品视频系列| 欧美综合加勒比在线| 内射老妇BBWX0C0CK| 有码色中文字幕在线观看| 99久国产精品午夜性色福利| 午夜欧美J进J出白浆流出久久久| 隔壁邻居波多野结衣中文字幕 | 久久婷婷五月天| av网站免费看| 天天色怡春院| 午夜福利精品| 欧美综合色| 后入 亚洲 美女 射| 岛国在线免费视频| 蜜臀中文无码午夜| 麻豆蜜桃视频在线观看| 激情 欧美 亚洲 小说| 亚洲怡春院| 毛片电影一区二区三区| 97超碰精品| 亚洲日韩欧美一区二区| 亚洲成熟国产精品美女| 大香蕉2017| 日本狠狠干| 久久久久人妻二区精品叶可怜| 99精品综合久久久久五月天| 欧美亚洲激情小说| 神马久久久久久久久久久久| 午夜AV人气不卡| 97资源站日韩| 91五月天| 91人人看| 黄色激情电影在线观看| 中国91AV| 韩日巨乳美女免费视频在线观看| 一区二区三区机械有限公司| 天天狂操夜夜狂日| 久久精品国产久精国产| 久久久艹艹艹| 97最新在线播放视频| 一区二区免费电影久久| 97射欧美| 亚洲 综合 第一页| 亚洲码和欧洲精品激情系列| 99欧美| 日本午夜操逼| 国产亚洲性生活视频播放| 91欧美色| 人人爽夜夜玩视频| 日欧毛片久久| 婷婷五月天AV| 亚洲一区二区精品福利| 国产99999| 亚洲中文字幕日产无码久久| 色综合91| 9色在线| 熟女突然公开看18禁影片 | 亚洲中文字幕av | 99久久婷婷国产综合精品草原| 黑人白女精品一区| 粉嫩AV一区二区夜夜| 精品妇操一区二区三区| 欧美国产有色电影| 国产熟妇一区二区| 亚洲 日韩 欧美 国产综合体| 日日碰狠狠添天天爽超| 亚洲一欧洲中文字幕在线 | 翔田千里A片一区二区| 97超碰9| 蜜臀久久99精品久久久久久成人小说| 偷拍综合亚洲| 少妇第一页| 嗯,啊。舔我逼| 嗯嗯啊啊视频一区二区三区| 色爱欲亚洲| 天天爱天天韩国日本牛牛牛牛 | 久久国产三区| 丰满欧美少妇| 人妻乱仑一区二区三区| 日韩激情中文字幕有码| 亚洲欧洲自拍图片专区满春格| 91国模| 日本色日夜干| 欧美黄页| 中文AV制服乱伦| 亚洲综合在线91| 中文字幕视频免费| 综合大香蕉美。| 精品十八在线观看| 五月天欧美色图| 久久久专区| 大香伊人在线一区| 超碰97最新人妻| 婷婷五月天网| 日本三级小说中文字幕| 大香蕉 222| 日日噜噜夜夜久久亚洲一区二区| 性九九九九九九| 嗯嗯啊啊的视频| 久久久久9| 亚洲丨在线| 亚洲情色综合| 高清无码在线播放网站| 日本高清_区二区三区 | 人人摸人人干人人拍97| xxxx网站亚洲精品| 婷婷色导航| 国产有码一区| 欧美 亚洲 综合 制服 另类| 亚洲欧洲色情高清| 国产少妇内射| 91高清欧美| 亚洲伊人久久综合97| wwwxxx日本爽| 婷婷综合激情| 欧美曰韩国产精品| 欧美日韩制服| 欧美性爱第一页久久| 亚洲导航深夜福利| 熟妇在线视频一区二区| 国产欧美日韩臀| 97一本大道亚洲一区| 91白嫩| 国产强奸乱伦xd| 久久久婷婷婷| 99热导航| 熟妇人妻精品一区二区| 亚洲一卡二卡在线免费| 欧美很很操视频| 亚洲综合888| 一本色道久久综合狠狠操| 亚欧高清| 狠狠狠狠狠| 少妇色综合| 91在线视频国产网站| 中国女人内射6XXXXX| 少妇国产不卡| 欧洲天天在线| 熟女高潮合集-永久久久-成人AV| 九九九精品美女| 福利伊人玖玖国产| 97硬碰| 久夜视频| 国产免费永久精品无码| 久久精品免费| 密臀在线视频| 超碰97色| 狠狠操狠狠插| 日韩欧美天堂| 逼操网站| 中文字幕黑人大片| 色综合 加勒比| 国产精品久久久久无码A√| 亚洲九区| 亚洲天堂少妇| 天天视频网站黄| 欧美日韩夜夜| 亚洲久久东京热一二三四五区视频| 91精品国产91久久福利| 成人综合色网| 老妇女91| 午夜国产成人福利视频| 亚洲图片 激情小说| 亚洲,日韩,欧美,成人播放| 青青国产精品在线| 熟女人妻一区二区三区| 丁香五月婷婷五月| 欲香欲色综合天天伊人| 免費黃色視頻觀看一| 九九九九热只有精品| www网站黄| 亚洲熟女乱色一区二区三区久久久| 天天做天天爱夜夜爽毛片试看| 亚洲综合成人网| 精品国产乱码久久久久久免费| 国产亚洲禁久一区二区| 日本性一区| 91深夜夜| 天天插天天操天天摸天天射天天看| 日韩黄色av中文字幕| 97久久超碰国产网站| 欧美天天干| 操少妇很爽av| AV乱伦专区| 人人妻人人色| 福利操逼| 96精品久久久| 人妻少妇久久久| 日韩一级二级三级免费看完整版| 色999人与兽| 亚洲人成网站7777| 另类综合另类| 久午视频| 精品乱子一区二区三区99| 热热色中文无码| 亚洲天堂女优在线| 操操操五月天婷婷丁香影院| 91综合国产精品| 中国AV美女| 91亚洲欧美色图| 91午夜无码| 熟女高潮精品一区二区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 91丝袜在线观看视频在线观看| 欧美日韩插逼视频| 日本久久999| 天天色播| 欧美18 在线观看| 人妻少妇久久中文| 欧洲色色| 美国aaaaa一级黄片| 欧美性性性| 青青国产在线拍揄自揄拍| 欧美东京热精品A∨| 中日韓欧美高清| 九九热精彩视频| 亚欧视频在线| 精品视频一区二区| 伊人色综合欧美| 精品四五区| 亚洲精品天堂久久A∨51成人漫| 天天摸天天操视频| 99re9这里只有精品| 丁香五月色| 久久中文字幕一区不卡| 97中文综合| 超碰 av 女人天堂| 五月婷婷性爱| 2020中文在线一区二区三区| 天天色综合影视网| 神马久久久久久久久久久久| 五月丁香六月婷| 收看日本人日bb| 亚洲人妻日日日| 韩国国产欧美情侣视频在线| 1024久久高清视频| 人妻精品一区二区在线| 性爱网站一区二区| 熟妇一区二区| 亚洲图片偷拍欧美| 日韩78m视频| 天天肏美女| 免费看黄视频亚洲网站| 99久久精品国产系列| 97国产|免费| 国产吹潮女在线观看| 啊啊啊不要啊啊受不了了视频在线| 欧日a| 免费的很黄很污的全部视频| 国产91福利小视频在线观看 | 日韩精品一区的| 91爆操视频| 91成人高清在线观看| 性91| 女生看匆91网站| 伊人久大| 亚洲永久AV无码精品秋霞| 色女99一级片在线观看| 青青欧美在线| 中文字幕日韩国产传媒欧美精品| 99热在线播放| 日本久久精品| 色噜噜精品一区二区三| 亚洲视频1区| 另类TS人妖一区二区三区| 日韩操啪| 亚洲中字幕日本一区二区三区| 国产精品乱码久久久久| 久久夜夜| 97操| 国产白丝精品在线观看| 男人午夜天堂| 亚洲欧美不卡线| а√天堂资源官网在线资源| 亚洲av性爱电影| 亚洲无码国产精品久久| 国产无码高清操逼视频| 国产精品麻豆视频网站| www.91理论| 草莓精品视频| 亚洲中文国际强奸字幕| 91在线无码精品秘 软件| 成人午夜小视频手机在线看| 在线有码中文字幕| 日欧亚洲二三区大片不卡| 国产高清MV操逼视频| 丰满人妻一区二区三区大胸懂色| 日韩乱伦视频| 大香蕉五月天婷婷| 午夜免费视频1000| 日本精品人妻少妇一区二区| 欧美老妇综合网| 激情欧美日韩女同久久| 久久久禁| 欧美色爱综合| 四方色播| 亚洲国产精品99久久久| 色色香蕉| 理论久久婷婷网 8| 久操 高清| 久久9精品网站| 亚洲风情在线观看| 豆花视频操逼网址| 国产成人网站在线观看| 粉嫩国产精品久久粉嫩| 欧美操逼视频二区| 欧美日日人人天天| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产风韵犹存熟妇三区| 床戏久久久av一区二区麻豆| 国产深夜福利| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 九九精品网| 中文字幕五月婷婷免费| www色日本| 亚洲天堂另类小说男人| 天美传媒av在线| 精品久| 性暴力欧美猛交在线直播| 国产欧美一区激情交| 亚洲男人的天堂一区二区| 另类专区加勒比| 91操熟女| 黄色欧美性爱视频| 黄呦呦在线| 亚洲性天堂| 久草网站免费在线观看| 操少妇很爽av| 美女91色黄18| 欧美日韩黄片精品在线| 99久热| 亚洲日韩少妇一道本视频| 欧美乱欲| 日韩欧美国产高清视频| 97欧美色资源| 国产精品久久久 | 免费男人的天堂| 国产成人拍国产亚洲精品| 五月色网| 后入福利视频| 天天噜| 91碰碰| 国产一区二区精品在线视频| 91网九色蝌蚪操熟女| 久久五月丁香| wuyechaopeng| 国产福利小视频高清在线观看| 1024亚洲中文字幕久在线看片你懂的| 欧美日韩人妻精品一区二区三区| 黄色视频60分钟| 日产国产精品中文久久婷婷| 91色综合| 麻豆人妻精品一区二区| 天天在线91| 欧美日韩日产免费网站看| 免费看美国人人爽,人人操| 欧美 亚洲 第一页 | 久久午夜伦| 91激情国产| 人人摸人人摸人人干| 97自拍一区| 92性色国产午夜福利在线661| 久久久久久性爱视频| 伊人操| 黑丝内射一区二区三区| 欧美伊人电影| 亚洲av无码成人精品国产| 91美女视频直播| 女人高潮大叫一级毛片| 国产精品第一页国产大屁股视频免费区i| 操逼视频色| 国产精品高潮久久AV| 超碰在线观看av不卡| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 久久大线蕉一区| 亚洲精品一区二区精品| av操操不卡| 日本韩高清无砖码22o| 人人妻人人操人人乐| 色婷婷国产精品一区在线观看| 无码99| 大香蕉人妻久久| 韩日精品四区| 亚洲啪啪综合?v一区综合精品区| 秋霞男人网| 国产精品亚洲无码| 久久精品电影| 无遮挡h肉动漫在线观看| 98超碰欧美| 超碰97玖玖爱| 老熟妇一区二区三区…| 中文字幕第23区| 亚洲精品中文字幕一区在线视频 | 网站A V在线| 精品国产乱码久久久久久久久1| 91视频精品| 亚洲天天影视综合网| 日本欧美一区二区三区免费| 91少妇通奸网站| 国产 热久久久久国产精品| 亚洲天堂另类| 99精品丰满人妻无| 亚洲综合有玛| 国产一区在线观看无码AV| 在线洲亚线| 久操高青| 在线综合色| 日本媚薬中文字幕在线| 狂操嫩妻视频一区二区三区| 岛国大片国产| 国产一区二区在线看| 天天干2019| 欧美日韩国产中文精品字幕自在自线| 青青青青青手机视频| 在线天堂999| 国产av美女被艹的乱叫| 久 久无码人妻AV| 青青草原人妻| 第一高清av中文字幕| 日韩视频中文字幕| 天天射夜夜| 色综合五月天| 亚洲一本色道中文无码aV天美| 91第一页| 少妇六月天| 亚洲第一狼人丝袜美女另类| 亚洲丝袜少妇在线| 亚洲 另类 丝袜 自拍 动漫| 五月天婷婷基地| 欧美一级久久久久久久大片动画| 91精品导航| 欧美激情色婷婷花野真衣一区二区| 亚洲综合五月天婷婷丁香| 久操凹凸视频| 97美日韩视频| 中文字幕在线第二页| 大香蕉免| 亚洲久热| 翔田千里无码中出中文字幕| 人人做天天爱| 日韩AV片| 天天躁日日躁XXXXYY| 日韩精品在线放| AV女资源| 九九玖玖精品| 久久久久久久久久久六六| 国产亚洲色婷婷久久99精品91葵花宝典| 欧美天天射| 综合网少妇| 色哟哟av| 男人的天堂在线| 成年男人的天堂| 五月天伊人| 丁香五月天视频| 亚洲欧美日韩精品久| 亚洲激情综合另类男同| 久久夜夜| 欧美一区二区三区不卡高清视频| 欧中美三级一区二区三区| 中文字幕第23区| 密臀AV在线| 成人在线视频一区| 亚洲最大的黄色电影网站。| 五月综合久久| 任你艹| 久久天堂婷婷网| www五月| 99热这里是精品| 六月激情婷婷| 激情色色| www久久99| 99久久久无码国产精品性男| 岛国片国产成人亚洲播放| 丰满高潮18xxxx| 国产精品干干干| 99精品视频在线观看免费| 日本人妻最新在线中| 日韩高清黄片| 一级人妻性爱视频|